Prędkość piłki
Ostatnio zmodyfikowano 2011-08-29 20:34
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:
#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:
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ć. |
|
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: 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: 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; }
? |
|
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. |
|
imralav |
» 2011-08-29 20:19:19 To po co kombinować, zrób współrzędne piłki jako double.
Z jakiej biblioteki korzystasz? |
|
akwes |
» 2011-08-29 20:20:09 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. |
|
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"? |
|
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ą. |
|
« 1 » |