• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Gra ASCII błąd poruszania się przy użyciu getch() i switcha

Object Storage Arubacloud
0 głosów
330 wizyt
pytanie zadane 6 września 2016 w C i C++ przez Pesio Użytkownik (760 p.)

Hej, tworzę małymi kroczkami grę w konsoli i mam problem z poruszaniem się postacią gracza, które oparłem na getch() i switchu.

Gdy nie zacznę się jeszcze poruszać postacią i wcisnę klawisz do którego nie jest przypisana żadna komenda ruchu, np " j " to nie ma żadnego problemu. Jednak gdy poruszę się ( klawisze w, a, s, d) i następnie wcisnę klawisz nie odpowiedzialny za ruch, np to " j ", lub każdy inny z klawiatury, to postać będzie dalej poruszać się w kierunku który wyznaczał poprzednio wciśnięty klawisz ruchu. Identyczna sytuacja jest gdy wcisnę przyciski " o " lub " c " które odpowiadają za odpowiednie komendy. Np. Po wykonaniu komendy open door pod " o " postać przechodzi wyżej, bo np. wcześniej został wciśnięty przycisk " w ". Jest to strasznie irytujące.

W czym leży problem i jak się tego pozbyć? Próbowałem użyć funkcji cin.ignore, cin.clear, cin.syns, fflush(stdin) ale nie pomogło, albo źle je implementuje, albo to coś innego...

Cały dotychczasowy kod gry: http://pastebin.com/1qhQKLKm

Odizolowany kod odpowiedzialny za poruszanie się: http://pastebin.com/Tdc8MGgU  (tutaj dodatkowo pojawia się błąd jak od razu wciśniemy klawisz nie odpowiedzialny za ruch)

 

 

 

 

2 odpowiedzi

+1 głos
odpowiedź 6 września 2016 przez MetRiko Nałogowiec (37,110 p.)
wybrane 6 września 2016 przez Pesio
 
Najlepsza

Myślę, że problem samego poruszania naprawisz jeżeli po przesunięciu gracza ustawisz wartości: DelataX i DeltaY na 0.
Przy następnym obejściu pętli.. jeżeli DeltaX i DeltaY będą równe zero to gracz nie zmieni pozycji. Podejrzewam, że drugi problem również można rozwiązać w podobny sposób (śpieszy mi się i nie mam czasu by analizować cały kod).

komentarz 6 września 2016 przez Pesio Użytkownik (760 p.)
Przyrównałem DeltaX i DeltaY do 0 przy ich deklaracji, teraz działa, eliminuje to wszystkie błędy. Tyle męczenia się i czytaniu o czyszczeniu buforów, a nie pomyślałem o wyzerowaniu delt...

Dzięki za pomoc ( już drugi raz).
0 głosów
odpowiedź 6 września 2016 przez niezalogowany
edycja 6 września 2016

Musisz w każdym przypadku case i default dać:
 

 nDeltaX = 0;
nDeltaY = 0;

 

Inaczej będą brane wartości z wybranych przedtem przypadków dla 'w'/'a'/'s'/'d';

Podobne pytania

0 głosów
1 odpowiedź 504 wizyt
0 głosów
1 odpowiedź 666 wizyt
0 głosów
1 odpowiedź 2,200 wizyt
pytanie zadane 25 września 2015 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...