Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Prędkość piłki

Ostatnio zmodyfikowano 2011-08-29 20:34
Autor Wiadomość
kampar
Temat założony przez niniejszego użytkownika
Prędkość piłki
» 2011-08-29 18:42:09
Witam, jestem w trakcie pisania gry Arkanoid i mam problem ze zmienianiem prędkości piłki.

Kod odpowiedzialny za pozycję piłki:
C/C++
#include <math.h>

double bufor_x = 0, bufor_y = 0;

bufor_x += sin( ball_kat * M_PI / 180 );
bufor_y -= cos( ball_kat * M_PI / 180 );

if( bufor_x >= 1.0 )
{
    ball_x++;
    bufor_x -= 1.0;
}
if( bufor_x <= - 1.0 )
{
    ball_x--;
    bufor_x += 1.0;
}
if( bufor_y <= 1.0 )
{
    ball_y--;
    bufor_y += 1.0;
}
if( bufor_y >= - 1.0 )
{
    ball_y++;
    bufor_y -= 1.0;
}

W takim wypadku wszystko działa poprawnie, ale gdy chce zmienić prędkość piłki:

C/C++
bufor_x += sin( ball_kat * M_PI / 180 ) * 2;
bufor_y -= cos( ball_kat * M_PI / 180 ) * 2;

to wtedy piłka szaleje i reaguje z dużym opóźnieniem na zmiane kąta.

Czy w podanym kodzie robię coś źle? Bo nie mogę tego wyłapać.
P-40189
imralav
» 2011-08-29 19:20:15
Jak na moje we wzorach brakuje Ci jeszcze przesunięcia jakie chcesz uzyskać.
Moja funkcja do przesuwania piłki wygląda tak:
C/C++
void CPilka::przesun( RenderWindow * okno )
{
    float deltaX, deltaY;
    deltaX = sin( alfa * M_PI / 180 ) * predkosc * okno->GetFrameTime();
    deltaY = cos( alfa * M_PI / 180 ) * predkosc * okno->GetFrameTime();
    pozycja.x += deltaX;
    pozycja.y += deltaY;
    sPilka.SetPosition( pozycja );
};

Prędkość oznacza odległość w pikselach jaką piłka ma przebyć w czasie jednej sekundy.
 
Co mają na celu te linijki:
C/C++
if( bufor_x >= 1.0 )
{
    ball_x++;
    bufor_x -= 1.0;
}
if( bufor_x <= - 1.0 )
{
    ball_x--;
    bufor_x += 1.0;
}
if( bufor_y <= 1.0 )
{
    ball_y--;
    bufor_y += 1.0;
}
if( bufor_y >= - 1.0 )
{
    ball_y++;
    bufor_y -= 1.0;
}
?
P-40190
kampar
Temat założony przez niniejszego użytkownika
» 2011-08-29 20:07:35
pozycja piłki jest typu int , a funkcje trygonometryczne zwracają wartość double i dlatego są te if'y.

Obojętnie przez jaką liczbę większą od 1 pomnożę wyniki sin i cos to zawsze piłka nie porusza się poprawnie. Jak pomnożę przez liczbę mniejszą od 1 to już wszystko jest w porządku.
P-40194
imralav
» 2011-08-29 20:19:19
To po co kombinować, zrób współrzędne piłki jako double.

Z jakiej biblioteki korzystasz?
P-40195
akwes
» 2011-08-29 20:20:09
C/C++
double z = 430.431
int a = int( z );
?

Ja polecam float. Jeżeli to SFML to nawet lepiej float bo nie ma konwersji z składnikami klas z SFML.
P-40196
imralav
» 2011-08-29 20:23:44
Jako "Ball_x" rozumiem współrzędną piłki na osi X a "bufor_x" jako jej przesunięcie wzdłuż tej osi.
Czemu więc nie zwiększasz "Ball_x" o "bufor_x"?
P-40197
kampar
Temat założony przez niniejszego użytkownika
» 2011-08-29 20:34:02
korzystam z allegro. Funkcje sin i cos zwracają maksymalną wartość 1, więc wtedy piłka poruszała się tylko w 8 kierunkach. Wyświetlam piłkę funkcją masked_blit, która pobiera zmienne typu int jako pozycję x i y.

Chociaż mógłbym zmienić współrzędne piłki na double i wtedy w funkcji masked_blit rzutować na int i wtedy by działało. Tylko nie wiem czy rozwiąże to mój problem z szybkością.
P-40198
« 1 »
  Strona 1 z 1