我们平时写的easing缓动系数,实现都是:缓动减速运动。
那么,要实现缓动加速动动,有位Q群朋友提出这个问题,一个星期前,还想着帮忙写出来。但当时发现写不出来。
一个星期后,突然在群里又看到这个问题的出现,突然灵感一来,写出了效果,但需要两个辅助变量:
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.KeyboardEvent;
/**
* [description]
* @author Jave.Lin
* @date 2013-11-14
**/
[SWF(width="1000", height="600")]
public class TestMotion extends Sprite
{
private var ball:Ball;
private var targetX:Number = 600; // 目标位置
private var easing:Number = .07; // 均减、加的缓存系数
private var startDistance:Number; // start distance 记录下,刚开始距离值
private var curAddDistance:Number; // 记录当前已累加过的距离值
public function TestMotion()
{
super();
stage.frameRate = 60;
stage.color = 0x88888888;
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
ball = new Ball();
addChild(ball);
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(e:Event):void
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
}
private function onKeyDown(e:KeyboardEvent):void
{
ball.x = 100;
ball.y = 100;
startDistance = targetX - ball.x;
curAddDistance = 0;
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(e:Event):void
{
var t:Number;
var dx:Number = targetX - ball.x;
var addX:Number;
// 1、缓动减速
// addX = easing * dx;
// addX = addX > 0 ? (addX < .25 ? .25 : addX) : (addX > -.25 ? -.25 : addX); // flash as3 最小位移单位
// ball.x += addX;
// if(Math.abs(dx) 0 ? (addX < .25 ? .25 : addX) : (addX > -.25 ? -.25 : addX); // flash as3 最小位移单位
curAddDistance += addX;
ball.x += addX;
trace("addX : " + addX);
trace("Math.abs(dx) : " + Math.abs(dx));
if(curAddDistance >= startDistance) // flash as3 最小位移单位
{
ball.x = targetX;
stage.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
trace("onCom");
}
}
}
}
import flash.display.Sprite;
class Ball extends Sprite
{
public function Ball()
{
graphics.clear();
graphics.beginFill(0xff0000, .5);
graphics.drawCircle(0, 0, 15);
graphics.endFill();
}
}
该代码可直接运行。