[c++] przemieszczanie obiektu
Ostatnio zmodyfikowano 2013-05-22 21:42
megatron Temat założony przez niniejszego użytkownika |
[c++] przemieszczanie obiektu » 2013-05-22 18:36:13 Witam. Mam pewien problem z kodem podanym poniżej. Otóż mam coś takiego: program odlicza i w pewnych momentach wykonuje jakąś czynność. Potem po wylosowaniu liczby obiekt przesuwa się na wylosowaną pozycję. A jak dojdzie do pozycji to zegar się zeruje. Wszystko działa ale tylko po jednym losowaniu, a jak chcem, żeby powtóżył czynność to liczba się losuje, postać przesówa po osi X ale zawsze nie dochodzi do końca np. wylosowało 301 a dochodzi do 300, przez co się cała akcja przerywa, ponieważ postać nie doszła do wylosowanej pozycji. Może coś znowu sknociłem. Z góry dziękuję za pomoc. Pozdrawiam. #include "GRabbit.h"
void Game::RunRabbit() { please_wait_rabbit += 5; if( please_wait_rabbit >= 0 && please_wait_rabbit <= 100 ) { cage_on = 17; cage_off = 45; rab->setFrameLoop( cage_on, cage_off ); rabbit_doszedl = true; } if( please_wait_rabbit >= 1000 && please_wait_rabbit <= 1100 ) { zajcX = rand() %( 448 - 210 + 3 ) + 210; cage_on = 51; cage_off = 59; rab->setFrameLoop( cage_on, cage_off ); rabbit_los = false; } if( rabbit_los == false ) { if( zajcX >= rab_pos.X ) { rab_pos.X = rab_pos.X + 1; rab_rot.Y = 180; rab->setRotation( rab_rot ); } if( zajcX <= rab_pos.X ) { rab_pos.X = rab_pos.X - 1; rab_rot.Y = 0; rab->setRotation( rab_rot ); } if( rab_pos.X == zajcX ) { rabbit_doszedl = false; rabbit_los = true; } if( rabbit_doszedl == false ) { please_wait_rabbit = 0; rabbit_doszedl = true; } } rab->setPosition( rab_pos ); }
#@#EDIT#@# udało mi się to załatwić w trochę ni typowy sposób :/ zamieniłem if( rab_pos.X == zajcX ) na if(( rab_pos.X == zajcX ) ||( rab_pos.X == zajcX + 1 || rab_pos.X == zajcX - 1 ) ) |
|
DejaVu |
» 2013-05-22 21:42:42 Generalnie powinieneś pokombinować nad lepszym systemem aktualizacji pozycji. Przykład: void moveTo( int & aktualnaPozycjaX, int & aktualnaPozycjaY, int celX, int celY, int predkosc ) { aktualnaPozycjaX += aktualnaPozycjaX - celX > 0 ? - predkosc: + predkosc; aktualnaPozycjaY += aktualnaPozycjaY - celX > 0 ? - predkosc: + predkosc; if( abs( aktualnaPozycjaX - celX ) <= predkosc ) aktualnaPozycjaX = celX; if( abs( aktualnaPozycjaY - celY ) <= predkosc ) aktualnaPozycjaY = celY; }
Wówczas każde przemieszczenie wykonujesz za pomocą wspomnianej funkcji: moveTo( obiekt.x, obiekt.y, obiekt.cel.x, obiekt.cel.y, 5 );
i zawsze masz gwarancję, że dotarłeś do celu: if( obiekt.czyDotarlDoCelu() ) { } gdzie: bool CObiekt::czyDotarlDoCelu() const { return x == cel.x && y == cel.y; } |
|
« 1 » |