游戏编程 - 2d中游戏对象之间的通信

15 c# architecture game-engine

最近我一直在尝试用C#编写游戏.我没有使用XNA,因为我认为如果我从头编写游戏(尽管我使用的是多媒体引擎),我会学到更多东西.

我正在尝试设计一个2D RPG游戏 - 我知道有点野心勃勃,但我至少对游戏的基本部分(即'锅炉板'代码)有一个相当好的理解,我已经达到了一个角色我不知道从哪里去的地方.

在2D游戏中,您可以通过在不同的"区域"中走动来完成游戏.一旦你点击"门户瓦片",你将被运送到下一个区域等.

我无法理解应该如何设置这些区域对象.这是我的第一个想法:每个区域都有一些不同的收集结构(例如,可见性四叉树,碰撞四叉树,AI实体列表等).因此,如果我要在游戏中添加敌人实体,它将被放入可见性四叉树,碰撞四叉树(因为你可以与实体碰撞)和AI实体列表.当该区域收到更新请求时,它会告诉每个这些结构自己更新,这反过来告诉实体自己更新.到目前为止一切都很好.

我的问题是:如果这个敌人需要与其他物体通信怎么办?例如,它可能需要知道玩家是否处于某个范围内.或者它是否被玩家击中.或者所有可碰撞物体都在该区域内(因此它可以寻找路径).

这个问题的第一个(也是坏的)解决方案就是将每个实体传递给每个集合.但这显然会鼓励紧密耦合的物体,这并不好.

我想出的第二个解决方案是让每个实体能够通过消息结构查询该区域.因此,敌人可以说"在我的位置的X距离内给我一个每个实体的列表",该区域将返回一个答案.然而,这将变得越来越困难,因为我必须在该区域编码越来越多的可能性("给我一个不在我自己的X距离内的实体列表","给我一个健康低于所有实体的列表X"等).

我正在寻找的是对这种对象间通信问题的时间测试解决方案,基本上是如何设置一个区域.我想它也需要某种消息传递系统,虽然我不确定.

谢谢阅读.

for*_*ran 5

我认为这种事情的最佳选择是大量使用观察者模式......创建事件(决定通用或具体是另一个设计决策)并使您的对象订阅他们需要的对象。

例如,当 2 个实体靠近时,您的引擎可以触发碰撞或接近事件,但这些只会被感兴趣的实体接收。您可以进行一些优化以仅检查那些订阅了观察者的条件。

我不知道这是否在游戏中很常见,而且我从未在任何游戏中实际使用过它(还),但我已经考虑了很多次,这是我最喜欢的选项。


Jul*_*anR 5

您可以查看Mediator 模式。它将允许您具有低耦合,但是,是的,您在中介对象中使用大量代码来促进其他对象之间的通信。但我认为它是一个或另一个。然后这是可取的。它还可以让您更自由地使用技巧,例如将某些更新请求排队并在更合适的时间处理请求,或者对大量请求进行批处理,而不是一个一个地处理它们,这会(假设)强加某种高架。