web-dev-qa-db-fra.com

Comment obtenir une saisie au clavier en pygame?

Je suis en train de créer un jeu dans pygame 1.9.2 . C'est un jeu simple et sophistiqué dans lequel un navire se déplace entre cinq colonnes de méchants qui attaquent en descendant lentement. J'essaie de faire en sorte que le navire se déplace à gauche et à droite avec les touches fléchées gauche et droite. Voici mon 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

Ça marche trop bien. Le bateau va trop vite. Il est presque impossible de le déplacer d'un seul endroit, à gauche ou à droite. Comment puis-je faire en sorte que le navire ne bouge qu'une fois à chaque fois que la touche est enfoncée?

25
Dan G.

Vous pouvez obtenir les événements auprès de pygame, puis surveiller l'événement KEYDOWN au lieu de regarder les clés renvoyées par get_pressed() (qui vous donne les clés actuellement enfoncées, alors que l'événement KEYDOWN vous indique quelles clés ont été enfoncées ce cadre ). 

Ce qui se passe avec votre code actuellement, c'est que si votre jeu affiche un rendu à 30 images par seconde et que vous maintenez la touche flèche gauche enfoncée pendant une demi-seconde, vous mettez à jour l'emplacement 15 fois.

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

Pour prendre en charge le mouvement continu pendant que vous maintenez une touche enfoncée, vous devez établir une sorte de limitation, basée sur une cadence maximale forcée de la boucle de jeu ou par un compteur qui vous permet uniquement de vous déplacer à chaque fois. boucle.

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

Ensuite, quelque part pendant la boucle de jeu, vous feriez quelque chose comme ceci:

if move_ticker > 0:
    move_ticker -= 1

Cela ne vous permettrait de vous déplacer qu'une fois toutes les 10 images (ainsi, si vous vous déplacez, le ticker se règle sur 10, et après 10 images, il vous permettra de vous déplacer à nouveau)

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")



Notez que K_0 et K_1 ne sont pas les seules clés. Pour les afficher toutes, reportez-vous à la documentation de pygame. Sinon, appuyez sur tab après avoir saisi 

pygame.

(notez le. après pygame) dans un programme inactif. Notez que le K doit être capital. Notez également que si vous ne donnez pas à pygame une taille d'affichage (ne transmettez pas d'arguments), il utilisera automatiquement la taille de l'écran/du moniteur de l'ordinateur. Bonne codage!

4
PMARINA

Juste pour le moment, si vous essayez de vous assurer que le navire ne disparaît pas

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

vous pouvez probablement mieux utiliser

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

De cette façon, s'il saute -1 votre programme ne s'arrête pas

0
Nathan

Essaye ça:

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

Cela signifie que vous ne bougez que 1/10 du temps. Si la vitesse est encore trop rapide, vous pouvez également augmenter la valeur définie pour "compte".

0
Samuel