AS3 缓动加速动画

我们平时写的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) <= .25) // flash as3 最小位移单位
//			{
//				ball.x = targetX;
//				stage.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
//				trace("onCom");
//			}
			
			// 2、均加
			addX = easing * dx;
			var dx1:Number = startDistance - (targetX - (ball.x + addX)); // 反向预计值距离,假设:总距离为:100,我动了,10,那么剩90,而我这个求的正这个是dx1 = 90
			addX = easing * dx1;
			
			addX = addX > 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();
	}
}


该代码可直接运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值