PyGame 用于键盘输入处理的单独线程
PyGame separate thread for keyboard input handling
我正在制作一个蛇形运动的游戏。我认为,获得良好结果的最佳方法是创建单独的线程来处理用户的键盘输入。这是我想在单独的线程中 运行 的函数:
def _handle_keyboard_input(self):
while self.is_running:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
self._set_velocity(-1, 0)
elif event.key == pygame.K_RIGHT:
self._set_velocity(1, 0)
elif event.key == pygame.K_UP:
self._set_velocity(0, -1)
elif event.key == pygame.K_DOWN:
self._set_velocity(0, 1)
def _set_velocity(self, x, y):
self._velocity_x = x
self._velocity_y = y
尽管我担心,不断循环那个 while 是否会使 CPU 加载太多。我考虑过添加 pygame.time.delay()
延迟,但后来我不确定我是否会 "hit" KEYDOWN 事件的正确时机(我在下面这个网站上找到的图片)。
我不想使用 pygame.key.get_pressed()
因为我不想对任何键进行优先排序(例如,如果同时按下向左和向上箭头,我将不得不选择其中一个).
最好的方法是什么?
注意 pygame.event.get()
从队列中删除事件。如果您有多个事件循环(即使在不同的线程中),那么您将错过事件。没有必要比显示更新更频繁地处理事件,因为状态更改在显示更新后仅变为 "visible"。由于事件存储在队列中,因此无需在 "right" 时刻获取事件,pygame.event.get()
从队列中获取并删除所有未决事件。
如果你想每 500 毫秒移动一次蛇,那么我建议使用 pygame.time.Clock
. The method tick
returns 自上次调用以来已经过去的毫秒数。
将毫秒数相加,当总和超过500时移动蛇:
clock = pygame.time.Clock()
count_ms = 0
FPS = 100
run = True
while run:
passed_ms = clock.tick(FPS)
# event loop
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
# [...]
count_ms += passed_ms
if count_ms >= 500:
count_ms = count_ms % 500
# move and draw snake
# [...]
pygame.display.flip()
我正在制作一个蛇形运动的游戏。我认为,获得良好结果的最佳方法是创建单独的线程来处理用户的键盘输入。这是我想在单独的线程中 运行 的函数:
def _handle_keyboard_input(self):
while self.is_running:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
self._set_velocity(-1, 0)
elif event.key == pygame.K_RIGHT:
self._set_velocity(1, 0)
elif event.key == pygame.K_UP:
self._set_velocity(0, -1)
elif event.key == pygame.K_DOWN:
self._set_velocity(0, 1)
def _set_velocity(self, x, y):
self._velocity_x = x
self._velocity_y = y
尽管我担心,不断循环那个 while 是否会使 CPU 加载太多。我考虑过添加 pygame.time.delay()
延迟,但后来我不确定我是否会 "hit" KEYDOWN 事件的正确时机(我在下面这个网站上找到的图片)。
我不想使用 pygame.key.get_pressed()
因为我不想对任何键进行优先排序(例如,如果同时按下向左和向上箭头,我将不得不选择其中一个).
最好的方法是什么?
注意 pygame.event.get()
从队列中删除事件。如果您有多个事件循环(即使在不同的线程中),那么您将错过事件。没有必要比显示更新更频繁地处理事件,因为状态更改在显示更新后仅变为 "visible"。由于事件存储在队列中,因此无需在 "right" 时刻获取事件,pygame.event.get()
从队列中获取并删除所有未决事件。
如果你想每 500 毫秒移动一次蛇,那么我建议使用 pygame.time.Clock
. The method tick
returns 自上次调用以来已经过去的毫秒数。
将毫秒数相加,当总和超过500时移动蛇:
clock = pygame.time.Clock()
count_ms = 0
FPS = 100
run = True
while run:
passed_ms = clock.tick(FPS)
# event loop
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
# [...]
count_ms += passed_ms
if count_ms >= 500:
count_ms = count_ms % 500
# move and draw snake
# [...]
pygame.display.flip()