yxhssmm 发表于 2011-4-11 16:26:51

有没有自带A星算法的范例呢,实在不知道用。

卡在这里很久了。其它方法都不大理想。


另一些函数使用了更复杂的机构使用了一种基于网格的方法(有时候称它为 A* 算法)。寻路更容易成功(尽管还是有失败的可能)并且路线更短,缺点是需要很多操作。以下都是全局概念。首先我们在房间内放入一网格(相应的部分)。你可以选择精致的网格(较慢)或是粗糙的网格。接下来,我们要探测所有的相关对象与网格单元交叠的地方(不管是碰撞盒或是精确检测)并且对这些单元作禁止的标记。即使只是和障碍物部分交叠,单元会全部被标记为禁止通行。最后我们指定一个开始和一个目标位置(必须放在空白单元上),函数就会计算他们之间的最短路径(实际上是最接近最短路径)。路径会在中间空白的单元上行进。所以如果单元足够大到能在中心完全放下实例,函数就会成功。接下来你可以把这个路径给一个实例 。
基于网格的方法 十分强大(在很多专业游戏中使用)但是要求你仔细的考虑如何使用。你必须决定哪个区域以及单元大小比较合适。同样必须决定哪个对象必须避开并且决定精确检测是否必要。所有这些参数都强烈影响到寻路的效果。
特别需要注意,单元的大小十分重要。要记住单元必须要足够的大,大到能将移动的对象完全放入单元的中心。(注意对象原点的位置。同样要了解如果对象的原点不在它的中心,你就可以移动路径)另一方面,单元越小路径越容易存在。如果单元和障碍物之间的开口太大路径会闭合,因为所有的单元都和一个障碍物交叠。
基于网格方法的实际函数如下 :

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 工具。

yxhssmm 发表于 2011-4-17 18:25:04

第一次提问 就此淹没 自力更生吧。
不过做出来的东西没有人指导优化 的确痛苦

埃兰蒂菲丝 发表于 2011-4-19 11:00:34

这里人少,我们不常来~我稍微提点一下吧~

mp_grid_create(left,top,hcells,vcells,cellwidth,cellheight) 这个函数建立网格。

这个函数将你的房间看做是一个网格房间,比如你的房间现在是640x480的,那么我们可以建立一个网格为这样:
grid = mp_grid_create(0,0,20,15,32,32)//此段意义为,建立一个网格,坐标从0,0开始,网格横向为20单位,纵向为15单位,每个横向单位宽度是32像素,纵向也是32像素,把这个表格赋给变量grid(之后以下所有函数里的id,就是grid啦)

接下来,我们标记这个网格内,那一个格子不能通行:
mp_grid_add_cell(grid,15,3)// 标记grid的横向第15个,纵向第3个格子不能通行。

最后生成路径
my_path = path_add()//创建一个新路径
mp_grid_path(grid,my_path,0,0,640,480,1)
这样my_path这个路径,就是从你指定的0,0到640.480这2个坐标之间行走的路径,当然如果在这条路径中间有标记禁止通行的格子,他就会绕开他,最后一个参数是你是否用斜角,也就是说你的对象在移动的时候,是否可以用斜角上的网格,否则只能用上下左右,前者走起来很自然,后者走起来只能笔直走,当然某些SLG游戏需要这样的走位方式。

yxhssmm 发表于 2011-4-29 20:58:53

那么一般都在哪里讨论呢?还是GM用的人实在太少。
一开始学就选择了大工程 遇到了无数的问题 都是自己范例想办法解决的 所有的功能实现的是那么勉强 总觉得还有更好的方式 没有一个好的学习环境真的好难进步 这让我非常怀念学BLENDER时的感觉。

franniss 发表于 2011-5-3 05:22:09

抱怨解决不了问题。

2楼的讲解你也没认真回复吧。你渴求别人帮你,至少态度上要付出诚意。
页: [1]
查看完整版本: 有没有自带A星算法的范例呢,实在不知道用。