如何使Pygame不断以不同的速度响应不同的按键?

时间:2019-08-31 12:05:48

标签: python pygame

我正在制作一个射击游戏,其中包含可以射击“子弹”的“玩家”。按“ WASD”可以控制播放器的运动,按“空格”可以使“播放器”射击。现在,我希望Pygame能够以不同的速度响应长按的键。例如,每10 ms响应一次“ WASD”,每1000ms响应一次“ Space”。我该怎么办?

我尝试了pygame.key.set_repeat(),并且每个键都会以相同的速度响应。

1 个答案:

答案 0 :(得分:0)

pygame.key.set_repeat()设置整个键盘的延迟,无法区分键。您需要在程序中执行此操作。

一种可能的解决方案是将set_repeat重复事件之间的延迟设置为您想要在游戏中拥有的最短间隔。对于需要较长时间间隔的键,您需要自己检查是否经过了足够的时间来“接受”事件并允许执行相应的操作。

此示例代码应使您了解我的意思。

import sys
import pygame

#the action you want to perform when the key is pressed. Here simply print the event key
#in a real game situation, this action would differ according to the key value
def onkeypress(event):
    print(event.key)

#dict of key constants for which you want a longer delay and their tracking time
#in ms, initialized to 0. Here only the spacebar
repeat1000 = {pygame.K_SPACE : 0}

pygame.init()
screen = pygame.display.set_mode((500, 500))

#sets repeat interval to 10 milliseconds for all keys
pygame.key.set_repeat(10)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:
            current_time = pygame.time.get_ticks()
            if event.key in repeat1000.keys():
                if current_time - repeat1000[event.key] > 1000:
                    repeat1000[event.key] = current_time
                    onkeypress(event)
            elif event.key in [pygame.K_w, pygame.K_a, pygame.K_s, pygame.K_d]:
                onkeypress(event)

如果您尝试上面的代码,您会发现如果按住空格键,每秒就会打印出空格键(在我的系统上为32)。另外,如果您按W A S D之一,则每0.01秒就会打印一次对应的键(我的系统上为119、97、115、100)。