"Bug" ze sterowaniem snake

0

Witajcie. Piszę grę snake w javie. Gdy snake idzie np. w dół, kliknę strzałkę w lewo albo prawo i prawie jednocześnie w górę to tak jakby wchodził na siebie, cofał, nie skręca tylko kończy grę. Albo gdy idzie w lewo, kliknę strzałkę w górę albo dół i prawie jednocześnie w prawo. Tak samo z innych stron. Jak naprawić ten "bug"?

Klasa Snake (główna): http://pastebin.com/0GQzAfmD
Klasa Ruch: http://pastebin.com/SfCjezZU
Klasa Random: http://pastebin.com/ZXUtgdxb
Klasa Gra: http://pastebin.com/4xWq73C4

0

Udostępnij jeszcze obrazki.

2

Robisz to tak, że w każdym ticku gry jest sprawdzane wciśnięcie każdego klawisza, jeśli wciśniej poprawny to jest zmieniany kierunek, ale wąż nie jest przesuwany. Przez to możesz zmienić kierunek na niepoprawny pośrednicząc przez poprawny w jednym ticku gry przed poruszeniem wężem.
Wystarczy, że zamiast ifów sprawdzających czy klawisz jest wciśnięty dasz else ify, wtedy będziesz pewny, że w jednym ticku zostanie wykonane tylko jedno obrócenie się węża.

0

@bogdans
Po co ci obrazki? Nie są ci potrzebne. Możesz również sprawdzić kod bez obrazków.

@Sopelek
Nawet gdy else ify są to też tak samo jest.

1

Dobra teraz widzę, bo klawisze obsługujesz poza główną pętlą programu.
Stwórz zmienną, która będzie oznaczać czy wykonano już ruch w aktualnym kierunku i w funkcji sprawdzającej stan klawiszy nie bierz pod uwagę opcji kolejnej zmiany kierunku dopóki nie nastąpi ruch.

0

Mam problem z tym. Jak to będzie wyglądać?

0

Czy ktoś pomoże?

0

Udostępnij obrazki, albo chociaż powiedz jaki maja rozmiar.

1

Ja choć kodu nie śledziłem (i pewnie do końca bym go nie zrozumiał) to zakładam, że problemem jest obsługa wszystkich wciśniętych klawiszy, zamiast tylko jednego, pomiędzy danymi klatkami;

Nie wiem za bardzo jak wygląda buforowanie klawiszy w Javie, jednak rozwiązaniem będzie obsługa jednego (pierwszego lub ostatniego w buforze), po czym bufor powinien zostać wyczyszczony (jeśli takie coś się stosuje w Javie); Dzięki temu pomiędzy danymi klatkami, wąż będzie mógł skręcić tylko raz i w jednym kierunku;

Niestety kodu nie podam, bo nie programuję w Javie - chodzi mi o samo założenie, które pomogą Ci zaimplementować użytkownicy, znający Javę w wystarczającym stopniu;

Spróbuj zrobić tak:

  1. w każdej iteracji głównej pętli gry:
  2. pobierz z bufora jeden klawisz,
  3. wyczyść bufor klawiatury (?),
  4. rozpoznaj nowy kierunek węża na podstawie pobranego z bufora klawisza:
  5. jeśli kierunek jest ten sam co aktualny lub jemu przeciwny - zignoruj jego obsługę "skęcania",
  6. zaktualizuj dane węża (nowy kierunek, nowa pozycja itd.),
  7. wykonaj wszystkie dodatkowe operacje (np. obsługę walnięcia w barierkę, zjedzenia owoca itd.),
  8. jeśli wąż nie przywalił w barierkę - narysuj na ekranie nową klatkę;
    To ogólny algorytm poruszania się węża.
0

Dziwnie mi wygląda implementacja keyPressed(KeyEvent e) z tymi wszystkimi flagami w ifach. Dodaj logowanie do każdego eventu i sprawdź dokładnie jaki jest przepływ.

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