Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jak odczytać zdarzenie keypress (keydown) bez przerwy
clameur
post 24.03.2014, 20:35:57
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 23.07.2013

Ostrzeżenie: (0%)
-----


Witam, mam taki problem.

Ma taki fragment kodu:

  1. $(document).keydown(function(e)
  2.  
  3. {
  4. if (e.keyCode==37){
  5. // zrob cookolwiek
  6. }
  7. }
  8.  
  9. );


Powyższy kod działa tak, że jak naciskam szczalkę w lewo to się wykonuje coś, również jak ją prztrzymam. Mój problem polega na tym, że jak trzymam strzałkę w lewo, ciągle się wykonuje kod, i jak w trakcie trzymania tej strzalki nacisnę coś innego to już ten kod się nie wykonuje.

Aby to prościej zobrazować chce uzyskać efekt chodzenia i skakania w grze, że trzymam strzałkę chodzenia cały czas, i w między czasie mogę podskoczyć ale aby nie przestawać iść. Jak to wykonać ? Próbowałem przez keypress ale działa tak samo jak keydown (przynajmniej ja nie widzę różnicy. Jak rozwiązać mój problem ? Jakieś pomysły ?
Go to the top of the page
+Quote Post
Crozin
post 24.03.2014, 21:58:57
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Źle zabrałeś się do problemu. Nie możesz wykonywać akcji w momencie wciśnięcia przycisku. W takim przypadku prędkość poruszania się gracza byłaby uzależniona od tego, jak często system operacyjny ponawia zdarzenie "keydown"/"keypress".

Powinieneś nasłuchiwać na zdarzenia keydown oraz keyup i w obu kolejno zapisywać informację o wciśnięciu przycisku w jakiejś tablicy/obiekcie i usunięciu jej. Na tym powinna zakończyć się rola tego fragmentu programu. Samo wykonywanie logiki gry powinno zostać przeniesione do tzw. głównej pętli, gdzie będziesz aktualizował stan gry (np. pozycja gracza) i aktualizował interfejs w przypadku konieczności. Sama pętla powinna wykonywać się:
1) Ze stałą prędkością, np. 60 FPS
2) Tak szybko jak to tylko możliwe (uwzględniając faktyczny czas wykonania pojedynczej iteracji), ale nie szybciej niż X FPS-ów (nie ma sensu katować komputera 1500 FPS-ami przy prostej grze).
3) Jeżeli gra nie potrzebuje aktualizować swój stan jedynie w przypadku jakiś zdarzeń od użytkownika, w obu listenerach na ich końcu możesz wywołać funkcję odświeżającą grę.

Przykład: http://jsfiddle.net/adqcL/ (z wykorzystaniem jQuery)
[JAVASCRIPT] pobierz, plaintext
  1. var keyMap = {};
  2. var cnt = 1;
  3.  
  4. $(window).on("keydown", function(e) {
  5. keyMap[e.keyCode] = true;
  6. });
  7.  
  8. $(window).on("keyup", function(e) {
  9. delete keyMap[e.keyCode];
  10. });
  11.  
  12. window.setInterval(function() {
  13. $("<p />").text(cnt + ": " + window.JSON.stringify(keyMap)).prependTo(window.document.body);
  14. cnt++;
  15. }, 500);
[JAVASCRIPT] pobierz, plaintext


Ten post edytował Crozin 24.03.2014, 21:59:14
Go to the top of the page
+Quote Post
clameur
post 25.03.2014, 22:53:14
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 23.07.2013

Ostrzeżenie: (0%)
-----


Kurczę, wielkie dzięki za pomoc wink.gif Nie sądziłem, że tak prosto można to rozwiązać wink.gif Kontynuuje swoją grę, gdybym miał dalej jakieś problemy już wiem gdzie szukać pomocy wink.gif Jeszcze raz wielkie dzięki za pomoc smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 12.06.2025 - 21:44