C# 碰撞管理器中游戏对象之间的关系
首先,我想说,我的问题更多的是设计一个好的面向对象系统,而不是游戏开发。我正在制作一个太空射击游戏,里面有子弹、敌人、大石头和宇宙飞船(玩家)。我有一个碰撞管理器(静态类),它检查每一帧的碰撞。为了将子弹的“效果”传递给宇宙飞船或敌人,我做了以下工作:C# 碰撞管理器中游戏对象之间的关系,c#,oop,xna,C#,Oop,Xna,首先,我想说,我的问题更多的是设计一个好的面向对象系统,而不是游戏开发。我正在制作一个太空射击游戏,里面有子弹、敌人、大石头和宇宙飞船(玩家)。我有一个碰撞管理器(静态类),它检查每一帧的碰撞。为了将子弹的“效果”传递给宇宙飞船或敌人,我做了以下工作: Interface IHit { Action<BaseGameSprite> GetEffect(); } 这个解决方案是可行的,但我不确定它是否是一个好的设计,因为GetEffect()完全破坏了封装,而且子弹似乎可以对H
Interface IHit
{
Action<BaseGameSprite> GetEffect();
}
这个解决方案是可行的,但我不确定它是否是一个好的设计,因为GetEffect()完全破坏了封装,而且子弹似乎可以对HittenObject(宇宙飞船或敌人)做任何他想做的事情。所以我的问题是:这是一个好的设计吗?或者我应该使用不同的东西?您检查实体系统了吗
它为游戏开发提供了一个比传统的面向对象设计更好的体系结构。在实体系统中,每个游戏对象都表示为一个实体,该实体只是一个id。渲染、碰撞检测、计算运行状况等行为不会封装在实体中,而是表示为可以添加到实体中的组件。实际渲染、物理、健康点计算等由独立的子系统处理。每个子系统处理所有相同类型的组件,而不考虑它们属于哪个实体。这样,渲染、逻辑、物理、人工智能就被清晰地分开了
要开始学习实体系统,请查看T=Machine编写的经典三篇文章:
(你可以在谷歌上搜索第2部分和第3部分)嗯,就OO设计而言,我认为设计很好。如果是你的游戏逻辑决定了你的子弹物体可以对它击中的物体做任何它想做的事情,那么为什么不呢?在您列出的示例代码中,我没有看到不同类之间存在任何紧密耦合,
GetEffect()
方法没有对任何具体类进行假设,只是要求gameobject
具有LifePoints
属性,您可能需要添加if
语句来检查gamobject
是否具有此属性。非常鼓舞人心的答案。我在谷歌上搜索了一下,发现了一篇关于c#代码示例的互测试文章:谢谢你提供的信息,但请你检查一下我的设计是否不好以及原因。我知道它不如实体系统好,我会了解它,但我必须知道它是否非常糟糕。
return new Action<ICollisionInterest>(gameobject =>
{
gameobject.LifePoints -= Damage;
});
TheHitObject.GetEffect()(HittenObject);