1

首先,我想说我的问题更多是关于设计一个好的面向对象系统而不是游戏开发。我正在制作一款太空射击游戏,其中包含子弹、敌人、大石头和宇宙飞船(玩家)等物体。我有一个碰撞管理器(静态类),每帧检查碰撞。为了将子弹的“效果”传递给宇宙飞船或敌人,我这样做了:

Interface IHit
{
   Action<BaseGameSprite> GetEffect();
}

*例如在子弹课上我做了:

 return new Action<ICollisionInterest>(gameobject =>
                {
                    gameobject.LifePoints -= Damage;


                });

在碰撞管理器中,如果他发现碰撞:

TheHitObject.GetEffect()(HittenObject);

该解决方案有效,但我不确定它是否是一个好的设计,因为 GetEffect() 完全破坏了封装,而且子弹似乎可以对 HittenObject(宇宙飞船或敌人)做任何他想做的事情。所以我的问题是:这是一个好的设计?或者我应该使用不同的东西?

4

2 回答 2

2

恕我直言,就OO设计而言,我认为设计很好。如果是你的游戏逻辑决定了你的子弹对象可以对它击中的对象做任何想做的事,那为什么不呢?在您列出的示例代码中,我没有看到不同类之间的任何紧密耦合,并且该GetEffect()方法没有对任何具体类做出假设,除了要求gameobjecthasLifePoints属性,您可能需要添加一条if语句来检查是否gamobject确实有虽然这个属性。

于 2013-03-29T17:35:30.587 回答
1

你检查过实体系统吗?http://entity-systems.wikidot.com/

它促进了比传统的面向对象设计更好的游戏开发架构。在实体系统中,每个游戏对象都表示为一个实体,它只是一个 id。渲染、碰撞检测、计算健康等行为没有封装在实体中,而是表示为可以添加到实体中的组件。实际渲染、物理、健康点计算等由独立的子系统处理。每个子系统处理所有相同类型的组件,而不管它们属于哪个实体。这样一来,渲染、逻辑、物理、ai就清晰的分开了。

要开始学习实体系统,请查看 T=Machine 撰写的经典 3 部分文章: http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/ (你可以谷歌第2部分和第3部分)

于 2013-03-29T05:45:56.620 回答