GameMaker8.0 :新手教程 Part 15 -路径与运动-

分类栏目:gamemaker教程

732

GameMaker8.0 :新手教程 Part 15 -路径与运动-

本章内容位于GML汉化文档21-26

1、运动函数

第八章运动初步中,我们介绍了最基本的运动函数move_towards_point(x,y,speed),现在我们将学习与它共处于GML汉化文档21-22页的其他运动函数。(只选取重要的以及难理解的讲解,并不是全讲。)
motion_set(dir,speed) :设置运动。这个函数作用不大,motion_set(a, b);即等效于:direction = a; speed = b;
motion_add(dir, speed) :根据矢量叠加速度。如果没有学习过矢量可能会不懂,假设物体原速度为spd1,原方向为dir1,则执行motion_add(dir2, spd2);得到的物体运动速度spd3和dir3如下图所示:
GameMaker8.0 :新手教程 Part 15 -路径与运动(五)-
move_wrap(hor,vert,margin) :下面是官方的解释:
离开房间到另一边时卷动实例。参数hor为是否水平卷动(1或0),参数vert为是否垂直卷动(1或0)。参数margin为卷动前离原点多远时实例必须离开房间。等于围绕房间的一圈留白。这个函数在离开事件(outside event)中使用非常具有代表性。
什么叫卷动?说白了就是像诺基亚上的贪吃蛇那样,从上面穿墙,会从下面出来,从左边穿墙,会从右边出来。
如果还是不懂,就来看一下效果图:
GameMaker8.0 :新手教程 Part 15 -路径与运动(五)-
接下来说明一下参数margin,这个参数填写0的时候,只要实例的坐标(x,y)超出了屏幕的边界,就会自动传送到对面。但是当坐标超出屏幕边界时,实例本身的精灵一般来讲还有一半仍在房间里,卷动时就会有一种不和谐的感觉。这时候就要调大margin的值,margin的作用是,当实例离开房间后,还要再超出相当于margin的值的像素,才会发生卷动,并且传送到对面时,也是传送到屏幕外margin个像素的位置。
move_bounce_solid(adv) :遇到固体实例反弹。这并不是一个设置属性的函数,写在create事件是无效的,必须写在step事件或者碰撞事件中。adv是advanced的缩写,值为1或0,意思是是否开启高级反弹。普通反弹只考虑水平面和垂直面,而高级反弹会考虑斜面的反弹。(注意:在只有水平面和垂直面的情况下,普通反弹和高级反弹是完全一样的!)
效果如下,上面是普通反弹,下面是高级反弹:
GameMaker8.0 :新手教程 Part 15 -路径与运动(五)-
move_bounce_all(adv) :遇到所有的实例都反弹。
move_contact_solid(dir,maxdist) :这是我们在第十二章碰撞中提到过的函数。它的含义是,令实例以最大速度不超过maxdist向方向dir运动,直到接触到固体为止。如果实例和另一固体实例之间的距离小于实例的速度,则move_cantact_solid函数会令二者紧紧地贴在一起,既不重叠也没有任何空隙。这就是为什么我们在第十二章中使用这个函数的原因了。
move_contact_all(dir,maxdist) :与上一个函数类似,这个函数是遇到任何实例都会停止。
move_outside_solid(dir,maxdist) :与move_contact_solid相反,这个函数是向方向dir运动直到离开固体实例为止。如果最开始执行这个函数的时候实例就不与任何固体实例重叠,则实例不会运动。根据官方文档的建议,一般用于分离重叠的实例。
move_outside_all(dir,maxdist) :不解释,用心感受。

2、路径

路径(Paths)是GM的一种游戏资源,保存在Paths文件夹下。
GameMaker8.0 :新手教程 Part 15 -路径与运动(五)-
由于路径的特殊性,很难给定一种标准的命名法,简单的路径一般使用方向加距离(格子数),如上图中的pathDown16,复杂路径一般根据实际用途或作用对象来命名。
GameMaker8.0 :新手教程 Part 15 -路径与运动(五)-
在上面点点,就能生成一条路径。当我们把路径附加到实例身上时,实例就会按照这条路径的轨迹来运动。
现在先来解释一下左上角框内每一个点都有的sp属性。这个sp指的是speed,指实例在经过路径的这个点时,速度将会变为多少。注意!这个sp所指的速度是相对速度,并非绝对速度。sp的默认值为100,表示“原速度”。举个例子,如果某个点sp设置为200,当实例以速度为5在路径上运动时,经过这个点后,速度就会变成:5*200/100=10,而不是真的变成200。
连接模式有直线和平滑曲线两种,“精度”指的是平滑曲线的平滑度,取值范围为1-8,可以自己试着调整一下看看效果。
“封闭”指的是路径首尾是否连接。

在右上角,你可以选择一个参考房间:
GameMaker8.0 :新手教程 Part 15 -路径与运动(五)- 参考房间的作用是让你更好制作路径,但是注意,在参考房间中绘制路径,并不会对被参考的房间造成任何影响。
GameMaker8.0 :新手教程 Part 15 -路径与运动(五)-

3、路径函数与变量

path_start(path, speed, endaction, absolute) :先来看看官方解释:
path_start(path,speed,endaction,absolute)为当前实例开始一段路径。参数 path 是你想开始的路径名。参数 speed 是跟随路径的速度。负的 speed 意味着实例沿着路径往回移动。参数 edaction 是设定当实例到达路径的终点时发生的事件。 有以下几个值可供使用 :
0: 停止路径
1: 从开始点继续(如果路径没有闭合,直接跳到开始点)
2: 从当前点继续
3: 反转路径,改变速度的符号
参数 absolute 应该是 true 或是 false ( 1 或 0 )。设为 true 时和路径是绝对的关系( absolute )。设为 false 时路径和实例的当前位置是相关的关系( relative )为了更精确地设定,如果 speed 是正的,当前位置就是路径的开始点,路径沿着当前位置而行。 speed 为负值时,当前位置就是路径的终点,路径沿着当前位置往后移动。 
要注意的几点是,首先path_start是应当只执行一次的函数,这意味着它应该写在create事件或alarm事件或在with结构中被使用,而不应该在step事件这类每一步都会执行一次的事件中出现。其次,endaction是"end action",即“结束的行为”,并不是一个单词。第三,关于绝对路径,如果absolute为0,则实例会以自己的位置作为路径的起点运动,如果absolute为1,则实例会先把自己移动到路径的起点的坐标上,再运动。

path_end() :结束跟随路径。
path_index :实例正在使用的路径。不可被改变,改变路径应使用path_start()。
path_position :实例处在路径的哪个位置。以起点为0,终点为1,在路径中间则按照比例输出0-1之间的小数。
path_positionprevious :实例以前在路径的位置。和xprevious与yprevious是同样的理解。
path_speed :改变或返回跟随路径的速度。
path_orientation :这个变量可以让你先旋转路径,再跟随路径运动。默认值是0,不旋转。
path_scale :这个变量可以让你放大/缩小路径。
path_endaction :改变或返回路径的endaction。

4、运动设计

虽然它在GML的汉化文档里有这~~么长:
GameMaker8.0 :新手教程 Part 15 -路径与运动(五)- GameMaker8.0 :新手教程 Part 15 -路径与运动(五)-
但是我并不打算怎么讲。首先,官方文档我觉得已经讲得很详细了,基本上看一遍就知道怎么用。其次,这些函数很少用得上,所以也建议各位不要花太多时间在上面,等到要用的时候再来看也不迟。
这里用的最多的函数应该是mp_linear_step(x,y,stepsize,checkall)了,还记得我们在第八章运动初步的时候提到,move_towards_point(x,y,speed)并不会在到达(x,y)后停止,并且推荐使用mp_linear_step吗?使用mp_linear_step(x,y,speed,true)就可以实现到达(x,y)之后自动停止了。注意!这个函数与move_towards_point不同,它必须写在step事件里。