Lisse de Mouvement du Clavier dans Pygame
Je suis en utilisant ce code pour avoir un joueur sprite déplacer autour de l'écran lorsque les touches sont enfoncées:
import pygame, sys, time
from pygame.locals import *
pygame.init()
FPS=30
fpsClock=pygame.time.Clock()
width=400
height=300
DISPLAYSURF=pygame.display.set_mode((width,height),0,32)
pygame.display.set_caption('Animation')
background=pygame.image.load('bg.png')
UP='up'
LEFT='left'
RIGHT='right'
DOWN='down'
sprite=pygame.image.load('down.png')
spritex=200
spritey=130
direction=DOWN
pygame.mixer.music.load('bgm.mp3')
pygame.mixer.music.play(-1, 0.0)
while True:
DISPLAYSURF.blit(background,(0,0))
DISPLAYSURF.blit(sprite,(spritex,spritey))
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if (event.key == K_LEFT):
spritex-=5
sprite=pygame.image.load('left.png')
elif (event.key == K_RIGHT):
spritex+=5
sprite=pygame.image.load('right.png')
elif (event.key == K_UP):
spritey-=5
sprite=pygame.image.load('up.png')
elif (event.key == K_DOWN):
spritey+=5
sprite=pygame.image.load('down.png')
pygame.display.update()
fpsClock.tick(FPS)
L'image est en mesure de se déplacer, mais seulement de 5 pixels lorsque la touche est enfoncée. Je veux de l'image à conserver le déplacement tant que la touche est maintenue enfoncée (et pour ajouter de base de la détection de collision avec la fenêtre, mais c'est une autre question). Ce qui pourrait faire de l'image de garder le déplacement tant que la touche est enfoncée?
Je recommande 4 espace tirets plutôt que des onglets.
OriginalL'auteur oracleCreeper | 2012-12-30
Vous devez vous connecter pour publier un commentaire.
Je suggère d'utiliser des variables pour garder une trace des flèches de direction et qui ne le sont pas. Vous pouvez utiliser le
KEYDOWN
etKEYUP
événements pour mettre à jour les variables. Ensuite, vous pouvez ajuster la position du sprite chaque image de la base sur laquelle les touches sont pressées. Cela signifie également que vous pouvez facilement régler la vitesse du sprite dans des directions différentes en changeant loin comment il se déplace chaque image.EDIT:
Ou comme @monkey suggéré, vous pouvez utiliser clé.get_pressed() à la place.
Voici un non testé exemple:
L'OP ne se déplacent dans l'un des points cardinaux, à un moment, mais votre solution sera de se déplacer dans plusieurs directions si plusieurs touches sont appuyées.
Merci pour cela.
Mussmann: j'ai pris plusieurs directions ont été voulu, mais il peut facilement être modifié à l'aide d'une seule instruction if pour ajuster la position du sprite (
elif keys_pressed...
plutôt queif keys_pressed...
).J'aime cette solution meilleure que la mienne. Je n'ai même pas envisager de déplacer en diagonale.
OriginalL'auteur grc
Je vous recommande d'utiliser le set_repeat fonction. Tenue des touches de générer de multiples événements, périodiquement(qui est définie par la fonction de paramètres).Cela vous permet d'utiliser votre code non modifié (pas besoin de variables supplémentaires).
Le prototype de fonction:
set_repeat(retard, intervalle)
Le premier paramètre de retard est le nombre de millisecondes avant la première répété pygame.KEYDOWN sera envoyé. Après un autre pygame.KEYDOWN sera envoyé à chaque intervalle en millisecondes. Si aucun argument n'est passé à la répétition des touches est désactivé.
Simplement utiliser cette fonction avant la boucle principale.
Source: http://www.pygame.org/docs/ref/key.html#pygame.key.set_repeat
OriginalL'auteur agent_Jay
J'ai fait comme ceci:
if (event.key == direction)
.Lol... Vous avez tout à fait raison
Aussi, ne pourriez-vous définir
direction = event.key
sidirection
est l'un de ceux que nous voulons? Vérifier l'appartenance à un ensemble peut-être?N'est même pas nécessaire, parce que la fonction de déplacement de ne pas faire n'importe quoi dans les autres cas.
Bien que si vous appuyez et maintenez la flèche vers la gauche, puis appuyez et relâchez la touche 'a', qui peuvent se comporter étrangement.
OriginalL'auteur jgritty
Je voudrais le faire en prenant un cours légèrement différent de l'action à l'intérieur de la boucle.
De mettre à jour le sprite, je voudrais tout d'abord vérifier la
KEYDOWN
événement, puis définissezdirection
sur cette base. Ensuite, je voudrais mettre à joursprite
,spritex
, etspritey
basé surdirection
. Ensuite, je voudrais vérifier pourKEYUP
événements et de définirdirection
sur cette base, le cas échéant.Voici comment j'ai peut-code:
OriginalL'auteur Sam Mussmann