2016-04-12 13 views
0

Ich versuche, einfaches Spiel in Python und PyQt4 zu schreiben. Es ist ein einfaches Plattformspiel und ich möchte den "Sprung" -Taster während des "move" -Tasters betätigen.Wie wird ein kurzer Tastendruck in der gleichen Zeit ausgeführt, wenn ein langer Tastendruck ausgeführt wird?

Es ist wie ich right arrow Schlüssel bin halten und in der gleichen Zeit Ich drücke z (oder einfach eine beliebige Taste, kann Verschiebung, ctrl, cmd, alt sein), und ich möchte nach rechts bewegen, um fortzufahren und in der Gleichzeitiges Ausführen von Jump.

Wenn ich keyPressEvent benutze funktioniert es gut mit langen "move" Tastendruck, aber jeder "Sprung" -Taster bricht die Bewegung und ich muss Pfeil drücken, um fortzufahren.

Um besser zu verstehen, was ich will auf diese Weise können erreichen aussehen: (> ist Pfeil nach rechts für Bewegung, z für Sprung)

key: >>>>>>>>>>>>> . z . . o player: oooooooo

Wie Sie Ich halte > sehen und Spieler bewegt sich. In der gleichen Zeit, wenn ich z drücken Spieler springt und stoppt, auch wenn > Taste gedrückt ist.

Ist es möglich, dies in Pyqt zu tun? Vielleicht brauche ich dafür eine externe Bibliothek? Jede Hilfe wird geschätzt!


Gelöst!

Dank der Antwort von @Brendan Abel ich alles getan habe ich gebraucht habe :) Code dieser recht ähnlich sieht (ich habe für Klarheit vereinfacht):

class Test(QtGui.QMainWindow): 
    pressed_keys = { 
    QtCore.Qt.Key_Left: False, 
    QtCore.Qt.Key_Right: False, 
    QtCore.Qt.Key_Z: False, 
    } 

    def __init__(self): 
    self.timer = QtCore.QTimer(self) 
    self.timer.timeout.connect(self.key_action) 
    self.timer.start(100) 

    # definitions hidden for simplicity 
    self.key_actions = { 
     QtCore.Qt.Key_Left: self.player_move_backward, 
     QtCore.Qt.Key_Right: self.player_move_forward, 
     QtCore.Qt.Key_Z: self.player_jump, 
    } 

    def keyPressEvent(self, e): 
    key = e.key() 
    self.pressed_keys[key] = True 

    def keyReleaseEvent(self, e): 
    key = e.key() 
    self.pressed_keys[key] = False 

    def key_action(self): 
    for key, is_pressed in self.pressed_keys.items(): 
     if is_pressed: 
     action = self.key_actions[key] 

     action() 
     self.update() 

Mein Spiel verhält sich jetzt so: jump and move

+0

ohne Ihre Tastendruck-Funktion zumindest, Sie werden nicht viel Hilfe bekommen –

+0

vielleicht einen Blick auf http://pyqt.sourceforge.net/Docs/PyQt4/qkeysequence.html, z. QKeySequence (Qt.Right + Qt.Up), um Ihr Problem zu behandeln. – lucasg

Antwort

1

Sie müssen wahrscheinlich eine Art von regelmäßigen Abfragen des Tastaturstatus durchführen, um zu bestimmen, welche Steuerelemente zu verarbeiten sind. Unglücklicherweise hat Qt keine direkte API zum Abrufen des Tastaturstatus. Sie müssen nachverfolgen, welche Schlüssel nicht aktiv sind, indem Sie eine globale Karte mit Schlüsseln verwalten, für die ein Schlüsselereignis , aber kein Schlüsselereignis vorliegt. Dann lade diese Karte in regelmäßigen Abständen ab, um die Liste der gedrückten Tasten zu erhalten.

pressed_keys = set() 

def keyPressEvent(self, event): 
    pressed_keys.add(event.key()) 

def keyReleaseEvent(self, event): 
    pressed_keys.remove(event.key()) 

Wenn Tasten hinzugefügt haben, können Sie wählen, ob Sie Zusatztasten (dh. Verschiebung, ctrl, alt) als auch (mit event.modifiers()) hinzugefügt werden soll, und ob die nur waren die Schlüssel anwenden, sollten sie zuerst gedrückt, oder ob sie für alle gedrückten Tasten gelten sollen.

Sie können eine QTimer verwenden, um die Abfrage durchzuführen. Im Grunde, anstatt keyPressEvent auszulösen Ihr Spiel zu aktualisieren, werden Sie auf der Basis von QTimer.timeout statt aktualisieren.

timer = QTimer() 
timer.timeout.connect(self.update_game) 
timer.start(100) # Update rate 

@QtCore.pyqtSlot() 
def update_game(self): 
    if Qt.Key_Space in pressed_keys: 
     ... 
    if Qt.Key_Up in pressed_keys: 
     ... 

Sie können auch wählen, nicht die QTimer zu verwenden, um die Updates zu tun, und halten Sie die keypress und keyrelease Ereignisse mit den Updates auslösen, aber Sie müssen noch einen dauerhaften Zustand von gedrückten Tasten zu halten.

+0

Ja, das ist es! Ich habe einige Antworten auf ähnliche Fragen gesehen, aber deine Antwort, die "Timer" enthält, führt mich auf die richtigen Spuren! Es funktioniert wie ein Zauber, alle gedrückten Tasten sind jetzt vollständig verarbeitet und ich habe eine Anwendung unabhängig von der System- "Tastendruckfrequenz". – zelazowy

Verwandte Themen