PyGame单独的线程用于处理键盘输入

问题描述 投票:0回答:1

我正在做一个蛇形运动的游戏。我认为,要达到一个好的效果,最好的方法是建立单独的线程来处理用户的键盘输入。下面是我想在独立线程中运行的函数。

    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

虽然我担心不断地循环运行这个函数会不会对CPU造成太大的负担。我想在这个函数中加入 pygame.time.delay() 延迟,但我不确定我是否会 "击中 "KEYDOWN事件的正确时刻(我在下面这个网站上找到的图形)。

Time interval for keyboard events

我不想使用 pygame.key.get_pressed() 因为我不想优先考虑任何键(例如如果同时按下左和上箭头,我就必须选择其中一个)。

最好的方法是什么?

python multithreading pygame keyboard-events
1个回答
1
投票

注意事项 pygame.event.get() 从队列中删除事件。如果你有多个事件循环(甚至在不同的线程中),那么你会错过事件。没有必要在显示更新后更频繁地处理事件,因为状态变化只有在显示更新后才会变得 "可见"。由于事件存储在一个队列中,所以不需要在 "正确 "的时刻获取事件。pygame.event.get() 从队列中获取并删除所有待处理的事件。

如果你想每500毫秒移动一次蛇,那么我建议使用 pygame.time.Clock. 该方法 tick 返回自上次调用以来已经过去的毫秒数。将毫秒数相加,当总和超过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()
© www.soinside.com 2019 - 2024. All rights reserved.