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

[Allegro] Problem z zatrzymaniem postaci

Ostatnio zmodyfikowano 2013-02-11 21:14
Autor Wiadomość
Loodwin
Temat założony przez niniejszego użytkownika
[Allegro] Problem z zatrzymaniem postaci
» 2013-02-10 18:29:37
Witam!
Zająłem się ostatnio kolizjami i chciałem zrobić, aby postać nie mogła się poruszyć w tą samą stronę, z której przybyła, gdy będzie kolizja. I wszystko działa, gdy podchodzi się z góry i od dołu, lecz gdy idzie się z lewej, albo prawej to postać zatrzymuje się i nie można nią ruszyć w jakąkolwiek stronę. Tutaj są części kodu dotyczące tylko tego, bo uważam, że bez sensu cały kod umieszczać.
C/C++
bool kolizja( int x1, int y1, int s1, int w1, int x2, int y2, int s2, int w2 )
{
    if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return true;
    else return false;
   
}; //funkcja kolizji

while( speed > 0 )
{
    myszka();
    if( !key[ KEY_RIGHT ] && canright == true ) { ludek_x--; lastmove = 1; }
    if( !key[ KEY_LEFT ] && canleft == true ) { ludek_x++; lastmove = 2; }
    if( !key[ KEY_UP ] && canup == true ) { ludek_y++; lastmove = 3; }
    if( !key[ KEY_DOWN ] && candown == true ) { ludek_y--; lastmove = 4; }
   
    if( kolizja( ludek_x, ludek_y, 40, 55, 250, 250, 60, 60 ) == false )
    { canright = true; canleft = true; canup = true; candown = true; }
    speed--;
    frame++;
    if( frame > 100 ) frame = 0;
   
} //pętla odpowiedzialna za poruszanie

if( kolizja( ludek_x, ludek_y, 40, 55, 250, 250, 60, 60 ) == true )
{
    if( lastmove == 1 ) { canright = false; }
    else if( lastmove == 2 ) { canleft = false; }
    else if( lastmove == 3 ) { canup = false; }
    else if( lastmove == 4 ) { candown = false; }
    textprintf_ex( bufor, font, 40, 40, makecol( 200, 200, 200 ), - 1, "Kolizja!" );
}

lastmove = 0; //warunek zależny od wyniku kolizji
Z góry dzięki za pomoc!
P-76109
DejaVu
» 2013-02-10 21:13:05
zanim wykonasz ruch musisz sprawdzić czy jego wykonanie jest możliwe. Jeżeli wykonasz ruch, a będzie kolizja to nie będziesz mógł z niej wyjść.
P-76115
Loodwin
Temat założony przez niniejszego użytkownika
Jest coś takiego
» 2013-02-11 11:07:20
Przecież jest coś takiego:
C/C++
if( !key[ KEY_RIGHT ] && canright == true ) { ludek_x--; lastmove = 1; }
if( !key[ KEY_LEFT ] && canleft == true ) { ludek_x++; lastmove = 2; }
if( !key[ KEY_UP ] && canup == true ) { ludek_y++; lastmove = 3; }
if( !key[ KEY_DOWN ] && candown == true ) { ludek_y--; lastmove = 4; }

Zmienne canleft,canright itd. określają czy można wykonać ruch. Np. jeśli canright ma wartość true to można wykonać ruch, a jeśli false to nie można. Tak naprawdę to nie w tym problem, bo gdy idzie się z góry i z dołu to wszystko działa, a jeśli z prawej lub z lewej to wtedy nie można się ruszyć. Napisałem o tym w poprzednim poście. Cały czas sam próbuje to rozwiązać, ale nie wiem jak.
P-76127
RazzorFlame
» 2013-02-11 17:02:45
Ahh ludzie, czy większość z was naprawde sama się nie umie wysilić? Rozumiem, gdyby to było bardziej rozbudowane, ale jestem pewien że po prostu skopiowałeś to z kursu easykodera. To nie jest rozwiązanie na twoje problemy. I czemu kiedy nie naciskasz klawisza ma on chodzic (!key[KEY_LEFT] i reszta)?
P-76156
Loodwin
Temat założony przez niniejszego użytkownika
» 2013-02-11 21:14:42
@up:
Dzięki. Czytając kurs też na początku się zdziwiłem, że jest tam "!", ale widząc to tak to myślałem, że tak ma być. Usunięcie wykrzyknika pomogło. Jeszcze raz dzięki.
P.S Tak naprawdę nie kopiowałem tylko sam pisałem, ale tak naprawdę to co tam było.
P-76181
« 1 »
  Strona 1 z 1