我正在编写角色扮演游戏,以获得乐趣和学习。我正计划建立一个整体游戏世界,在那个游戏世界中,我计划拥有玩家和怪物可以移动的“区域”。我们只说“区域”为20x20网格,此网格上的每个“图块”为64像素宽。玩家或怪物可占据一个1x1的牌并以每步1个牌的步幅移动。
当游戏玩法发生时,我如何了解怪物和玩家之间的相互了解?我不知道我会使用什么样的数据结构,或者我是如何产生怪物并让它们在区域中四处游荡。
注意:我似乎提到使用某种树结构(四叉树),但我真的不明白它们将如何应用。
答案 0 :(得分:3)
我只是按区域映射怪物:
Map<Zone, Monster> MonsterByZones = new Map<Zone, Monster>();
当角色进入特定区域时,我猜该区域应该遍历它包含的所有怪物并要求他们做出决定:
foreach(Monster monster in MonsterByZones[currentZone].Values)
{
monster.MakeDecision(character);
}
世界应该有一种改变角色区域的方法:
world.ChangeZoneIfNeeded(character);
这是实现RPG的简单方法!
玩得开心!
答案 1 :(得分:1)
在众所周知的流行游戏中,这种意识被实现为“仇恨列表”。每个生物都有这个清单。它最初是空的。每当生物进入敌人时,就会填充此列表。当一些减少仇恨的事件发生时,从列表中删除。就像距离达到一定的上限,或者相反的生物死亡,做一些仇恨减少行为等。
您的设计基于区域是好的,因此您最终可以将引擎扩展到多个流程/机器。绝对不应该在可扩展引擎中有任何单例/全局结构,或者当你的游戏包含数百万个生物时,设计将无法扩展
答案 2 :(得分:1)
您需要深入了解您的规范并决定“了解彼此”的含义。知识本身毫无意义;这是你根据重要的知识采取的行动。这些行动的性质决定了你所需要的知识类型。通常,任何单个演员都可以在需要时查询其世界,以获取有关附近演员的信息。在任何情况下,这些信息都应该存在于演员之外。
答案 3 :(得分:0)
首先,您应该为每个区域制作一个怪物列表。或者deque,或任何适合你的数据结构,它基本上需要是线性的,允许随机和线性访问,并允许从任意位置删除,以防你删除死怪物(如果你不删除,这不是例如需要)。
每个怪物只会搜索此区域内的其他怪物和玩家的列表,并以这种方式跟踪它们。
低效?是。
一个好的解决方案?取决于区域中的实体数量(如果没有像100万个实体那样,环路也不是那么糟糕,特别是在PC或其他强大的平台上)。
如果您正在努力寻求最快的解决方案,那么请选择树形结构,但这相当复杂。
答案 4 :(得分:0)
一种非常简单的方法是将游戏板表示为二维整数数组。您可以在数组的每个元素中设置和清除单个位,以表示占据该区块的玩家/怪物的类型,以及其他类似地形类型等。
或者,您可以为游戏中的所有“Actors”创建基类,然后从Actor派生Player和Monster类。基类可以跟踪网格上的位置等常见事物。派生类可以跟踪特定于玩家或怪物的事物。
如果你构建一个代表游戏区的“Zone”容器类,它可能有移动actor,定位actor等的方法。在内部,该类不需要将棋盘表示为网格 - 它可能只是一个演员名单。
您添加到区域的每个Actor都可以维护对其所在区域的引用。这将允许每个Actor检查区域中的其他actor。
答案 5 :(得分:0)
对于常规切片的地图,您希望使用二维数组,因为它将执行快速随机访问。数组中的每个条目都将保留其中存在的对象的引用或ID号(如果有)。如果您的对象想要与附近的图块或图块集上的某些内容进行交互,则它应该从与该图块对应的2D数组条目中获取相应的引用/ id。
您可以在游戏中使用树,其中空间不会划分为常规图块。树将空间划分为越来越小的区域,并且每个叶节点将保留对该区域中的对象的引用列表。树和2D数组都是“场景图”数据结构 - 它们跟踪哪些对象位于空间区域。