Wie halte ich einen Schlüssel in Pygame effizient?

[EDIT] Ich habe die Lösung dort unten gepostet. [/BEARBEITEN]

Ich habe zwei verwandte Fragen gefunden:

Wenn Sie die Pygame-Taste gedrückt halten, wird eine Endlosschleife ausgelöstpygame - gedrückt halten

Aber ich möchte spezifisch sein. Wie man?

while not done:
    for e in event.get():
        if e.type == KEYDOWN:
            keys = key.get_pressed()
            if e.type == QUIT or keys[K_ESCAPE]:
                done = True
            if keys[K_DOWN]:
                print "DOWN"

Wenn ich den Abwärtspfeil drücke, wird gedruckt, aber nur einmal. Wenn ich es ein weiteres Mal drucken möchte, muss ich es erneut drücken.

Wenn ich stattdessen das Schlüsselwort while verwende,

while keys[K_DOWN]:
    print "DOWN"

Ich bekomme aus irgendeinem unbekannten Grund eine Endlosschleife.

Diese logische Alternative ist auch sinnlos:

if ((e.type == KEYDOWN) and keys[K_DOWN]):
    print "DOWN"

Und es gibt noch eine andere, die die Ereignisse irgendwie bereinigt und die Sie verwenden können, während:

while not done:
    for e in event.get():
        if e.type == KEYDOWN:
            keys = key.get_pressed()
            if e.type == QUIT or keys[K_ESCAPE]:
                done = True
            while keys[K_DOWN]:
                print "DOWN"
                event.get()
                keys = key.get_pressed()

Sie drücken jedoch die Abwärtstaste weniger als eine Sekunde lang und es wird tausende Male gedruckt. (Es wäre unmöglich, einen Spieler zu bewegen, und die Uhr darauf einzustellen, scheint nicht der richtige Weg zu sein, damit umzugehen. (Und ich habe es versucht und bin kläglich gescheitert.)).

Tausende Male auf den Block zu drücken und ihn auszuführen, ist sinnlos. Was ich möchte, ist, die Taste zu drücken und mit der Aktion fortzufahren, solange ich sie nicht freigebe, und zwar innerhalb der festgelegten Spieltaktrate.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage