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

2024-04-24 23:24:40 发布

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

我正在做一个蛇形运动的游戏。我认为,获得好结果的最好方法是制作单独的线程来处理用户的键盘输入。以下是我希望在单独线程中运行的函数:

    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()延迟,但我不确定是否会“点击”按键事件的正确时间(我在下面的网站上找到的图片)

Time interval for keyboard events

我不想使用pygame.key.get_pressed(),因为我不想对任何键进行优先级排序(例如,如果同时按下向左和向上箭头,我将不得不选择其中一个键)

最好的方法是什么


Tags: 方法key用户selfevent游戏getif
1条回答
网友
1楼 · 发布于 2024-04-24 23:24:40

注意^{}从队列中删除事件。如果您有多个事件循环(即使在不同的线程中),那么您将错过事件。无需比更新显示时更频繁地处理事件,因为状态更改仅在更新显示后“可见”。由于事件存储在队列中,因此不必在“正确”时刻获取事件,pygame.event.get()从队列中获取并移除所有挂起的事件

如果希望每500毫秒移动一次蛇,那么我建议使用^{}。方法^{}返回自上次调用以来经过的毫秒数。
将毫秒相加,当总和超过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()

相关问题 更多 >