如何让角色扮演游戏中的生物跟踪彼此

时间:2010-02-10 04:05:13

标签: c#

我正在编写角色扮演游戏,以获得乐趣和学习。我正计划建立一个整体游戏世界,在那个游戏世界中,我计划拥有玩家和怪物可以移动的“区域”。我们只说“区域”为20x20网格,此网格上的每个“图块”为64像素宽。玩家或怪物可占据一个1x1的牌并以每步1个牌的步幅移动。

当游戏玩法发生时,我如何了解怪物和玩家之间的相互了解?我不知道我会使用什么样的数据结构,或者我是如何产生怪物并让它们在区域中四处游荡。

注意:我似乎提到使用某种树结构(四叉树),但我真的不明白它们将如何应用。

6 个答案:

答案 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数组都是“场景图”数据结构 - 它们跟踪哪些对象位于空间区域。