Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 游戏编程-2d中游戏对象之间的通信_C#_Architecture_Game Engine - Fatal编程技术网

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

C# 游戏编程-2d中游戏对象之间的通信,c#,architecture,game-engine,C#,Architecture,Game Engine,最近我一直在尝试用C语言编写一个游戏。我没有使用XNA,因为我想如果我从头开始编写游戏,我会学到更多(尽管我使用的是多媒体引擎) 我正在尝试设计一个2D RPG游戏——我知道这有点雄心勃勃,但是我至少对游戏的基本部分(即“锅炉板”代码)有相当好的理解,我已经达到了我不知道从这里走到哪里的地步 在2D游戏中,您可以通过在不同的“区域”走动来完成游戏。一旦你点击了一个“门户地砖”,你就会被转移到下一个区域等 我很难理解这些区域对象应该如何设置。这是我的第一个想法:每个区域都有一些不同的集合结构(例如

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

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

在2D游戏中,您可以通过在不同的“区域”走动来完成游戏。一旦你点击了一个“门户地砖”,你就会被转移到下一个区域等

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

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

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

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

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


感谢阅读。

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

例如,当两个实体靠近时,引擎可以触发碰撞或接近事件,但这些事件将仅由感兴趣的实体接收。您可以进行一些优化,以便仅使用指定的观察者检查这些条件


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

你可以查看一下。这将允许您具有低耦合,但是的,您将在中介对象中拥有大量代码,以促进其他对象之间的通信。但我认为不是一个就是另一个。这样更好。它还允许您更自由地进行一些操作,比如排队等待某些更新请求并在更合适的时间处理这些请求,或者对大量请求进行批处理,而不是逐个处理这些请求,这(假设)会带来某种开销

一个解决办法是建立客户机/服务器体系结构。因此,服务器将处理所有游戏世界更新和内部逻辑,客户端只会询问服务器是否可以执行某些操作。然后服务器会做出响应,客户端只会绘制并更新游戏屏幕。非玩家实体也会这样做。唯一的区别是,客户机由人控制,其他实体由计算机控制。这将允许您将游戏世界设置、事件和更新与实体逻辑分离

您提到的“消息系统”称为应用程序协议,可以是复杂的深奥二进制系统,也可以是我推荐的简单的人类可读字符串。当玩家移动时,服务器将向其发送一个在客户端可视范围内的实体列表。非玩家实体将以同样的方式运作。也就是说,向服务器请求执行操作的权限,或者请求获取服务器在移动并进入实体视图时先前发送的另一个实体的相关信息,然后服务器以适当的答案或信息进行响应


如果您使用套接字实现这一点,您将明显受益于固有的网络功能,因为服务器不会关心客户机是否连接在服务器运行的同一台机器上,或者客户机是否在整个大陆上。这可能没有用代码具体回答您的问题,但我希望这至少值得思考。

如果您在实体上方有一个对象进行管理,这通常会容易得多。(例如“世界”或“游戏”)它可以很容易地看到哪些实体与哪些其他实体接近,并相应地发送事件和通知

如果实体在更新时需要更多的上下文来做出有意义的决策,那么您总是可以以某种形式在该上下文中传递世界。但是,让世界管理实体的分区和放置,而不需要实体直接担心这一点


(还有,为什么是四叉树?对于2D rpg来说,粗网格可能更容易实现,也同样有用。)

但问题是引擎负责监控所有正在发生的事情和firi