碰撞管理器中游戏对象之间的关系

时间:2013-03-29 03:56:38

标签: c# oop xna

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

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

*例如我在子弹类中做过:

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


                });

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

TheHitObject.GetEffect()(HittenObject);

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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部分)