it-swarm.com.de

Wie bekomme ich Tastatureingaben in Pygame?

Ich mache ein Spiel in Pygame 1.9.2 ... Es ist ein einfaches Spiel, in dem sich ein Schiff zwischen fünf Säulen von Bösen bewegt, die angreifen, indem sie sich langsam nach unten bewegen. Ich versuche es so zu machen, dass sich das Schiff mit der linken und rechten Pfeiltaste nach links und rechts bewegt. Hier ist mein Code:

keys=pygame.key.get_pressed()
if keys[K_LEFT]:
    location-=1
    if location==-1:
        location=0
if keys[K_RIGHT]:
    location+=1
    if location==5:
        location=4

Es funktioniert zu gut. Das Schiff bewegt sich zu schnell. Es ist fast unmöglich, nur einen Ort nach links oder rechts zu verschieben. Wie schaffe ich es, dass sich das Schiff bei jedem Tastendruck nur einmal bewegt?

25
Dan G.

Sie können die Ereignisse von pygame abrufen und dann auf das KEYDOWN -Ereignis achten, anstatt auf die von get_pressed() zurückgegebenen Tasten zu schauen (wodurch die aktuell gedrückten Tasten angezeigt werden, während das KEYDOWN-Ereignis anzeigt, welche Tasten auf gedrückt wurden.) dieser Rahmen ). 

Was gerade mit Ihrem Code geschieht, ist, dass, wenn Ihr Spiel mit 30 Bildern pro Sekunde rendert und Sie die linke Pfeiltaste eine halbe Sekunde lang gedrückt halten, der Standort 15-mal aktualisiert wird.

events = pygame.event.get()
for event in events:
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            location -= 1
        if event.key == pygame.K_RIGHT:
            location += 1

Um eine ununterbrochene Bewegung zu unterstützen, während eine Taste gedrückt gehalten wird, müssen Sie eine Art Einschränkung festlegen, entweder basierend auf einer erzwungenen maximalen Bildfrequenz der Spielschleife oder durch einen Zähler, mit dem Sie nur so viele Ticks der Taste bewegen können Schleife.

move_ticker = 0
keys=pygame.key.get_pressed()
if keys[K_LEFT]:
    if move_ticker == 0:
        move_ticker = 10
        location -= 1
        if location == -1:
            location = 0
if keys[K_RIGHT]:
    if move_ticker == 0:   
        move_ticker = 10     
        location+=1
        if location == 5:
            location = 4

Dann würden Sie irgendwo während der Spielschleife so etwas tun:

if move_ticker > 0:
    move_ticker -= 1

Dadurch können Sie sich nur alle 10 Frames einmal bewegen. Wenn Sie sich also bewegen, wird der Ticker auf 10 gesetzt, und nach 10 Frames können Sie sich wieder bewegen.

42
Haz
import pygame
pygame.init()
pygame.display.set_mode()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit(); #sys.exit() if sys is imported
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_0:
                print("Hey, you pressed the key, '0'!")
            if event.key == pygame.K_1:
                print("Doing whatever")



Beachten Sie, dass K_0 und K_1 nicht die einzigen Schlüssel sind. Wenn Sie alle anzeigen möchten, lesen Sie die Pygame-Dokumentation. Andernfalls drücken Sie nach der Eingabe tab 

pygame.

(beachten Sie das. nach pygame) in ein untätiges Programm. Beachten Sie, dass das K Kapital sein muss. Beachten Sie auch, dass wenn Sie Pygame keine Anzeigegröße zuweisen (keine Argumente übergeben), die Größe des Computerbildschirms/Monitors automatisch verwendet wird. Viel Spaß beim Codieren!

4
PMARINA

Nur zu Ihrer Information, wenn Sie sicherstellen möchten, dass das Schiff nicht mit dem Bildschirm ausgeht

location-=1
if location==-1:
    location=0

du kannst es wahrscheinlich besser gebrauchen

location -= 1
location = max(0, location)

Auf diese Weise bricht Ihr Programm nicht, wenn es -1 überspringt

0
Nathan

Versuche dies:

keys=pygame.key.get_pressed()
if keys[K_LEFT]:
    if count == 10:
        location-=1
        count=0
    else:
        count +=1
    if location==-1:
        location=0
if keys[K_RIGHT]:
    if count == 10:
        location+=1
        count=0
    else:
        count +=1
    if location==5:
        location=4

Dies bedeutet, dass Sie nur 1/10 der Zeit bewegen. Wenn es sich immer noch zu schnell bewegt, können Sie auch versuchen, den von Ihnen eingestellten Wert zu erhöhen.

0
Samuel