最近我一直在尝试用C#编写游戏。我没有使用XNA,因为我认为如果我从头开始编写游戏,我会学到更多东西(尽管我使用的是多媒体引擎)。
我正在尝试设计一款2D RPG游戏 - 我知道这有点野心勃勃,但我至少对游戏的基本部分(即“锅炉板”代码)有了相当好的理解,而且我已经到了我不知道从哪里去的地方。
在2D游戏中,您可以通过在不同的“区域”中走动来完成游戏。一旦你点击'门户牌',你将被运送到下一个区域等。
我无法理解应该如何设置这些区域对象。这是我的第一个想法:每个区域都有一些不同的收集结构(例如,可见性四叉树,碰撞四叉树,AI实体列表等)。因此,如果我要在游戏中添加敌人实体,它将被放入可见性四叉树,碰撞四叉树(因为你可以与实体碰撞)和AI实体列表。当该区域收到更新请求时,它会告诉每个这些结构自己更新,这反过来告诉实体自己更新。到目前为止一切都很好。
我的问题是:如果这个敌人需要与其他物体通信怎么办?例如,它可能需要知道玩家是否在某个范围内。或者它是否被玩家击中。或者所有可碰撞物体都在该区域内(因此它可以寻找路径)。
解决此问题的第一个(也是坏的)解决方案是将每个实体传递给每个集合。但这显然会鼓励紧密耦合的物体,这并不好。
我想出的第二个解决方案是每个实体都能通过消息结构查询该区域。因此,敌人可以说“在我的位置的X距离内给我一个每个实体的列表”,该区域将返回一个答案。然而,这将变得越来越困难,因为我必须在该区域编码越来越多的可能性(“给我一个不在我自己的X距离内的实体列表”,“给我一个健康低于所有实体的列表X“等)。
我正在寻找的是对这种对象间通信问题的时间测试解决方案,基本上是如何设置一个区域。我想它也需要某种消息传递系统,虽然我不确定。
感谢阅读。
答案 0 :(得分:4)
我认为这类事情的最佳选择是使用Observer模式...创建事件(决定通用或具体是另一种设计决策)并让你的对象订阅他们需要的那些。 / p>
例如,当2个实体靠近时,您的引擎可以触发碰撞事件或接近事件,但这些事件只会被感兴趣的实体接收。您可以进行一些优化,以仅检查观察员被捕的那些条件。
我不知道这是否在游戏中是常见的,我从来没有在任何游戏中使用过它(但是),但我已经多次想过它,这是我最喜欢的选项。 / p>
答案 1 :(得分:4)
您可以查看Mediator pattern。它会允许你具有低耦合,但是,你将在中介对象中有很多代码以促进其他对象之间的通信。但我认为这是一个或另一个。然后这是更可取的。它还允许你更自由地做一些技巧,例如排队某些更新请求并在更合适的时间处理请求,或者批量处理大量请求而不是一个接一个地执行它们(假设)强加某种高架。
答案 2 :(得分:3)
一个方法就是设置客户端/服务器架构。因此服务器将处理所有游戏世界更新和内部逻辑,客户端只会询问服务器是否可以执行某些操作。然后服务器响应,然后客户端才会绘制并更新游戏屏幕。非玩家实体也会这样做。唯一的区别是客户端是人为控制的,其他实体是计算机控制的。这将允许您从实体逻辑中分离游戏世界设置和事件以及更新。
您提到的“消息系统”称为应用程序协议,可以是一个复杂的深奥二进制系统,或者我推荐的简单的人类可读字符串。当玩家移动时,服务器将向其发送一个在客户端可见范围内的实体列表。非玩家实体将以相同的方式运作。这是通过要求服务器执行操作的权限,或者是有关服务器先前在移动时发送并进入实体视图的另一个实体的信息,以及服务器使用适当的答案或信息进行响应。
如果您要使用套接字实现此功能,您将获得内在网络播放的明显好处,因为服务器无需关心客户端是否在运行服务器的同一台计算机上进行连接,或者客户端是否在整个非洲大陆。这可能没有专门用代码回答你的问题,但我希望这至少是值得深思的。
答案 3 :(得分:2)
如果您在执行管理的实体上方有一个对象,这通常会容易得多。 (例如,“世界”或“游戏”。)它可以很容易地看到哪些实体与其他实体接近,并相应地发送事件和通知。
如果实体在更新时需要更多上下文来做出有意义的决策,那么您可以始终以某种形式在该上下文中传递世界。但是,让世界管理实体的分区和放置,而不是让实体直接担心这一点。
(另外,为什么是四叉树?对于2D rpg,粗网格实现起来可能要简单得多,同样有用。)