2.kid移动时触碰方块的机制。
在引擎内部的实现上,如果以当前的速度运动后不会碰到方块的话,那么就继续运动;
如果碰到了,则先后进行横向移动和纵向移动的判断:先沿着横向移动的方向一直移动,直到碰到方块;再沿着纵向移动的方向一直移动,直到碰到方块。
那么,问题是:“沿着移动方向移动一段距离直到碰到方块”(即gm中move_contact_solid()函数)这一操作是怎样实现的。
如图,在jtool中进行一次满力跳,并截取落地前的最后一帧和落地时的第一帧作为比较,并观察y坐标的变化:


我们可以看到,尽管kid的纵向速度为小数,但落地前后的ya根本没有发生变化。y坐标在落地前后只有整数部分发生了变化。由此可以推断出上文中“移动...直到碰到方块”的操作方式:
//用了c++语言来表示,因为我根本不会gm语法qaq
//hspeed同理
int step=player.vspeed<0?-1:1;
while (!(player.touchWall()))
player.y+=step;
上面代码只是一种可行、直观(且朴素)的实现方式,关于优化的方法、gm内部究竟是怎么实现的,暂且放下不云。