mystery Opublikowano 24 Czerwca 2008 Zgłoś Opublikowano 24 Czerwca 2008 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 26 Czerwca 2008 Zgłoś Opublikowano 26 Czerwca 2008 (edytowane) 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 26 Czerwca 2008 przez PelzaK Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
hary Opublikowano 27 Czerwca 2008 Zgłoś Opublikowano 27 Czerwca 2008 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 30 Czerwca 2008 Zgłoś Opublikowano 30 Czerwca 2008 (edytowane) nie wiem, natomiast mówię co widzę, wciśnij pan klawisz 'a' i obserwuj jak pojawiają się literki... Edytowane 30 Czerwca 2008 przez PelzaK Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
hary Opublikowano 30 Czerwca 2008 Zgłoś Opublikowano 30 Czerwca 2008 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. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 1 Lipca 2008 Zgłoś Opublikowano 1 Lipca 2008 no ale to nie zmienia faktu, że działanie programu wskazuje na to, jakby klawisze były przechwytywane po softłerowej obróbce :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
mystery Opublikowano 2 Lipca 2008 Zgłoś Opublikowano 2 Lipca 2008 dzięki wielkie za odpowiedzi :) pozdrawiam m Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 2 Lipca 2008 Zgłoś Opublikowano 2 Lipca 2008 (edytowane) rozumiem, że żadna nieprzydatna :D Edytowane 2 Lipca 2008 przez PelzaK Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...