最近,我一直在尝试用C#编写游戏代码。我没有使用XNA,因为我认为如果我从头开始编写游戏会学到更多(尽管我使用的是多媒体引擎)。
我正在尝试设计一款2D RPG游戏--我知道这有点野心勃勃,但我至少对游戏的基本部分(即“样板”代码)有相当好的理解,而且我已经到了不知道从哪里去的部分了。
在2D游戏中,您可以通过在不同的“区域”中漫步来完成整个游戏。一旦你点击了“门户磁贴”,你就会被转移到下一个区域,等等。
我很难理解这些区域对象应该如何设置。这是我的第一个想法:每个区域都有几个不同的集合结构(例如,可见性四元树,碰撞四元树,AI实体列表等)。因此,如果我要添加一个敌方实体到游戏中,它将被放入可见性四元树、碰撞四元树(因为你可以与实体碰撞)和AI实体列表中。当区域接收到更新请求时,它会通知这些结构中的每个结构进行自我更新,而这些结构又会告知实体进行自我更新。到目前为止,一切正常。
我的问题是:如果这个敌人需要与其他物体通信怎么办?例如,它可能需要知道玩家是否在它的某个范围内。或者它是不是被玩家击中的。或者所有可碰撞的物体都在该区域的什么地方(这样它就可以通过路径找到)。
这个问题的第一个(也是最糟糕的)解决方案是简单地向每个实体传递一个对每个集合的引用。但这显然鼓励了紧密耦合的对象,这是不好的。
我想出的第二个解决方案是让每个实体能够通过消息结构查询区域。因此,敌人可以说“给我一个在我位置X距离内的每个实体的列表”,该区域将返回一个答案。然而,这将变得越来越困难,因为我将不得不在该区域中编写越来越多的可能性(“给我一个不在我X距离之内的实体的列表”,“给我一个健康低于X的所有实体的列表”等等)。
我正在寻找的是一个经过时间验证的解决方案,用于解决对象间通信的问题,以及基本上如何设置一个区域。我想它也需要某种消息传递系统,尽管我不确定。
感谢您的阅读。
发布于 2009-11-05 09:31:21
你可以查一下Mediator pattern。这将允许您具有低耦合,但是的,您将在中介器对象中有大量代码,以促进其他对象之间的通信。但我觉得不是一个就是另一个。这样就更好了。它还可以让您更自由地使用技巧,如对某些更新请求进行排队,并在更合适的时间处理这些请求,或者对大量请求进行批处理,而不是逐个执行,这(假设)会产生某种开销。
发布于 2009-11-05 09:10:49
我认为这类事情的最佳选择是大量使用观察者模式……创建事件(决定如何通用或具体是另一个设计决定),并使您的对象订阅它们所需的事件。
例如,当两个实体接近时,您的引擎可以触发排序或接近事件,但这些事件将仅由感兴趣的实体接收。你可以做一些优化,只检查那些有观察者暂停的条件。
我不知道这是不是游戏中常见的地方,我从来没有在任何游戏中使用过它,但我已经考虑过很多次了,这是我最喜欢的选项。
发布于 2009-11-05 09:59:12
嗯,一种方法是建立一个客户端/服务器架构。因此,服务器将处理所有游戏世界的更新和内部逻辑,而客户端只会询问服务器是否可以执行某些操作。然后,服务器会做出响应,客户端才会绘制并更新游戏屏幕。非玩家实体也会做同样的事情。唯一的区别是客户端是由人控制的,而其他实体是由计算机控制的。这将允许您将游戏世界的设置、事件和更新与实体逻辑分开。
您提到的“消息系统”称为应用程序协议,可以是复杂的深奥的二进制系统,也可以是我推荐的简单的人类可读的字符串。当玩家移动时,服务器将向其发送客户端可见的实体列表。非玩家实体也会以同样的方式运行。这是通过向服务器请求做事情的许可,或者请求关于服务器先前在其移动并进入该实体的视图时向其发送的另一实体的信息,并且服务器用适当的答案或信息进行响应。
如果您使用套接字实现这一点,您将获得固有的网络游戏的明显好处,因为服务器不会关心客户端是否在运行服务器的同一台机器上连接,或者客户端是否在整个大陆上。这可能没有具体地用代码回答您的问题,但我希望它至少是值得思考的。
https://stackoverflow.com/questions/1677706
复制相似问题