c# - 游戏编程 - 二维游戏对象之间的通信

标签 c# architecture game-engine

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

我正在尝试设计一个 2D RPG 游戏——我知道这有点雄心勃勃,但我至少对游戏的基本部分(即“样板”代码)有相当好的理解,而且我已经到达了我不知道从这里去哪里的部分。

在 2D 游戏中,您通过在不同“区域”中走动来推进游戏。一旦你击中了一个“门户板 block ”,你就会被传送到下一个区域等等。

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

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

这个问题的第一个(也是不好的)解决方案是简单地向每个实体传递一个对每个集合的引用。但这显然会鼓励紧密耦合的对象,这并不好。

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

我正在寻找的是针对对象间通信问题的耗时考验的解决方案,以及如何设置区域的基本方法。我想它也需要某种消息传递系统,尽管我不确定。

感谢阅读。

最佳答案

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

关于c# - 游戏编程 - 二维游戏对象之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677706/

相关文章:

c++ - 如何旋转一个物体使其面向另一个物体?

c# - 如何将图像保存到文件系统?

c# - Image/Bitmap 和 PictureBox 的正确处理方式

node.js - backbone.js + node.js - express.js

python - 鸭子类型(duck typing)实践 - Python 3.7

c++ - 使用 OpenGl 在 C++ 中组织公寓建模代码

java - java中类之间的相互通信

c# - 设计时 Form 的自定义可浏览属性

c# - 从字符串访问 IQueryable 对象成员?

python - 地形生成Python约束