吧务
level 13
〇、综述
GM内置了一些变量用来定义实例的运动情况,本篇中会介绍这些变量的用法及少量应用环境。但对于一些内置的移动方面的算法则不会提及和讨论。
下面将要介绍的内置变量为:
坐标类:x、y
速度类:speed、direction、hspeed、vspeed
加速度类:gravity、gravity_direction、friction
**注意:以下讨论全部不涉及“固体(Solid)”类型**
2014年11月26日 05点11分
1
吧务
level 13
一、坐标
坐标涉及的变量只有2个,x(水平坐标)和y(竖直坐标),单位是像素。和一般数学上的坐标系不同,gm里默认的原点(0,0)在房间的左上角,而y轴的正方向是向下。这里要注意的是,0这个值是在房间里的。也就是说对于640宽度的房间,处于“房间内侧”的x坐标是0-639,640就已经在“外侧”了。
当把一些实例放在房间里时,需要注意物体显示的位置还和精灵(sprite)的原点(Origin)设置有关。一个实例放在房间以后,绘制精灵(sprite)、碰撞判定等都是以精灵(sprite)的原点(Origin)放在该坐标时为基准。为了制作方便,RPG、ACT等类型的游戏会将原点放在精灵(sprite)的左上角,以便摆放方便;而STG类会放在中心(或尖端),以便弹幕生成时在不使用坐标偏移计算的情况下拼出漂亮的弹幕形状。
这些坐标都是以“房间”为基准的,一般来说也会和显示的一致。但以下情况会打破这个常规:
1、自定义绘制事件。当然了,如果你偏要让这个物体的绘制位置与实际坐标发生偏离,咱无话可说。
2、使用视角(Views)。视角设置会让游戏窗口显示范围与房间大小不一致,以达到只显示一部分房间或者多个小窗口观察的目的。此时每个物体的实际坐标仍然是它在房间中的位置,但已不是它在窗口中的位置。在制作用户界面(UI)时需要考虑好这一点,以免在视角移动时,UI被移动到屏幕外侧。
2014年11月26日 05点11分
2
吧务
level 13
二、速度
GM内置了4个变量用来控制物体的速度:
speed:表示速度大小(也可以叫速率),单位是像素每步
direction:表示速度方向,以水平向右为0,逆时针旋转一周360°,单位是度
hspeed:表示水平速度,向右为正,单位是像素每步
vspeed:表示竖直速度,向下为正,单位是像素每步
事实上,只用前2个或后2个变量,均可以定义出物体的运动情况,4个变量只是为了方便制作。GM的相关文档也说过,内部运算时还是以hspeed和vspeed为基础的。
使用时需要注意的几点包括:
1、当物体速度归零时,速度方向也会归零,而不是保持原状。所以弹幕生成时如果写direction=45;speed=8;是不会让这个物体向右上方运动的,需要先写速度后指定方向
2、若不进行“停止”,带有速度的物体会一直运动下去,甚至“穿怪”、“穿墙”、“穿过地表坠落”……//注:本篇中不讨论固体
3、这4个变量,前2个为1组,后2个为1组,修改任何一个变量时,均会在不改变同组变量的情况下对另一组的变量进行重新计算。换言之,不必担心改变方向时速度大小变了,或者改变竖直速度时水平速度变了。
4、GM中“按步进行运算”导致了数据的不连续性(离散性),比如从0,0开始以4的速度向右运动,是不会和10,0位置的物体重合的。
2014年11月26日 05点11分
3
吧务
level 13
三、重力和阻力
重力、阻力相关的内置变量有3个:
gravity:重力值,单位是(像素每步)每步,或者说像素每二次方步
gravity_direction:重力方向,默认是270(竖直向下)
friction:阻力值,单位是(像素每步)每步,或者说像素每二次方步
重力和阻力实际上都是一种加速度算法,他们会在每一步中改变一次速度,就像是速度的作用是在每一步中改变一次坐标。GM中重力和阻力的区别是,重力的方向固定,而阻力恒定与速度方向相反。
比如,一个物体的vspeed是8,重力是1,在没有其他改变的情况下,下一步时vspeed就会变成9。
另外,比如一个物体的speed是8,阻力是1,在没有其他改变的情况下,下一步时speed就会变成7,无论这个物体的方向是如何设置的。
一些看法、建议、tips:
1、对于水平、竖直可以分离考虑的游戏(如ACT),可以把竖直运动独立出来当成匀变速运动来处理,这里建议非常熟悉高一物理中《力和运动》一章的内容,能轻松处理自由落体、竖直上抛两类运动的计算。
2、虽然天体运动的基础是万有引力(重力),但在GM里用重力来生成圆周甚至椭圆运动属于自讨苦吃行为。
3、阻力不会将速度降低到0以下
4、重力的方向可以改变,在制作火箭加速升空等环节可以参考。
5、阻力可以设置成负值,有兴趣的可以试试。
2014年11月26日 05点11分
4
level 11
请问关于hp,mp的个体变量还有什么或者怎么声明?
2014年11月26日 10点11分
6
直接声明(用起始类事件,例如创建事件)
2014年11月26日 11点11分
回复 智_囊_小_太 :可以用obj_A.vara=0吗?
2014年11月26日 11点11分
一般在他本体内声明,自己里面弄vara = 0
2014年11月26日 12点11分
回复 z123k5 :嗯,谢谢
2014年11月26日 13点11分