没有主循环的游戏编程

时间:2010-10-20 21:35:28

标签: pygame

我的教授今天根据Pygame中的面向对象编程给了我的课。基本上他已经说过我们要创建的游戏将没有主游戏循环。虽然我认为有可能做到这一点(this question已经表明它是可能的)我不相信这是遵守面向对象范式所必需的。

在教授给出的图表中,他展示了游戏的初始化,并且当对象被实例化时,程序的控制流将分布在对象中。

基本上我相信以这种方式实现游戏是可能的,但它不是一种理想的方式,也不是面向对象的依从性所必需的。有什么想法吗?

编辑:我们正在创建一个小行星克隆,我认为这是因为它是一个实时动作游戏而进一步复杂化。

4 个答案:

答案 0 :(得分:7)

基于回合制的游戏或任何事件驱动将成为可行的途径。换句话说,拿桌面GUI应用程序。他们只是勾选(等待)直到事件被触发。对于简单的游戏也可以这样做。以Checkers为例。循环每个游戏周期都是矫枉过正的。 90%的时间游戏都是静态的。使用某种形式的事件(observer design模式在这里会很好)会提供更好的解决方案。你正在使用Pygame,所以可能会支持这种内置,由于我的使用有限,我无法完全评论。无论哪种方式,一般原则都是一样的。

总而言之,如果你问我,这是一个非常垃圾的任务。如果它是教你事件驱动编程,一个简单的GUI应用程序会更好。即使是最简单的游戏也是基本的游戏循环,它可以遵循OO原则。

答案 1 :(得分:2)

嗯。在一般情况下,我认为这个想法可能是hokum。 SDL(在其上实现PyGame)通过事件队列向程序提供信息,并且消耗该队列需要某种方式重复检查队列中的事件,处理它们,并等待下一个事件到达。

但是有一些特殊的例外情况。您可以在不访问事件队列的情况下轮询鼠标和键盘的状态。问题是它仍然需要类似循环的东西,所以它会一次又一次地发生,直到游戏退出。

您可以使用pygame.time等待计时器而不是等待事件队列,然后将控制传递给按照上面的方式轮询鼠标和键盘的游戏对象,但是您仍在“循环”,但是由计时器而不是事件队列绑定。

而不是专注于消除主循环,而是考虑以面向对象的方式使用它。

例如,您可能需要一个“root”对象,它实际上有自己的事件循环,但它不是根据传入事件执行任何操作,而是在多个子对象上调用处理程序。例如,当根对象收到pygame.event.MOUSEBUTTONDOWN事件时,它可以在其子项中搜索“rect”属性,并确定event.pos属性是否在该rect内。如果是,它可以在该子对象上调用假设的onClick方法。

答案 2 :(得分:0)

我认为它可能有资格作为事件驱动编程?哪个仍然可以面向对象。你在Flash中看到的很多。

主类中的主循环之间存在差异。您仍然可以让游戏类初始化所有对象,然后依靠输入来向前移动游戏。

如果不知道你的作业的确切参数,有点难以准确地说,魔鬼在细节中。

答案 3 :(得分:0)

你可能会看看python如何利用信号。我找到的一个不错的例子是:http://docs.python.org/library/signal.html