Pseudo-lag + obsługa klawiatury

0

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 :)

0

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.

0

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ę ;)

0

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.

0

Dzieki wielkie! :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1