所有的运动都借助帧事件或定时器来做,可以只使用一个帧事件或一个定时器来完成所有运动的监听和运算,节省开销。
运动是变化,它的普遍做法是:第一初始化运动条件,二根据运动的公式或模型运算,三更新物体的坐标或其他属性。核心的操作都在第二步里面。书中贯穿了很多物理概念,和基础的运动联系紧密的就数向量这个概念了。
向量这里不做详细介绍,简单的说就是方向加大小。向量在这里面充当的就是变化量的这个部分,对变化量做相应的操作就能得到我们想要的代码了,剩下的就是第三步,把处理好的变化量更新到操作对象的属性上,达到运动的最终效果。
接下来看看一些基础的运动:匀速、变速、摩擦力、缓动、弹性。这里引入vx、vy,它就是运动里面要用到的变化量。
匀速、变速可以归为一类运动,他们都可以通过简单的加减操作,使vx、vy变化,然后更新x、y坐标上:
vx += 5; vy += 5; x += vx; y += vy;
匀速运动就是 vx+=0 (y坐标类似)的运动。也可以认为5就是加速度a。
摩擦力运动,是引入一个降低vx、vy值的量,即物理的摩擦系数:
vx *= f; vy *= f; x += vx; y += vy;
f是小于1的值,负责不断减小变化量的值,这样当变化量更新到坐标值上的时候,会越来越小,最终停下。
缓动、弹性可以归为另一类运动,他们的运算都伴随着成比例的变化因素。
dx = targetX - object.x; vx = dx * easing; x += vx;
摩擦力直接修改变化量,缓动则是先成比例的修改距离值,再把距离作为变化量更新到坐标上,这样就得到了一个每次都变化总距离的几分之几的缓动效果。
dx = targetX - object.x; ax = dx * spring; vx += ax; x += vx;
相比缓动,弹性运动又多了一步操作,把处理后的距离,这个值是修改变化量的,修改后的变化量不断的更新给x坐标,只要ax不为零,这种更新会一直运行,直到ax最终把vx抵消让物体停下来,处在这个过程里物体就在目的点附近来回波动了,形成最终的弹性效果。