Jak ograniczyć wejście z klawiatury do l"udzkiej normy"?

0

Cześć. Uzywam LWJGL i jest tam klasa która obsługuje wejście z klawiatury.

public void poll(){
		if (Keyboard.isKeyDown(Keyboard.KEY_UP)){
			currentButton.shiftLeft();
		}
		if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)){
			currentButton.shiftRight();
		}
	} 

Ale jest jeden problem. Mianowicie kiedy naciskam na guzik przez mniej niż pół sekundy, ta funkcja została już uruchomiona ok 30 razy, czyli przejechałem menu od początku do końca 8 razy ułamku sekundy. Domyślam się że rozwiązaniem jest jest funkcja keyPressed() która zwraca true dopiero wtedy kiedy klawisz zostanie puszczony, ale niestety nie ma jej w implementacji Keyboard.

EDIT: Próbowałem czegoś takiego i przed chwilą znalazłem dokładnie taki sam kawałek kodu, który powinien działać, jednak nie działa u mnie:

 	public void poll(){
		Keyboard.next(); //prawdopodobnie dlatego, ale nie moge tutaj wstawic loopa bo mi będzie gra lagować.
		if(Keyboard.getEventKeyState()){
			if (Keyboard.getEventCharacter() == Keyboard.KEY_UP)
				currentButton.shiftLeft();

			if (Keyboard.getEventCharacter() == Keyboard.KEY_DOWN)
				currentButton.shiftRight();
		}
	}
0

Możesz poczekać na zwolnienie przycisku ;p

public void poll(){
                if (Keyboard.isKeyDown(Keyboard.KEY_UP)){
                        currentButton.shiftLeft();
                        while( Keyboard.isKeyDown(Keyboard.KEY_UP) ) ;
                }
                if (Keyboard.isKeyDown(Keyboard.KEY_DOWN)){
                        currentButton.shiftRight();
                        while( Keyboard.isKeyDown(Keyboard.KEY_DOWN) ) ;
                }
        }
0

To spowoduje że jak będę trzymał guzik cała animacja w tle się zatrzyma, a tego nie chcę. Ale może pokombinuję z jakimiś zmiennymi. Nie ma żadnego "ładniejszego" rozwiązania?

1

Ja to widzę tak:

czas = System.currentTimeMillis(); // najlepiej zainicjować to gdzieś jeszcze przed całym gameloopem
(...)
if(System.currentTimeMillis() - czas >= 200 ){
poll();
czas = System.currentTimeMillis();
}

0

Super! Że też nie pomyślałem.

EDIT:Tak właściwie to twoje rozwiązanie i tak nie działało za dobrze. System niekiedy zapominał kliknięcia, a przy buforowaniu nadrabiał je za każdym pollem. Na szczęście znalazłem lepszy sposób. Metody których używają będą zwracać że klawisz został naciśnięty non stop. Ale klawisz puszczony zwracany jest tylko raz.

 public void poll(){
		if (Keyboard.next()&& !Keyboard.getEventKeyState()){
			if (Keyboard.getEventKey() == Keyboard.KEY_UP)
				currentButton.shiftLeft();

			if (Keyboard.getEventKey() == Keyboard.KEY_DOWN)
				currentButton.shiftRight();
		}
	}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.