Witam.
Piszę sobie prostą grę RPG w Bibliotece SDL C++.
Mam już napisane poruszanie mapą (ludzik stoi na środku, a rusza się mapą). Ludzik poruszał się tak długo, aż nie puściłem klawisza. Poruszał się o 2px. Chcę zrobić poruszanie się o jedną kratkę. Koncept miałem taki: poruszam sobie normalnie mapą o 2px, a w momencie puszczenia klawisza program oblicza odległość pozostałą do pełnej kratki i przesuwa o te piksele bez trzymania przycisku.
Zrobiłem już to prawie, ale mam pewien problem.
else if((!keystate[SDLK_RCTRL]) && (keystate[SDLK_LEFT]))
{
map_position.x++;
map_position.x++;
frame++;
frame++;
frame++;
if( frame > 40) frame=0;
if( frame<20) { players_frame = 9;}
else if( frame>=20 && frame<40) { players_frame = 10; }
player_dir=4;
keyleft1 = true; // Ustawia zmienną która przechowuje informacje czy strzałka w lewo była wciśnięta
tilpos_x=position_x;
}
else if ((player_dir == 4) && (!keystate[SDLK_LEFT]) && (collision[til_position_y][til_position_x-2] == 0))
{
keyleft = true;
if (keyleft2 == true)
{
tilpos_x1=tilpos_x-32;
}
if (keyleft1 == true) // Sprawdza czy strzałka w lewo była wciśnięta
{
if (keyleft == true)
{
if (position_x-tilpos_x1 != 0) // Oblicza odległość do następnej kratki
{
map_position.x++;
map_position.x++;
frame++;
frame++;
frame++;
if( frame > 40) frame=0;
if( frame<20) { players_frame = 5; }
else if( frame>=20 && frame<40) { players_frame = 6; }
keyleft2=false; // I to mój problem, o tym niżej w poście.
}
}
}
players_frame = 4;
}
Więc w komentarzach napisane jest co do czego służy. Podczas wciskania przycisku zmienna keyleft1 zmienia się na TRUE, po czym odczytywana jest w innym warunku (przycisk NIE jest wciśnięty), po czym odlicza odległość pozostałą do przebycia i przesuwa o tyle ludzika. Wszystko działa perfekcyjnie, ale tylko jeden raz. Ludzik ładnie przechodzi o 1 kratkę, a jak próbuję następną to nie zatrzymuje się już wcale. Przypuszczam że jest to związane z tym, że zmienianie zmiennej keyleft na FALSE znajduje się w złym miejscu.
Ktoś wie może jak rozwiązać ten problem?