Skocz do zawartości
mystery

[java]reakcja Na Klawisze

Rekomendowane odpowiedzi

Witam

 

Robię grę BomberMan w wersji sieciowej (na zaliczenie projektu). Piszę w javie. Mam już całą komunikację z serwerm, interfejs. Próbuję rozwiązać problem związany z klawiszami. Postaram się nakreślić w miarę jasno sytuację.

Uruchamiam sobie 2 klientów, wybieram dla nich kolor (w zależności od koloru, gracz trafia na inną pozycję na mapie). Problem polega na tym, że jak wcisnę i przytrzymam dajmy na to strzałkę, by iść do góry to po mojej stronie ludzik od razu płynnie idzie, po stronie drugiego klienta, mój wirtualny obraz w momencie naciśnięcia wykonuje jeden ruch do przodu, potem stoi sekundę, a następnie porusza się do gory dalej. W funkcji keyPressed() określone są zasady zachowania na naciśnięcie guzika. Jest tam też wysyłanie komunikatu do serwera. Zauważyłem, że jeżeli przytrzymam wciśnięty jakiś przycisk ruchu, to działa to tak jak opisałem wyżej. Wysyłany jest 1 komunikat, potem nic przez jakąś sekundę, a potem wysyłane one są w sposób ciągły aż do zwolnienia przycisku na klawiaturze. Głowię się nad tym już spory kawał czasu i nie potrafię roztrzygnąć dlaczego tak.

Dołączam fragmenty kodu jednej z klas, odpowadające za reakcję na wciśnięty klawisz

 

public void keyPressed(KeyEvent e) {		switch (e.getKeyCode()) {		case KeyEvent.VK_UP:			up = true;			down = false;			left = false;			right = false;			out.println("up " + playerSpeed);  //wysłanie wiadomości do serwera			break;		case KeyEvent.VK_LEFT:			left = true;			up = false;			down = false;			right = false;			out.println("left " + playerSpeed);  //wysłanie wiadomości do serwera			break;		case KeyEvent.VK_RIGHT:			right = true;			up = false;			left = false;			down = false;			out.println("right " + playerSpeed);  //wysłanie wiadomości do serwera			break;		case KeyEvent.VK_DOWN:			down = true;			up = false;			left = false;			right = false;			out.println("down " + playerSpeed);  //wysłanie wiadomości do serwera			break;		case KeyEvent.VK_SPACE:			if(usedBombs<countBomb){				bomb();											}			break;		}		updateSpeed();	}

public void keyReleased(KeyEvent e) {		switch (e.getKeyCode()) {		case KeyEvent.VK_DOWN:			down = false;			break;		case KeyEvent.VK_UP:			up = false;			break;		case KeyEvent.VK_LEFT:			left = false;			break;		case KeyEvent.VK_RIGHT:			right = false;			break;		}		updateSpeed();	}

protected void updateSpeed() {		vx = 0;		vy = 0;		if (down)			vy = playerSpeed;		if (up)			vy = -playerSpeed;		if (left)			vx = -playerSpeed;		if (right)			vx = playerSpeed;	}

W funkcji act() dodawane są do zmiennych położenia (x i y) wartości chwilowego przesunięcią (vx i vy).

 

pozdrawiam

m

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

mnie to wygląda na to, jak w windowsie powiedzmy odczytywane jest wciśnięcie klawisza. Wciskasz, pojawia się literka, po chwili literka jest autopowtarzana. Jeśli tak jest, to mechanizm nie powinien reagować na zdarzenia keypressed czy coś podobnego, tylko w pętli gry powinnien być sprawdzany stan klawiszy - czyli to nie klawisz powinien wyzwalać workflow, tylko odczyt klawiszy powinien być elementem workflołu (kurde ale słowo :D ) pętli gry

Edytowane przez PelzaK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A jesteś pewien, że tak to działa w windowsie? Bo w sumie, to klawiatura nie wysyła "stanu" klawisza, tylko powtarza wysyłanie, transmisja odbywa się w podobnym stylu jak RS232, czyli trzymając na przykład "r" przez jakiś czas, klawiatura nada go kilkukrotnie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No ale ja wiem (jak jest rozwiązane działanie klawiatury). A propos tego co piszesz - programowo to pewnie jest rozwiązane tak, że system po pierwszej literce nie odbiera kilku znaków o tym samym kodzie (dlatego pierwsze opóźnienie) i dalej już leci. A prędkość powtarzania z klawiatury już ustawiana jest sprzętowo.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...