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

[c++] przemieszczanie obiektu

Ostatnio zmodyfikowano 2013-05-22 21:42
Autor Wiadomość
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.   

C/C++
#include "GRabbit.h"

void Game::RunRabbit()
{
    please_wait_rabbit += 5;
   
    /// je trawe
    if( please_wait_rabbit >= 0 && please_wait_rabbit <= 100 )
    {
        /// klatki animacji
        cage_on = 17;
        cage_off = 45;
        rab->setFrameLoop( cage_on, cage_off );
        rabbit_doszedl = true;
    }
    /// losuje pozycje
    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;
    }
   
    /// przemieszczanie sie
    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 );
        }
        /// sprawdza czy zajac doszedl do wylosowanej pozycji
        if( rab_pos.X == zajcX )
        {
            rabbit_doszedl = false;
            rabbit_los = true;
        }
        /// zeruje czas
        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 ) )
P-83612
DejaVu
» 2013-05-22 21:42:42
Generalnie powinieneś pokombinować nad lepszym systemem aktualizacji pozycji. Przykład:
C/C++
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:
C/C++
moveTo( obiekt.x, obiekt.y, obiekt.cel.x, obiekt.cel.y, 5 );
i zawsze masz gwarancję, że dotarłeś do celu:
C/C++
if( obiekt.czyDotarlDoCelu() )
{
    //np. losuj nową pozycję
}
gdzie:
C/C++
bool CObiekt::czyDotarlDoCelu() const
{
    return x == cel.x && y == cel.y;
}
P-83624
« 1 »
  Strona 1 z 1