Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak odczytać zdarzenie keypress (keydown) bez przerwy
clameur
post
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
 
Start new topic
Odpowiedzi
Crozin
post
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

Posty w temacie


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

 



RSS Aktualny czas: 16.10.2025 - 09:16