Pygame: Schlüssel.get_pressed() nicht übereinstimmt mit der Ereignis-queue
Ich versuche zu arbeiten, einfache Steuerelemente für eine Anwendung mit pygame Python. Ich habe die Grundlagen der Arbeit, aber ich bin der Kollision mit einem seltsamen Wand: ich verwende die Pfeiltasten, um die Kontrolle meines Charakters. Wenn ich drücken Sie eine Taste, halten Sie dann eine Taste (Diagonal bewegen), der Charakter bewegt sich wie erwartet. Wenn ich allerdings die Freigabe der zweiten Taste, die ich gedrückt (während noch gedrückter ersten - Taste), wird der Charakter nicht mehr bewegt, obwohl ich bin immer noch gedrückt halten, die ersten Schlüssel. Hier ist meine einfache Bewegung code:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if pygame.key.get_pressed()[K_LEFT]:
player.pos = (player.pos[0] - 2, player.pos[1])
if pygame.key.get_pressed()[K_RIGHT]:
player.pos = (player.pos[0] + 2, player.pos[1])
if pygame.key.get_pressed()[K_UP]:
player.pos = (player.pos[0], player.pos[1] - 2)
if pygame.key.get_pressed()[K_DOWN]:
player.pos = (player.pos[0], player.pos[1] + 2)
Nun, ich war natürlich sehr verwirrt von diesem. Also habe ich versucht zu drucken, werden einige Zeilen zu Debuggen. In der Spitze der wichtigste Regelkreis, ich schrieb:
print (pygame.key.get_pressed()[K_DOWN], pygame.key.get_pressed()[K_RIGHT])
print pygame.event.get()
...zur Ausgabe eines Tupels der Anzeige des Status der nach unten und rechts Pfeiltasten,, und zeigt dann die pygame event-queue. Meine Ergebnisse verblüfft mich noch mehr. Wenn ich das Zeichen verschieben Diagonal nach rechts und nach unten, drücken die nach-unten-Taste zuerst und dann die rechts-Taste, dann lassen Sie die Rechte Taste, um es bewegen Sie einfach nach unten, das Zeichen nicht mehr bewegt als vorher... aber das ist gedruckt auf der shell:
(1, 0)
[]
Ist, wenn ich release die Pfeil-rechts-Taste und halten noch immer die nach-unten-Pfeiltaste, pygame.Schlüssel.get_pressed() versteht, dass die down-Taste wird immer noch gedrückt gehalten, aber es ist nichts in der event-queue.
Auch weiter oben in dem code (vor der control-loop) bin ich aufrufen
pygame.key.set_repeat(1, 2)
den Charakter weiter zu bewegen, während die Taste gedrückt gehalten wird.
Jede Hilfe wird dankbar sein! Danke 🙂
InformationsquelleAutor Mortimer McMire | 2012-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für Dinge wie Bewegung, sollten Sie nicht prüfen, für Veranstaltungen (wie
KEYDOWN
oderKEYUP
), sondern prüfen jede iteration Ihre mainloop, wenn Sie Ihre Bewegung-Tasten gedrückt werden (mitget_pressed
).In Ihrem code prüfen Sie, ob die gedrückten Tasten nur, wenn es auch ein
KEYDOWN
Veranstaltung.Gibt es auch einige andere Dinge zu beachten:
Sollten Sie teilen Sie die key-mapping und die Geschwindigkeit des players, so wird es später einfacher zu ändern.
Sollten Sie ermitteln, eine Bewegung, die Vektor-und die zu normalisieren, da sonst, wenn Ihre vertikale und horizontale Bewegung die Geschwindigkeit ist
10
Ihre Diagonale Bewegung Geschwindigkeit ~14
.Beispiel:
InformationsquelleAutor sloth
verwenden Sie einfach die Ereignisse, die Daten zurückgeben, anstatt zu versuchen, poll, bist du auch schon überprüfen, ob es ein keydown-Ereignis GEBEN, jetzt nur befragen Sie die TASTE index, etwa so:
rest des Codes.....
berücksichtigen Sie auch die Verwendung einer separaten Datenstruktur zum speichern des Status der Steuerelemente, dann verwenden Sie einfach die Ereignisse zu aktualisieren, dass die Daten-Struktur. Das wird helfen, stellen Sie die Steuerelemente ein wenig mehr flexibel, wie Sie es gewohnt sich auf die Ereignis-queue ist, dass Ihr Charakter zu bewegen, was meiner Erfahrung sind die Ursachen von Problemen wie: nicht in der Lage, mehr zu fordern, als zwei Tasten zu einer Zeit, und ungerade Verzögerung oder timing-Probleme mit Charakter-Bewegungen. so etwas wie:
InformationsquelleAutor robnoxious77
Werden Sie mit Ereignis-basierten Eingaben , aber in diesem Fall Sie wollen polling-basierte Eingabe. Dann Sie don ' T mess with key-wiederholt.
InformationsquelleAutor ninMonkey
Meine Vermutung ist, dass set-wiederholen funktioniert nicht, die Art und Weise, dass Sie denken, es wird. Im Grunde genommen, nachdem Ihr den zweiten Schlüssel, geht nach oben, die Wiederholung nicht passieren. Dies scheint Sinn zu machen: öffnen Sie einen Texteditor und halten Sie die "A" - Taste. "A"s wird sich ergießen über den Bildschirm. Dann drücken Sie den "J" - Taste mit dem "A" - Taste noch gedrückt gehalten. Die "A"s zu stoppen. Das ist ein typischer key-repeat-Systems.
Ich bin mir nicht sicher mit diesem "set_repeat" - Methode klappt am Ende sowieso. Grundsätzlich werden alle Schlüssel, die der Spieler drückt nun "wiederholen", auch wenn Sie klicken Sie auf "fire" oder "springen".
Als alternative, versuchen Sie, den Zustand, wenn der Benutzer drückt oder Versionen. Verwenden Sie nicht die set_repeat, aber etwas wie die folgende:
InformationsquelleAutor Mark Hildreth