Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak odczytać zdarzenie keypress (keydown) bez przerwy
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
clameur
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 ?
Crozin
Ź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
clameur
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.