2

我每隔几秒播放一次补间,一开始效果很好,但是在补间进行到一半之前它就开始变得紧张和重置。知道为什么吗?我第一次运行动画时,计时器似乎也有更长的等待时间

import flash.events.Event;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import flash.utils.Timer;
import flash.events.TimerEvent;

addEventListener(Event.ENTER_FRAME, move);

    var signalTimer:Timer = new Timer(3000, 0);

function move(e:Event){
    sender.x = mouseX;
    sender.y = mouseY;  

    signalTimer.addEventListener(TimerEvent.TIMER, sendSignal);
    signalTimer.start();
}

function sendSignal(e:TimerEvent){
    signalTimer.stop();
    var sigTween1X:Tween = new Tween(signal1, "x", None.easeOut, sender.x, mic1.x, 10, false);
    var sigTween1Y:Tween = new Tween(signal1, "y", None.easeIn, sender.y, mic1.y, 15, false);

    var sigTween3X:Tween = new Tween(signal3, "x", Strong.easeIn, sender.x, mic3.x, 7, true);
    var sigTween3Y:Tween = new Tween(signal3, "y", Strong.easeOut, sender.y, mic3.y, 7, true);

}
4

1 回答 1

0

这是一段繁重的代码;结合基于帧、定时器和补间时间。

目前,每个框架都会调用move()它向您添加一个事件侦听器,signalTimer而无需删除先前添加的事件侦听器:

signalTimer.removeEventListener(TimerEvent.TIMER, sendSignal);

但是,每帧添加和删除事件侦听器并不是最优的。

如果您真的希望您的计时器每 3 秒触发一次,请在实例化时实例化并添加一个事件侦听器(不在move()函数内):

var signalTimer:Timer = new Timer(3000, 0);
signalTimer.addEventListener(TimerEvent.TIMER, sendSignal);
signalTimer.start();

然后不要停止计时器sendSignal()

解决补间问题,您可以实现基于帧的动画,例如:

signal1.x -= (signal1.x - mic1.x) * 0.9;
signal1.y -= (signal1.y - mic1.y) * 0.9;

因此,实现一个基于 delta 的函数来跟踪 x,y 坐标。

于 2013-06-20T02:58:44.383 回答