玩家移动停止时,方向逆转在皮格姆

2024-06-30 13:10:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我在玩弄pygame,我最终会朝着一个pong克隆人的方向努力。我用箭头键实现了播放器的移动,当我从向上切换到立即向下时,我的播放器会冻结,直到我再次按下方向键才会移动。这是我的密码:

import sys, pygame

pygame.init()

display_width = 640
display_height = 480

display = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("Test Game")

black = (0,0,0)
white = (255,255,255)

clock = pygame.time.Clock()

running = True

class Player:

    def __init__(self,x,y,hspd,vspd,color,screen):
        self.x = x
        self.y = y
        self.hspd = hspd
        self.vspd = vspd
        self.color = color
        self.screen = screen

    def draw(self):
        pygame.draw.rect(self.screen,self.color,(self.x,self.y,32,32))

    def move(self):
        self.x += self.hspd
        self.y += self.vspd

player = Player(0,0,0,0,black,display)

while running:

    clock.tick(60)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT:
                player.hspd = 0
            if event.key == pygame.K_LEFT:
                    player.hspd = 0
            if event.key == pygame.K_UP:
                player.vspd = 0
            if event.key == pygame.K_DOWN:
                player.vspd = 0

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                player.hspd = 4
            if event.key == pygame.K_LEFT:
                player.hspd = -4
            if event.key == pygame.K_UP:
                player.vspd = -4
            if event.key == pygame.K_DOWN:
                player.vspd = 4


    #Clear the screen
    display.fill(white)

    #Move objects
    player.move()
    #Draw objects
    player.draw()

    #Update the screen
    pygame.display.flip()

print "I made it!"
pygame.quit()
sys.exit()

Tags: keyselfeventifdeftypedisplayscreen
3条回答

要扩展LPK的答案,请按下键(例如事件.key==pygame.Kïu DOWN)可能在您的密钥向上(从事件.key==pygame.K\u UP)已处理。因此,当两个都向下时(您可以确认这一点),您可能会经历移动,直到您释放向上键。你知道吗

你的问题是:

if event.type == pygame.KEYUP:
        if event.key == pygame.K_RIGHT:
            player.hspd = 0
        if event.key == pygame.K_LEFT:
                player.hspd = 0
        if event.key == pygame.K_UP:
            player.vspd = 0
        if event.key == pygame.K_DOWN:
            player.vspd = 0

if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_RIGHT:
            player.hspd = 4
        if event.key == pygame.K_LEFT:
            player.hspd = -4
        if event.key == pygame.K_UP:
            player.vspd = -4
        if event.key == pygame.K_DOWN:
            player.vspd = 4  

我猜,当您立即切换按键时,您的按键事件down仍会被消耗,这意味着只要第一个事件尚未触发其按键向上事件,就不会触发其他按键向下事件。你知道吗

编辑:也许最好检查一下玩家是否在移动,如果是的话,只需要反转速度。那么您只需要检查down事件。 否则您的事件将被消耗,并且无法正确检查。 对于您的方法,您需要存储自上一帧以来发生的键事件并检查该列表。你知道吗

我建议您使用^{}检查当前的按键集。你知道吗

在您的场景中,当您按下并向上释放(按该顺序)时,速度设置为0,因此您需要检查当前事件所按下的键。你知道吗

以下是相关部分的工作版本:

def current_speed():
    # uses the fact that true = 1 and false = 0
    currently_pressed = pygame.key.get_pressed()
    hdir = currently_pressed[pygame.K_RIGHT] - currently_pressed[pygame.K_LEFT]
    vdir = currently_pressed[pygame.K_DOWN] - currently_pressed[pygame.K_UP]
    return hdir * 4, vdir * 4

while running:

    clock.tick(60)

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            running = False

        player.hspd, player.vspd = current_speed()

    #Clear the screen
    display.fill(white)

    #Move objects
    player.move()
    #Draw objects
    player.draw()

    #Update the screen
    pygame.display.flip()

相关问题 更多 >