- 注册时间
- 2011-4-8
- 最后登录
- 2019-6-30
②入门
- 积分
- 63
|
卡在这里很久了。其它方法都不大理想。
另一些函数使用了更复杂的机构使用了一种基于网格的方法(有时候称它为 A* 算法)。寻路更容易成功(尽管还是有失败的可能)并且路线更短,缺点是需要很多操作。以下都是全局概念。首先我们在房间内放入一网格(相应的部分)。你可以选择精致的网格(较慢)或是粗糙的网格。接下来,我们要探测所有的相关对象与网格单元交叠的地方(不管是碰撞盒或是精确检测)并且对这些单元作禁止的标记。即使只是和障碍物部分交叠,单元会全部被标记为禁止通行。最后我们指定一个开始和一个目标位置(必须放在空白单元上),函数就会计算他们之间的最短路径(实际上是最接近最短路径)。路径会在中间空白的单元上行进。所以如果单元足够大到能在中心完全放下实例,函数就会成功。接下来你可以把这个路径给一个实例 。
基于网格的方法 十分强大(在很多专业游戏中使用)但是要求你仔细的考虑如何使用。你必须决定哪个区域以及单元大小比较合适。同样必须决定哪个对象必须避开并且决定精确检测是否必要。所有这些参数都强烈影响到寻路的效果。
特别需要注意,单元的大小十分重要。要记住单元必须要足够的大,大到能将的对象完全放入单元的中心。(注意对象原点的位置。同样要了解如果对象的原点不在它的中心,你就可以路径)另一方面,单元越小路径越容易存在。如果单元和障碍物之间的开口太大路径会闭合,因为所有的单元都和一个障碍物交叠。
基于网格方法的实际函数如下 :
[blockquote]mp_grid_create(left,top,hcells,vcells,cellwidth,cellheight) 这个函数建立网格。返回一个索引用于其它函数调用。你可以在同一瞬间创建并维持多重网格结构。参数 left 和 top 指定网格左上角的位置。参数 hcells 和 vcells 设置水平和垂直单元的数量。参数 cellwidth 和 cellheight 是单元的大小。
mp_grid_destroy(id) 销毁指定网格结构并释放空间。如果不再用到结构时记得调用这个函数。
mp_grid_clear_all(id) 将网格中的所有单元都标记为空。
mp_grid_clear_cell(id,h,v) 清除指定单元。单元 0 , 0 在最左上角。
mp_grid_clear_rectangle(id,left,top,right,bottom) 清除和指定矩形交叉的所有的单元(在相应的房间里)。
mp_grid_add_cell(id,h,v) 标记指定的单元为禁止通行。单元 0 , 0 在最左上角。
mp_grid_add_rectangle(id,left,top,right,bottom) 标记和指定矩形交叉的所有的单元为禁止通行。
mp_grid_add_instances(id,obj,prec) 标记所有与指定对象的实例交叉的单元为禁止通行。你可以通过参数 obj ,实例的 id 名来使用一个单独的实例。同样也可以使用关键字 all 表示所以对象的所有实例。参数 prec 为是否使用精确检测(只有当实例使用的精灵打开精确检测时才有效)。
mp_grid_path(id,path,xstart,ystart,xgoal,ygoal,allowdiag) 计算一条通过网格的路径。参数 path 必须指定一条已经存在的路径用来被电脑路径替代。参数 xstart 和 ystart 为路径的开始点, xgoal 和 ygoal 为目标点。参数 allowdiag 为是否允许使用斜角替代水平和垂直。函数返回值为是否寻路成功。(注意路径不受当前实例影响;是一条穿越网格的路径,不是某特殊实例的路径)
mp_grid_draw(id) 这个函数将空的单元绘成绿色,禁止通行的单元绘成红色。这个函数运行起来很慢这是用来做 debug 工具。
[/blockquote] |
|