KeyListener - kliknięcia w tym samym momencie

0

Tutaj przykładowy kod:

 public class Controls extends KeyAdapter{

	public void keyPressed(KeyEvent e)
	{
		switch(e.getKeyCode())
		{
		case KeyEvent.VK_ENTER:
			System.out.println("Test Enter");
			break;
                case KeyEvent.VK_SHIFT:
			System.out.println("Test Shift");
			break;
		}
	}
}

Wszystko działa ok, jeśli jednak będę trzymał Enter, a potem dołączę do niego Shift konsola będzie wypisywać tylko "Test Shift".
Potrzebuję jakiegoś sposobu, aby w takiej sytuacji pisał na wykonywał na zmianę obie instrukcję.
Efekt przy trzymaniu obu przycisków powinien być taki:
Test Enter
Test Shift
Test Enter
Test Shift....

0

Skorzystaj z SHIFT_DOWN_MASK

if(ke.getModifiersEx()==KeyEvent.SHIFT_DOWN_MASK)
...
0

Nie chodzi mi konkretnie o shift. Mam grę, klasę Gracz i metody up(), right(), left() i down().
Jeśli będę trzymał klawisz w górę gracz przemieszcza się w górę, a kiedy dołożę do niego klawisz w prawo gracz porusza się w prawo nie na skos.
Wykonuje instrukcje: right(); right(); itd... a chciałbym żeby robił up(); right(); up(); right();

0

Zapamiętuj w zmiennej, że klawisz został naciśnięty.

0

Po pierwsze nie ma czegoś takiego jak "równoczesne naciśnięcie klawiszy". Wszystkie kody znaków generujące zdarzenia dotyczące klawiszy są zawsze kolejkowane, a żadna klawiatura nie wysyła stanu wszystkich swoich klawiszy na raz.
Po drugie, do używania klawiszy przez grę używa się pary metod KeyPressed i KeyReleased (i poza obsługą czata nigdy keyTyped). Każde zdarzenie przychodzące wywołuje jedną z tych metod, a metody powinny zmieniać stan wciśnięcia klawiszy, które chcesz monitorować. Wtedy Twój program może w każdej chwili zbadać stan tych klawiszy i dowiedzieć się ile i które klawisze są obecnie wciśnięte, a które zwolnione. Oznacza to właśnie tę "równoczesność". Możesz też chcieć monitorować moment w którym stan jednego z klawiszy się zmienił - wystarczy w tym celu z obu metod obsługi zdarzeń wywoływać (najlepiej asynchronicznie) jakąś metodę z Twojej gry. Dlaczego asynchronicznie? Bo najczęściej kod gry potrzebuje wtedy zrobić coś czasochłonnego, a tego w metodach obsługi zdarzeń zrobić nie wolno (system obsługi zdarzeń w real-time zostanie zatrzymany). Krótko mówiąc zamienisz zdarzenia klawiatury na jedno zdarzenie zmiany stanu tych klawiszy i jeden odczyt tego stanu. Dopiero w ten sposób gra ma szansę dowiedzieć się, że gracz wcisnął trzy lub więcej klawiszy, a może wcisnąć jeszcze kolejne lub zwolnić wciśnięte.

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