![]() |
1
14
我与两个商业游戏引擎密切合作,它们遵循类似的模式:
这种方法的优点如下:
|
![]() |
2
6
在我所研究的一个特定的引擎中,我们将逻辑与图形表示分离,然后拥有对象,这些对象将发送消息,以满足他们的需要。我们这样做是为了让游戏存在于本地机器或网络上,从代码的角度看,它们是不可区分的。(命令模式) 我们还在一个单独的对象中进行了实际的物理建模,该对象可以随时更改。这让我们很容易与重力等混淆。 我们大量使用了事件驱动的代码(侦听器模式),以及大量的计时器。 例如,我们有一个对象的基类,该对象是可相交的,可以监听碰撞事件。我们把它分为健康盒子。在碰撞时,如果它被一个玩家实体击中,它会向碰撞器发送一个命令,让碰撞器恢复健康,发送一条消息,向所有能听到的人广播一个声音,解除碰撞,激活动画,从场景图中删除图形,并设置一个计时器,稍后重新进行自我验证。听起来很复杂,但事实并非如此。 如果我记得(已经12年了),我们对场景有着抽象的概念,所以游戏就是一系列场景。当一个场景完成时,一个事件被激发,它通常会发送一个命令,取下当前场景并启动另一个场景。 |
![]() |
3
3
我不同意,因为你有一个主要的游戏类,所有的逻辑都必须发生在那个类。 为了表达我的观点,这里过于简单地模仿你的例子:
现在您有了一个气泡类:
当然,有一个主循环负责在实体之间传递消息,但是与气泡和指针碰撞相关的逻辑肯定不在主游戏类中。 我很确定,即使在你的例子中,所有与运动相关的逻辑都不会发生在主类中。 所以我不同意你的说法,你用粗体写的,“所有的逻辑都发生在主类中”。 这是完全不正确的。 至于好的设计:如果你能很容易地为你的游戏提供另一个“视图”(比如说,一个迷你地图),如果你能很容易地为“完美的帧回放器”编写代码,那么你的设计可能并不差(也就是说,通过只记录输入和它们发生的时间,你应该能够准确地重新创建游戏。这就是帝国时代、魔兽争霸3等等如何重放的:只有用户输入和他们发生的时间才会被记录下来[这也是重放文件通常很小的原因]。 |
![]() |
4
2
我自己写的引擎(原始引擎和脏引擎),但是一个预建的引擎有一个体面的OO模型,是 Ogre . 我建议您看看它(它是对象模型/API)。节点分配有点奇怪,但是你看得越多就越有意义。它还非常好地记录了大量的工作游戏示例。 我自己也从中学到了一些技巧。 |
![]() |
5
2
我只是把这个作为答案发布,因为我还不能对其他帖子发表评论。 作为Evan Rogers优秀答案的补充,您可能对以下文章感兴趣: http://www.gamasutra.com/blogs/MeganFox/20101208/6590/Game_Engines_101_The_EntityComponent_Model.php http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ |
|
simply lemon · python上链表的添加方法 11 月前 |
![]() |
HiroIshida · C++多重继承:实现具有重叠虚函数的接口[重复] 11 月前 |
|
Anonymous · 为什么在这个例子中self和类名的用法不同? 11 月前 |
![]() |
P N Singh · 在CPP Oops中调用对象而不创建它 1 年前 |
![]() |
Muthuraj · 如何创建一个通用工厂来创建某种类型的实例[重复] 1 年前 |
![]() |
Andy Votava · 从父类定义调用学生方法 1 年前 |