追逐和躲避

kurt8276 2005-01-30 10:41:01
追逐和躲避
第二章 追逐和躲避
在这章中我们主要关心的是追逐和躲避这个普遍的问题.
不论你开发一个太空射击,还是策论模拟,或者是RPG,机会使你试图使你的游戏机器可以追逐或是逃离游戏者。在这行动游戏情形可能是敌人的太空船和玩家的太空船。在冒险类游戏可能是巨人或者别的怪物找到你。在FPS中交战的模拟你可能作导弹轨迹向导来打击玩家或者玩家的航空器。无论无何,你需要一些逻辑使机器的捕食者去追逐,被捕食者逃跑!
追逐和逃跑由两部分组成。第一部分是决定是逃跑还是追逐?第二部分是追逐/逃跑的效果
。就是到达捕食者得到猎物,或者是被捕食者逃离捕食者足够远使它得不到!从某种意思上说 追逐逃避问题有三个因素决定:避免错误,追逐逃避是很复杂的。做个算法那你编程
虽然我们没考虑到避免错误。我们会今后讨论的。在这章中我们的问题是决定作出来!
在后面我们会用状态机和神经网络等来做!
最简单易于编程的是最普通的模型你可以用它来使你的捕食者追逐他的猎物包括通过每次循环改变捕食者和被捕食者的位置。这个算法不用注意被捕食者和被捕食者的移动方向和速度。虽然他的模型很无情因为捕食者要移向被捕食者除非有障碍物,我们会在后面有所讨论。
另外每个基本模型,其他模型你可行接受应为他们运行的更快依赖于你的游戏要求。例如,在游戏中有实时的物理引擎你可以考虑捕食者位置和速度,以使捕食者着途中截获猎物以代替无情的追逐(不明白,难道不一样吗?)。既然这样相关的位置和速度信息可以被用来输入给能够确定导向力的算法,例如是捕食者导向靶子。
在这章我们探索几个模型,从最基本的开始。我们给你例子和代码。

2.1躲避追逐的模型
我们说得容易,最简单追逐算法包括改变捕食者的坐标根据被捕食者的坐标以使它们之间的距离变小。这是实现追逐躲避最普通的模型。(在这个模型,躲避实质上就是追逐的逆运算,凭什么代替试图减少的距离,你却增加)
下面的代码,展示了这个模型
Example 2-1. Basic chase algorithm
// x轴
if (predatorX > preyX)

predatorX--;

else if (predatorX < preyX)

predatorX++;
// Y轴
if (predatorY > preyY)

predatorY--;

else if (predatorY < preyY)

predatorY++;
在这个例子,捕食者在(x,y),当捕食者位于坐标(x,y)。在每次循环捕食者都检查一下猎物的坐标。如果捕食者的x轴的坐标大于猎物的,捕食者的x坐标减少,移动靠近猎物的x坐标。相反如果捕食者的x坐标比猎物的小,捕食者的x轴的坐标要增大。相似的处理在y轴上。最后结果是捕食者接近猎物通过游戏的循环。

逃避的算法
Example 2-2. Basic evade algorithm

if (preyX > predatorX)

preyX++;

else if (preyX < predatorX)

preyX--?>;

if (preyY > predatorY)

preyY++;

else if (preyY < predatorY)

preyY--;

游戏域被划分成两快---方形,六边形等等游戏的位置。游戏玩家的位置是不连续的。移动是一步一步的。方向数是玩家可以使它前进方向有限的。在连续的环境中,位置用可以描述游戏任意位置的浮点数坐标描述。玩家同样可以延任意方向移动。
你可以应用图例的方法在这两个例子。无论你的游戏混合??或者连续移动。在 游戏中,x和y可以代表游戏区域内在表格中行和列。既然这样,x何y轴可也是整数。在连续的环境中,如果是3D游戏x y z轴实数表示迪卡尔坐标系。

这不用怀疑虽然简单,但是模型可以实现。捕食者可以无情的追逐猎物。
Example 2-3. Basic tile-based chase example

if (predatorCol > preyCol)

predatorCol--;

else if (predatorCol < preyCol)

predatorCol++;

if (predatorRow> preyRow)

predatorRow--;

else if (predatorRow<preyRow)

predatorRow++;

注意类似的
基础类型的模型是经常追逐/逃跑看上去都是数学的麻烦


2.2线性的追逐
在这章中我们要解释一些用线性的追逐和逃避的算法。线性的方法是捕食者采用直线路径朝向猎物。捕食者总是移动朝向猎物的当前的位置。如果猎物站着不动,捕食者依然试图径直移动到猎物的当前的位置。无论无何,如果猎物是移动的,路径没有必要是直线。捕食者仍然是试图移动朝向猎物的位置,但是随着时间的赶上移动的猎物。你使得路径变成曲线。

在图中,圆圈代表捕食者和猎物代表的区域。虚线和图形代表开始和中间的位置。游戏的场景在左边,猎物是不动的。因而捕食者采用直线冲向猎物。
游戏场景的右边,猎物随着时间沿着任意方向移动到猎物。每个时间步或者周期通过游戏的循环,捕食者移向猎物当前的位置。猎物的移动,捕食者从他初始的位置描绘出一条曲线。
结果如图例看到的比基础追逐算法的结果更自然。这章余下的我们展示两个算法线性算法的实现。一个算法是特殊的移动环境,另一个是两续环境的应用。

2。3不连续的环境的线性追逐

我们开始容易,环境在基础游戏中被划分为不连续的。这个地方确定的有限的移动不需要应用在连续的环境中。在连续的环境位置经常用浮点数变量代表。这些位置绘制最近的现实像素。当改变位置在连续的位置,你不能总是有限的移动来调整显示像素。显示像素有特色的是足够了,小数跳过在每个显示。
在基础游戏,无论无何,改变位置是限制的。真实的移动可以在程序中出现因为每步不用像素显示。最小化矩形游戏跳过出现在基础游戏。重要的移动尽是领进的当你改变位置。游戏用正方形的步伐,每给游戏的例子,提供8个可能的移动方向。这个限制产生了一个有趣的问题当捕食者,例如在例子中的旋转,追逐他们的靶子。旋转是有限的8各方向,但是数学说,没有方向可以正确的代表靶子的真实方向。在图中是进退两难的。
如你所看得,8个方向中没有一个直接朝向靶子。我们需要一个8各方向中确定邻近的移动。
如我们早期所展示的,你可以用简单的追逐算法是作旋转追逐玩家。它计算最小可能路径给玩家。所以,缺点是什么一个涉及到图形学。当你看到环境,简单的追逐模型不能总是出现在作品中看上去是个直线。
其他原因避免简单追逐模型是它可以产生令人不快的效果当你的产品中,例如当一群愤怒的巨人聚集到玩家。用简单的模型,他们可以所有的对角的最近的像素。这可以导致大门作单独的路径发起攻击。跟多的靠近的从不同方向到向目标。

...全文
144 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
chijingde 2005-02-03
  • 打赏
  • 举报
回复

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧