mcse 发表于 2009-7-22 11:45:05

如何让对象移动时遇到障碍物智能的绕过去

RT,我使用碰撞事件的反弹actions,但是会卡在那里不动了
那位能告诉我如何处理

血色冰凌 发表于 2009-7-22 15:19:39

运动设计帮助你在避免与另一实例(比如:墙)碰撞的情况下将某实例从给定位置移动到另一位置。运动设计是一个有难度的项目。几乎不可能给出一些能够在任何情况下正常运作的普通函数。同时,计算碰撞运动非常耗费系统资源。所以使用这些函数时必须非常小心仔细。当你使用以下任一函数时请将这些建议记到心里。
Game Maker 提供了一些不同形式的运动计划。最简单的形式允许一个实例朝某特定目标方向步进,可能的话尽量走直线但是如果有要求的话可以取不同的方向。这些函数应当在实例的并行事件 (step event) 中使用。对应的运动计划动作库也是可用的 :


mp_linear_step(x,y,stepsize,checkall) 这个函数作用为让实例朝指定位置( x , y )直线步进。每一步的大小由参数 stepsize 设置。如果实例已经到位,实例不再移动。如果参数 checkall 为 true ( 1 ),实例遇到任意对象的实例都不会停止。如果为 false ( 0 ),实例碰撞到另一固体实例时就会停止。注意这个函数遇到障碍时不会试着绕路。它只会简单的停止。函数返回值为是否到达目标位置.
mp_linear_step_object(x,y,stepsize,obj) 除了参数 obj 实例为障碍,其他效果同上。参数 obj 可以是对象或是实例名。
mp_potential_step(x,y,stepsize,checkall) 和先前的函数类似,这个函数也是让实例朝指定位置步进。不同处是这个函数会试着绕过障碍物。当实例快撞上某一固体实例(或任何实例, checkall 为 true 时)时,会改变运动方向来避开实例并且绕开它。这个方法不能保证有效,但是在大部分简单应用中会非常有效的让实例朝目标移动。函数返回值为是否到达目标位置。
mp_potential_step_object(x,y,stepsize,obj) 除了参数 obj 实例为障碍物,其他效果同上。参数 obj 可以是对象或是实例名。
mp_potential_settings(maxrot,rotstep,ahead,onspot) 先前的函数利用的一些参数可以使用这个函数改变。以下方法都有全局性。首先试着朝目标直线移动。可以使用参数 ahead (默认值为 3 )设置前面有多少步。减少这个值意味着实例将在延后开始改变方向。增加这个值意味着提前开始改变方向。如果检测到将要碰撞,实例会开始朝向最佳方向,偏右或是偏左。根据参数 rotstep (默认值为 10 )的大小决定在多少步中改变朝向。减少 rotstep 的值会使得实例有更多移动的可能性但速度也会更慢。参数 maxrot 解释起来有一点难度。实例有一个当前方向。参数 maxrot (默认值为 30 )为在一步里面允许改变当前方向的最大值。所以说即使实例可以直线移动到目标,只要不超过改变方向的最大值,它就会这样执行。如果你把 maxrot 设得很大,实例就可以在每一步都改变很多方向。这样可以使它更简单的寻找一段短路径,但同时整个路径会变得非常丑陋(路线歪七歪八的 … )。如果把值设得很小,路线就会很平滑但同时它可能会绕很远的路费很多时间(有时候甚至找不到到目标的路)。没有创建步时,实例的行为会建立在参数 onspot 上。如果 onspot 值为 true (或 1 ,为默认值),实例会根据 maxrot 的大小在自己的位置上旋转。如果值为 false (或 0 )实例就不再移动。如果实例为车辆时,设为 false 比较好,但同时会减少寻路成功的机会。

血色冰凌 发表于 2009-7-22 15:20:35

不过这个功能的核心就是A*算法……而且很多游戏厂商都不能完全解决这个问题

mcse 发表于 2009-7-22 17:19:57

貌似我用碰撞事件的反弹与随机移动actions可以解决

血色冰凌 发表于 2009-7-23 08:29:25

当你要让控件从最短距离向目标点移动时就需要这些函数了
比如很多RTS中的移动
不过也有不少RTS解决不好这个问题就对了

franniss 发表于 2009-7-23 19:18:56

这个功能可以无限复杂
由于主要应用于处理效率要求高的 RTS 游戏,效率与功能存在矛盾,是永恒的课题之一

http://frannisss.ys168.com/
Gamemaker资料 / 进阶 / astar_gm6.gm6

上传个A*寻路参考~
页: [1]
查看完整版本: 如何让对象移动时遇到障碍物智能的绕过去