Witam wszystkich :)
Piszę na zaliczenie grę Arkanoid i wszystko idzie w miarę prosto, ale nie mogę rozwiązać następującego problemu. Jak wiadomo w grze Arkanoid sterujemy klockiem, który znajduje się na dole ekranu i od którego odbija się kulka (lub kulki), które zbijają umieszczone wyżej cegiełki. Niestety mój klocek działa w następujący sposób:
naciskam strzełkę w prawo -> klocek przesuwa się o jedną jednostkę w prawo -> klocek zatrzymuje się na krótką chwilę (???) -> klocek przesuwa się w prawo ruchem jednostajnym...
No i problem w tym, że ten nasz klocek staje na tą krótką chwilę. Myślę że ten pseudo-lag ma coś wspólnego z obsługą klawiatury, bo przecież: otwórzmy sobie choćby Windowsowy Notatnik i wciśnijmy (nie puszczając) na przykład klawisz 'a': najpierw zostanie wydrukowany jeden znak 'a', następnie program poczeka, po czym już w sposób ciągły wydrukuje cały ciąg znaków 'aaaaaaaaaaa'.
W jaki sposób ten problem ominąć w Javie?
Dzięki za wszystkie wskazówki, pozdrawiam Wszystkich :)
Twoje przypuszczenia są słuszne. Musisz po pierwszym nacisnieciu (i nie puszczeniu) klawisza uruchomic petle (moze w oddzielnym watku), ktora bedzie przesuwac klocek, a po puszczeniu klawisza wychodzic z niej.
Innymi slowy: tworzysz sobie jakas zmienna bool okreslajaca, czy jest nacisniety dany klawisz i w zaleznosci od tego przesuwasz lub nie klocek w jakiejs petli.
Czy jest to jedyna możliwość? Zastanawia mnie czy nie ma jakiejś funkcji z biblioteki, która by ustawiała w ten sposób zdarzenia klawiatury. Być może jest, ale Java API nic mi o tym nie mówi ;)
W każdym razie dzięki za wskazówkę ;)
W oddzielnym wątku? Od kiedy takie poszczególne elementy gry wykonuje się w różnych wątkach?
Gra Arkanoid jest pętlą, jesli wrzucisz w tę pętlę inną pętlę ktora przesuwa klocek o X pixeli, to reszta elementów przestanie sie obliczać/renderować aż pętla przesuwająca się zakończy. Operowanie na obiekcie Klocek z innego wątku też nie jest dobrym pomysłem, musiałbyś zadbać o synhronizację, jakiegoś locka,zreszta... w ogóle to jest very BAD idea.
pseudokod
GameLoop
{
int32 iterations_counter=0;
bool can_enter_fast_move_sequence=false;
while(!exit)
{
//jakis tam podglad zdarzen klawiatury i dalej
if(strzalka_w_prawo)
{
if(iterations_counter==0 && can_enter_fast_move_sequence==false)
{
zmiana pozycji klocka
iterations_counter=20
can_enter_fast_move_sequence=true
}else
if(iterations_counter==0 && can_enter_fast_move_sequence=true)
{
zmiana pozycji klocka
}
if(iterations_counter>0) iterations_counter--;
}else
if(!strzalka_w_prawo)
{
can_enter_speed_move_sequence=false;
iterations_counter=0;
}
}
}
Obrazowo, masz pętle gry i podglad zdarzen.
1. wciskasz strzalke w prawo
iterations counter zmienia sie na 20
przesuwasz klocek
zmienna bool na true;
2. i zaraz puszczasz
zmienna bool na false;
iterations_counter=0
1. wciskasz strzalke i trzymasz.
iterations_counter na 20;
pierwsze przesuniecie
bool na true
kolejne sprawdzenie warunkow
dwa pierwsze ify nie puszczaja wiec czekamy az iterations_counter zleci do zera
i wtedy
if(iterations_counter==0 && enter_speed_move_sequence=true)
{
zmiana pozycji klocka
}
ciagle przesuniecie klocka.
Totalnie pisane z głowy, ale chciałem pokazać tylko zamysł,
Nie wplatuj w tę prostą grę wielowątkowości, bo to suicide.
Dzieki wielkie! :-)