如何在pygame中实现按键延迟?

0 投票
1 回答
2831 浏览
提问于 2025-04-28 10:34

我正在制作一个平台游戏,为了让重力变得简单,我需要设置一个机制:当我按下跳跃键(空格键)后,大约2秒钟后重力才会重新生效。简单来说,'ychange'是用来改变角色在y轴上的位置的,每一帧都会更新(如果ychange = 3,角色每帧就会下降3个像素)。通常情况下,ychange被设置为6,这样角色就会以每帧6个像素的速度下落,直到碰到某个物体。如果要让角色跳跃,ychange会被设置为-6或-7,这样角色就会每帧上升6或7个像素。

我的问题是,如何在角色跳跃时,从ychange = -6切换到ychange = 6之间设置一个延迟。

举个例子:

当跳跃时:

ychange = -6

延迟2-3秒

ychange = 6

我显然尝试过time.sleep和pygame.time.wait,但这两个方法会让整个程序暂停,直到等待时间结束,这显然不好。

跳跃的代码是:

while not gameExit:
    for event in pygame.event.get(): # Binds
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                xchange -= 3
            if event.key == pygame.K_d:
                xchange += 3
            if event.key == pygame.K_SPACE: # SPACEBAR/JUMP
                ychange = -6
                time.sleep(2)
                ychange = 6
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a or event.key == pygame.K_d:
                xchange = 0

其中“if event.key == pygame.K_SPACE”是处理跳跃的部分,其他的则是其他按键的绑定。

这是一个使用time.sleep命令的例子,这个命令会暂停整个程序,直到延迟结束。

有没有什么好的主意呢?

重新表述一下:

问题:延迟会暂停程序

尝试过:time.sleep,pygame.time.wait

问题:如何设置一个不会暂停整个程序的延迟?

暂无标签

1 个回答

1

使用 pygame.time.get_ticks() 来获取玩家按下空格键的时间,然后设置一个布尔标志为真。接着,每一帧都获取一次时间,直到从最初的时间过去了2秒,这时候你就把 ychange 设置为 6,并把标志再设置为假。

另外,可以像评论中提到的那样,查一下线程相关的内容。

伪代码:

flag = False; # do this before the game loop starts

if event.type == pygame.KEYUP:
    # checking flag prevents resetting the timer
    if flag == False and event.key == pygame.K_w:
        starttime = pygame.time.get_ticks()
        ychange = -6
        flag = True

# wait 2000 milliseconds before executing this 
if flag == True and pygame.time.get_ticks() - starttime >= 2000:
    ychange = 6
    flag = False

撰写回答