Pygame中的光滑键盘运动

ora*_*per 7 python animation pygame sprite game-physics

当按下箭头键时,我正在使用此代码让玩家精灵在屏幕上移动:

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)
Run Code Online (Sandbox Code Playgroud)

图像能够实际移动,但按下按键时只能移动5个像素.我希望图像在按住键的同时保持移动(并且在窗口中添加基本的碰撞检测,但这是一个不同的问题).当按下按键时,图像会继续移动的原因是什么?

grc*_*grc 7

我建议使用变量来跟踪哪些箭头键被按下,哪些不是.您可以使用KEYDOWNKEYUP事件来更新变量.然后,您可以根据按下的键调整每帧精灵的位置.这也意味着您可以通过改变每帧移动的距离,轻松地在不同方向上设置精灵的速度.

编辑:

或者如@monkey建议的那样,您可以使用key.get_pressed()代替.

这是一个未经测试的例子:

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 == pygame.K_LEFT):
                sprite=pygame.image.load('left.png')
            elif (event.key == pygame.K_RIGHT):
                sprite=pygame.image.load('right.png')
            elif (event.key == pygame.K_UP):
                sprite=pygame.image.load('up.png')
            elif (event.key == pygame.K_DOWN):
                sprite=pygame.image.load('down.png')

    keys_pressed = pygame.key.get_pressed()

    if keys_pressed[pygame.K_LEFT]:
        spritex -= 5

    if keys_pressed[pygame.K_RIGHT]:
        spritex += 5

    if keys_pressed[pygame.K_UP]:
        spritey -= 5

    if keys_pressed[pygame.K_DOWN]:
        spritey += 5

    pygame.display.update()
    fpsClock.tick(FPS)
Run Code Online (Sandbox Code Playgroud)

  • 如果使用[key.get_pressed()](http://www.pygame.org/docs/ref/key.html#pygame.key.get_pressed)您不需要为每个键添加额外的变量.如果按下[K_LEFT],你的逻辑将是:做什么. (6认同)