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

本文关键字:之间 关系 对象 游戏 管理器 碰撞 | 更新日期: 2023-09-27 18:06:38

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

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

*例如,在项目符号类中我做了:

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

                });

和在冲突管理器中,如果他发现了冲突:

TheHitObject.GetEffect()(HittenObject);

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

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

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

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

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

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