缓动和弹性运动算是高级运动刚开始就接触到的,就缓动的使用方式就有很多的变化。所以这两个也是我今天总结的一个重点。只是对公式做一个总结,也好以后的查证。为国庆这几天的也找点事情做。
1、缓动
var dx:Number = targetX - sprite.x; var dy:Number = targetY - sprite.y; vx = dx * easing; vy = dy * easing; sprite.x += vx; sprite.y += vy;
物体的缓动到目标点,我们根据上面的公式会发现先物体会无限接近目标点,但是不可能真正到达不标点,一直这样下去是对CPU资源的损耗,所以什么时候让缓动停止,也应该注意。我们都知道物体显示位置的最基单位是像素。而像素是不可能小于1的,所以我们根据这一点来判断什么时候停止缓动。
if(Math.abs(targetX - sprite.x) < 1 || Math.abs(targetY - sprite.y) < 1){ sprite.x = targetX; sprite.y = targetY; //do other things }
当然缓动并不只适用于运动方面,颜色,透明度,旋转等都会用到缓动。至于一些复杂的缓动,大致原理也是基于以上的基本公式,主要就是多了一些影响点。
2、弹性运动
我们看着弹性运动很复杂,其实仔细梳理下来,弹性运动主要是加速度在发生不断的变化。所以我们可以很好的理解弹性公式。弹性的变化和展示有很多种,所以在此也详细总结一下,弹簧链,多点弹性,弹簧连接多个物体的代码示例。
2.1 弹性(二维弹性只是多了一个方向上的速度而已)
var dx:Number = targetX - sprite.x; var ax:Number = dx * sprint; vx += ax; sprite.x += vx;
2.2 高级弹性效果
2.2.1 弹簧在哪里?
为了以后更好的展示,我们最好能够将弹簧显示出来,这里我们通过一根线来说明弹簧的变化。只需要在弹性位移变化下面加上这个代码就可以了,方法如下:
graphics.clear(); graphics.lineStyle(1); graphics.moveTo(sprite.x,sprite.y); graphics.lineTo(mouseX,mouseY); //这里给出的是鼠标垫为弹簧节点
2.2.2 弹簧链
弹簧链的原理并不复杂,相当于下一个物体的支点是上一个物体的位置,所以们最好的方法还是对弹簧方法进行一些封装。这样我们只需要一次添加相应的物体位置即可,当然第一个点得于鼠标位置为参照。
//前者为添加的物体,后者为影响点 moveBall(sprite_1,sprite_2.x,sprite_2.y){ //弹性公式套用 var dx:Number = sprite_2.x - sprite_1.x; var dy:Number = sprite_2.y - sprite_1.y; vx += dx * spring; vy += dy * spring; sprite_1.x += vx; sprite_1.y += vy; }
2.2.3 多点弹性
方法同上,只不过影响物体变成了同一个,我想这就很好理解了,通过一个循环来便利影响点的作用,然后添加最终生成位移偏移。很好解决。循环如下:
for(var i:int = 0;i < numHandles; i++){ var handle:Ball = handles[i] as Basll; var dx:Number = handle.x - sprite.x; var dy:Number = handle.y - sprite.y; sprite.vx += dx * spring; sprite.vy += dy * sprint; } sprite.x += sprite.vx; sprite.y += sprite.vy;
2.2.4 物体间弹性影响
也就是相互是自己的引用点,两个球就得写一对相互影响,三个球就得写3对相互影响。所以还是很好理解的。在此就不多提了。