Pygame循环仅在按键时运行

1 投票
1 回答
585 浏览
提问于 2025-04-18 13:30

我先说一下,这个问题几乎和这个链接里的问题一模一样:PyGame: 处理游戏循环的经济方式

我想用pygame和pygcurse做一个回合制的地下城探险游戏。我已经做了一个基本的模板,如果我让主循环以一定的帧率运行,它是可以工作的。但我觉得这样实现实在是太荒谬了。

其实要简单得多,只要在按下键的时候让循环继续,因为在输入之间根本没有任何事情发生。如果有人想花15分钟思考下一步该怎么走,为什么要让主循环跑一百万次呢?

我尝试了各种不同的方法,比如pygcurse.waitforkeypress()和pygame.event.wait()。我可以让循环等待按键,但按键似乎没有进入队列,所以角色就不再移动了(我知道每次按键循环确实只执行一次,尽管没有移动,因为我为了调试加了一个计数器)。

有没有什么明显的方法可以做到这一点,还是说这只是对游戏设计的一种过时的思考方式?

1 个回答

2

你提到的问题其实已经包含了大部分你需要的信息。只要根据需要的事件进行筛选,然后使用event.wait来阻止程序执行,直到有新的事件进入队列。要确保窗口是聚焦状态,否则它不会接收到按键。

import pygame

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

pygame.event.set_allowed(None)
pygame.event.set_allowed([pygame.QUIT, pygame.KEYDOWN])

while True:
    e = pygame.event.wait()
    print e

不过,这样做对你的游戏设计限制很大。动画需要持续执行,如果一直阻止程序等待输入,那么在用户思考移动时,画面就会完全静止。即使游戏在用户做出动作之前没有任何“反应”,你最终还是会想要一些“休息/等待”的动画,以保持游戏的视觉趣味。

另外,如果你的游戏中有某种动画是根据输入来反应的,你需要在动画中加入循环来控制动画,并在这些循环中检查额外的输入,这样用户就不需要等动画结束才能进行其他操作(包括关闭游戏)。一般来说,除非你有非常特殊的情况,通常使用一个持续的游戏循环,并每次检查输入会更好。

撰写回答