Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Sprawdzanie czy został wciśnięty przycisk (konsola)

Ostatnio zmodyfikowano 2013-12-24 12:02
Autor Wiadomość
noob643
Temat założony przez niniejszego użytkownika
[C++] Sprawdzanie czy został wciśnięty przycisk (konsola)
» 2013-12-23 22:48:16
Witam!!

Pisze sobie konsolowego snake. I tak, zrobiłem już że mogę chodzić punktem po mapie strzałkami i program się przerywa jak udeżę w przeszkode.
oraz udało mi się zrobić że idzie automatycznie w jakims kierunku, ale nie mogę zrobić tak, że jak wcisnę klawisz to zmieni kierunek.
Kiedy do chodzi to operacji pobrania znaku to się zatrzymuje.
Jak takie coś osiągnąć.
Jedyne co mi przychodzi do głowy, użycie czegoś takiego jak przerwania co są w mikroprocesorach, ale nie wiem czy są takie jak pisze sobie takie coś w konsoli.
Prosze o pomoc.
P-100017
SeaMonster131
» 2013-12-23 22:56:15
Do pobierania znaku użyj bodajże kbhit().
P-100018
noob643
Temat założony przez niniejszego użytkownika
» 2013-12-23 23:22:57
Sprawdziłem sobie to kbhit()

i mam to zrobić tak??
C/C++
if( kbhit() )
     kierunek = getch();
ponieważ zwraca true jak jest coś w buforze

I propo bufora jak w programie nie mam np. żadnego cin, get itp.
i mimo to uderzam w klawiaturę to wysyłam dane do bufora wejściowego??

i jeszcze jedno, bo jak naciskam klawisz, to tak jakby na chwile przystopowywało,
czy to jest spowodowane tym że ta funkcja tak długo działa??
P-100019
pekfos
» 2013-12-24 11:53:36
I propo bufora jak w programie nie mam np. żadnego cin, get itp.
i mimo to uderzam w klawiaturę to wysyłam dane do bufora wejściowego??
Tak.

i jeszcze jedno, bo jak naciskam klawisz, to tak jakby na chwile przystopowywało,
czy to jest spowodowane tym że ta funkcja tak długo działa??
Raczej nie.
P-100026
DejaVu
» 2013-12-24 12:02:33
Funkcja działa szybko, bo w zasadzie jej rola sprowadza się do odczytania zawartości 'zbuforowanych' znaków. Szybkość przetwarzania znaków za pomocą 'getch()' jest zależna od architektury Windowsa. Generalnie chodzi o to, że komunikat WM_CHAR/WM_KEYDOWN trafia do kolejki komunikatów okna w momencie jego wciśnięcia, a później jest on co kilkadziesiąt milisekund powtarzany, jeżeli przycisk jest nadal wciśnięty. Częstotliwość powtarzania tych komunikatów jest zależna od ustawień systemowych klawiatury (gdzie można ustawić jak szybko klawiatura ma reagować na długo wciskane klawisze). Jak dobrze poznasz WinAPI to zrozumiesz o co chodzi z pętlą komunikatów oraz z komunikatami WM_CHAR/WM_KEYDOWN. Na chwilę obecną po prostu przyjmij, że ta funkcja zwraca ostatnio wciśnięty znak, który jeszcze nie został przetworzony, a nie aktualny stan wciśniętego klawisza.

http://msdn.microsoft.com​/en-us/library/windows/desktop​/ms646280(v=vs.85).aspx

/edit:
Co do strzałek:
W chwili wciśnięcia klawisza należy odczytać dwa znaki za pomocą getch(), a nie jeden, ponieważ strzałka wysyła dwa kody znaków do bufora (to samo dotyczy również innych klawiszy funkcyjnych, np. F1).

Wklej sobie kod programu z poniższego rozdziału i sprawdź jakie kody znaków przychodzą Ci w chwili wciśnięcia dowolnego klawisza. Sądzę, że to będzie rozwiązaniem Twojego problemu.

http://cpp0x.pl/kursy/Kurs-C++​/Obsluga-klawiatury-za-pomoca-c​onio-h​/320
P-100029
« 1 »
  Strona 1 z 1