2012-12-06 20 views
10

wiem, że można słuchać naciśnięciu przycisku w dół i wydarzeń z rzutki, takich jak:Jak słuchać naciśnięcia klawisza powtarzalnie w Dart dla gier?

var el = query('#el'); 
el.on.keyDown.add((e) {}); 

Ale tu problem jest to, że odpala tylko raz. Chcę powtórzenia.

Próbowałem zamiast tego keyPress, ale ma ono niewielkie opóźnienie przed powtórzeniem. Pracuję nad grą i chcę, aby była uruchamiana natychmiast i powtarzalnie.

Odpowiedz

24

Przede wszystkim nie słuchaj zdarzeń keyPress, ponieważ "opóźnienie początkowe" zależy od konfiguracji systemu operacyjnego! W rzeczywistości zdarzenie keyPress może nawet nie wystrzeliwać w sposób powtarzalny.

Co musisz zrobić, to posłuchać zdarzeń keyDown i keyUp. Możesz pomóc w tym.

class Keyboard { 
    HashMap<int, int> _keys = new HashMap<int, int>(); 

    Keyboard() { 
    window.onKeyDown.listen((KeyboardEvent e) { 
     // If the key is not set yet, set it with a timestamp. 
     if (!_keys.containsKey(e.keyCode)) 
     _keys[e.keyCode] = e.timeStamp; 
    }); 

    window.onKeyUp.listen((KeyboardEvent e) { 
     _keys.remove(e.keyCode); 
    }); 
    } 

    /** 
    * Check if the given key code is pressed. You should use the [KeyCode] class. 
    */ 
    isPressed(int keyCode) => _keys.containsKey(keyCode); 
} 

Następnie w zależności od tego, co robisz w grze, prawdopodobnie masz „pętlę gra” pewnego rodzaju, w swojej metodzie update() że jest wywoływana w każdy raz na jakiś czas:

class Game { 
    Keyboard keyboard; 

    Game() { 
    keyboard = new Keyboard(); 

    window.requestAnimationFrame(update); 
    } 

    update(e) { 
    if (keyboard.isPressed(KeyCode.A)) 
     print('A is pressed!'); 

    window.requestAnimationFrame(update); 
    } 
} 

Teraz twoja pętla gry sprawdza powtarzalnie dla klawisza A naciskając klawisz.

+0

Może zajść potrzeba wyczyszczenia wszystkich naciśnięć klawiszy po pętli gry. Zobacz także https://github.com/sethladd/bad-aliens-dart, które zdaję sobie sprawę, teraz prawdopodobnie muszę zaktualizować :) –

+0

Napisałem artykuł o obsłudze klawiatury dla gier w Dart: http://dartgamedevs.org/blog/2012/12/11/keyboard-input/ – Cutch

+0

@ Przywróć link. Prawdopodobnie to: https://github.com/dartgamedevs/dartgamedevs.org/blob/master/source/_posts/2012-12-11-keyboard-input.markdown – Amsakanna

Powiązane problemy