KeyListener - opóźnienia klawiszy

0

Wykorzystuje KeyListener do obsługi kamery w JOGLu. W KeyPressed wywołuje odpowiednie funkcje które uaktualniają położenie kamery jednak mam problem jak poradzić sobie z opóźnieniem generowanym przez KeyListenera, np. jeśli przytrzymuje klawisz 'w' odpowiedzialny za ruch, pierwszy reakcje jest natychmiastowa , potem następuje przerwa , a potem już leci z krótkimi przerwami. Działa to po prostu tak jakbyś przytrzymali klawisz jakiegokolwiek znaku choćby w tym oknie w którym pisze ten post.

0

A którą metodę nadpisujesz? keyPressed czy keyTyped?

0

Do sterowania klawiaturą używa się wyłącznie keyTyped i keyReleased. KeyPressed służy głównie do wczytywania kodów znaków alfanumerycznych, gdzie klawisze są interpretowane jako wprowadzanie tekstu. KeyPresed to zdarzenie generowane z naciśnięcia i puszczenia tego samego klawisza z uwzględnieniem klawisza shift i opóźnienia klawiatury. Są to zdarzenia wtórne będące uproszczeniami keyTyped i keyReleased, które reagują wygenerowaniem osobnego zdarzenia przy każdym naciśnięciu i puszczeniu dowolnego klawisza. Jednak te ostatnie pozwalają prawidłowo wykryć kilka wciśniętych klawiszy jednocześnie. Na przykład kolejne wciśnięcia i przytrzymania różnych klawiszy oraz ich puszczanie w dowolnej kolejności. Zdarzenie keyPressed tego nie wychwyci bo jest generowane dopiero po puszczeniu klawisza.

Krótko mówiąc przechwytujesz keyTyped i ustawiasz sobie znacznik konkretnego wciśniętego klawisza aż do momentu otrzymania zdarzenia keyReleased. Między tymi zdarzeniami to od Ciebie i Twojej aplikacji zależy czy na trzymanie klawisza należy reagować i jak często (najlepiej użyć timera lub aktywnej kontroli czasu). Ponieważ może być kilka klawiszy wciśniętych jednocześnie, to takich znaczników powinno być więcej - minimum 3, a można też zrobić mapę stanu dla wszystkich klawiszy klawiatury.

0

Już sobie poradziłem z tym problemem poprzez wprowadzenie tablicy boolean na przechowywanie stanu klawiszy - wciśnięty lub nie. Z tym, że używałem keypressed zamiast ketyped, ale teraz jak przeczytałem Twój post to dokonam zmiany. U mnie funkcja display (używam JOGLA) odpowiednio reaguje na zmianę stanu klawiszy, więc nie potrzebuję timera.

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