不需要主循环的游戏编程

4
我的教授今天给我们布置了一个基于Pygame面向对象编程的作业。他说我们要创建的游戏将不包含主游戏循环。虽然我相信这是可能的(这个问题已经说明了这一点),但我认为这并不是遵循面向对象范式所必需的。
在教授给出的图表中,他展示了游戏初始化,并且当对象被实例化时,程序的控制流会在对象之间分配。
基本上,我相信可以通过这种方式实现游戏,但这不是理想的方式,也不是遵循面向对象的必要条件。有什么想法吗?
编辑:我们正在创建一个类似于“陨石”的克隆游戏,这进一步复杂化了事情,因为它是一个实时动作游戏。

嗯,虽然我能看出这种方法的可行性,但当有大量的小行星时,我无法想象它如何表现良好。哪一个会检查碰撞?每个都自己检查吗?那么哪一个会更新四叉树以避免不必要的碰撞检查呢?而让实体操作某种全局状态也不是最佳设计选择,我认为。 - Ivo Wetzel
4个回答

7
回合制游戏或任何事件驱动的东西都是可行的路线。换句话说,采用桌面GUI应用程序。它们只会在触发事件时才会运行。同样的方式也适用于简单的游戏。以跳棋为例,循环每个游戏周期会过度杀伤性能。90% 的时间游戏都是静态的。使用某种形式的事件(这里使用观察者模式 将提供更好的解决方案。你正在使用 Pygame,所以可能内置了对此的支持,但由于我的使用有限,我无法做出完整的评论。无论如何,一般原则都是相同的。
总的来说,如果问我,这是一个相当糟糕的任务。如果是为了教授事件驱动编程,一个简单的 GUI 应用程序会更好。即使是最简单的游戏也使用基本的游戏循环,可以遵循面向对象的原则。

谢谢,这正是我基本的想法。感谢观察者设计思路,我会使用它。 - emberv3

2

嗯,就一般情况而言,我认为这个想法可能是胡扯的。SDL(PyGame的实现基础)通过事件队列向程序提供信息,消费该队列需要反复检查队列中的事件、处理它们,并等待下一个事件到来。

不过,有一些特殊情况。你可以轮询鼠标和键盘的状态而不访问事件队列。但问题在于,仍然需要类似循环的东西,以便它一遍又一遍地运行直到游戏退出。

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

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

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


0

我认为这可能符合事件驱动编程的要求?这仍然可以是面向对象的。在Flash中经常看到这种情况。

主类中的主循环和游戏类初始化所有对象之间有所不同,你仍然可以依赖输入来推动游戏前进。

如果不知道您的任务的确切参数,很难确定具体情况,细节决定成败。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接