利用TweenNano的onUpdate实现多对象同步动画
最近做几个小东西,有了点心得,就是做多对象动画,需要动作一致的时候,如果分开实现,可能会导致多个对象的动画不能同步,并且会多次计算动画帧,于是就想到在onUpdate回调函数里做手脚。原理就是仅对一个对象做动画,传入onUpdate回调,在此回调函数中将动作同步到其它对象上。前提就是动画使用了greensock的TweenNano或TweenLite等。简单的动画我一般使用TweenNano。
下面是一个示例:
源码如下:
package
{
import com.greensock.TweenNano;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
/**
* ...
* @author Shirne http://www.shirne.com/
*/
public class AnimateOne extends Sprite
{
private var s1:Sprite;
private var s2:Sprite;
private var s3:Sprite;
private var btn:Sprite;
private var t:TweenNano;
public function AnimateOne()
{
if (stage) {
init();
}else {
this.addEventListener(Event.ADDED_TO_STAGE, init);
}
}
public function init(e:Event = null):void {
if (e) {
this.removeEventListener(Event.ADDED_TO_STAGE, init);
}
//生成元素
s1 = new Sprite();
s2 = new Sprite();
s3 = new Sprite();
s1.graphics.beginFill(0xff0000, .6);
s1.graphics.drawCircle(10, 10, 10);
s1.graphics.endFill();
s1.x = 10;
s1.y = 10;
addChild(s1);
s2.graphics.beginFill(0x00ff00, .6);
s2.graphics.drawCircle(10, 10, 10);
s2.graphics.endFill();
s2.x = 40;
s2.y = 40;
addChild(s2);
s3.graphics.beginFill(0x0000ff, .6);
s3.graphics.drawCircle(10, 10, 10);
s3.graphics.endFill();
s3.x = 70;
s3.y = 70;
addChild(s3);
btn = new Sprite();
btn.graphics.beginFill(0xffff00, .8);
btn.graphics.drawRect(0, 0, 80, 30);
btn.graphics.endFill();
var txt:TextField = new TextField();
txt.autoSize = TextFieldAutoSize.LEFT;
txt.defaultTextFormat = new TextFormat("微软雅黑", 14, 0x333333);
txt.text = "点击测试";
txt.x = (btn.width - txt.width) * .5;
txt.y = (btn.height - txt.height) * .5;
btn.addChild(txt);
btn.buttonMode = true;
btn.mouseChildren = false;
//绑定动画事件
btn.addEventListener(MouseEvent.CLICK, autoTest);
btn.x = (stage.stageWidth - btn.width) * .5;
btn.y = stage.stageHeight - btn.height - 20;
addChild(btn);
}
public function autoTest(e:MouseEvent):void {
var targetx:Number = stage.stageWidth - s1.width - 70;
if (s1.x > 10) {
targetx = 10;
}
var b1:Number = s1.x;
var b2:Number = s2.x;
var b3:Number = s3.x;
if (t) {
t.kill();
}
t = TweenNano.to(s1, .5, { x:targetx, onUpdate:function():void {
//同步第二个和第三个对象
var d:Number = s1.x - b1;
s2.x = b2 + d;
s3.x = b3 + d;
}});
}
}
}