ActionScript学习笔记(七)——缓动和弹性运动

缓动和弹性运动算是高级运动刚开始就接触到的,就缓动的使用方式就有很多的变化。所以这两个也是我今天总结的一个重点。只是对公式做一个总结,也好以后的查证。为国庆这几天的也找点事情做。

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对相互影响。所以还是很好理解的。在此就不多提了。

原文地址:https://www.cnblogs.com/flashbird/p/3347657.html