2011年11月22日 星期二

[AS3] 殘影效果→Tween動畫路徑

BitmapData.colorTransform()
BitmapData.draw()
Tween()建構函式
public function Tween(obj:Object, prop:String, func:Function, begin:Number, finish:Number, duration:Number, useSeconds:Boolean = false)
建立 Tween 類別的實體。 可以使用建構函數並搭配 new 運算子:var myTween:Tween = new Tween()。



參數
obj:Object — 「補間動畫」的目標物件。
prop:String — 將會受影響的屬性名稱 (obj 參數值)。
func:Function — 要使用的加/減速函數名稱。
begin:Number — prop 參數的起始值。
finish:Number — 指出 prop 結束值的數字 (要使用補間動畫的目標物件屬性)。
duration:Number — 移動的時間長度。如果為負值或省略,則請設定為 infinity。
useSeconds:Boolean (default = false) — 旗標,指定是否使用秒數,而不使用影格數。 如果為 true,函數會使用秒數;如果為 false,則會使用相對於 duration 參數中指定值的影格數。



1001122_shadowA.swf


import flash.geom.ColorTransform;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.events.MouseEvent;
import flash.display.Sprite;
import flash.display.Graphics;
import fl.transitions.Tween;
import fl.transitions.Transition;
import fl.transitions.easing.Regular;
import fl.transitions.TweenEvent;

var finishX:Number;
var finishY:Number;
var duration:Number;
var tweenX:Tween;
var tweenY:Tween ;

var ctf:ColorTransform = new ColorTransform(1, 1, 1, .88);
var bmd:BitmapData = new BitmapData(550,400,false,0xffff00);
var bm:Bitmap = new Bitmap(bmd);
var rec:Rectangle = new Rectangle(0,0,bmd.width,bmd.height);
addChild(bm);

var motionTarget:Sprite = new Sprite();
motionTarget.x = getNewPos()[0];
motionTarget.x = getNewPos()[1];
motionTarget.graphics.beginFill(0xffff00,1.0);
motionTarget.graphics.drawCircle(50,50,20);
motionTarget.graphics.endFill();
var targetContainer:Sprite = new Sprite();
targetContainer.addChild(motionTarget);

addEventListener(Event.ENTER_FRAME,loopHandler);
tweenFunc();

function loopHandler(event:Event):void{
 bmd.colorTransform(rec,ctf);
 bmd.draw(targetContainer);
 return;
}

function tweenFunc():void{
 tweenX = new Tween(motionTarget,"x",Regular.easeOut,motionTarget.x,finishX,duration,true);
 tweenY = new Tween(motionTarget,"y",Regular.easeOut,motionTarget.y,finishY,duration,true);
 tweenX.addEventListener(TweenEvent.MOTION_FINISH,tweenFinish);
 return;
}

function tweenFinish(event:TweenEvent):void{
 tweenX.removeEventListener(TweenEvent.MOTION_FINISH,tweenFinish);
 getNewPos();
 tweenFunc();
 return;
}

function getNewPos():Array{
 finishX = Math.ceil(Math.random()*(stage.width-motionTarget.width));
 finishY = Math.ceil(Math.random()*(stage.height-motionTarget.height));
 duration = Math.random()*2+0.5;
 var _tmpInfo:Array = [finishX,finishY,duration]
 return _tmpInfo;
}



※ tweenFunc()中若改成~
var tweenX:Tween = new Tween(motionTarget,"x",Regular.easeOut,motionTarget.x,finishX,duration,true);
且在tweenFinish()中未作removeListener處理
//tweenX.removeEventListener(TweenEvent.MOTION_FINISH,tweenFinish);
則tweenX.addEventListener(TweenEvent.MOTION_FINISH,tweenFinish)可能錯亂失效
導致, tween動畫的間斷停止

沒有留言: