我正在制作一个动画片段,其中包含一系列我希望在一定时间间隔内执行的功能。
以下是代码:
var Tmr:Timer = new Timer(1000, 3);
var funcArray:Array = [move1, move2, move3];
var i:Number = 0;
funcArray[i]();
function kick(){
if (i < 2) {i++; funcArray[i](); trace("GO NEXT");}
else {i = 0; funcArray[i](); trace("FROM-START");}
}
function timerX():void{
Tmr.start();
Tmr.addEventListener(TimerEvent.TIMER_COMPLETE, outro);
trace("TIMERSTART");
}
function outro(e:TimerEvent):void{
e.currentTarget.removeEventListener(TimerEvent.TIMER_COMPLETE, outro);
trace("TIMEREND");
kick();
}
function move1(){
item1.x = 100;
item1.y = 100;
trace("MOVE1");
timerX()
}
function move2(){
item1.x = 300;
item1.y = 400
trace("MOVE2");
timerX();
}
function move3(){
item1.x = 800;
item1.y = 600
trace("MOVE3");
timerX();
}
正如你所看到的,我已经用跟踪命令填充了它,因为......在播放move1()之后发生了黑暗魔法:显然它开始循环函数EVERY SECOND而不是5,就像它取决于Enter_Frame事件一样
输出中的跟踪序列为:MOVE1,TIMERSTART,TIMEREND,MOVE2,TIMERSTART,GO NEXT,TIMEREND,MOVE3,TIMERSTART,GO NEXT,TIMEREND,MOVE1,TIMERSTART,FROM-START ......
代替:MOVE1,TIMERSTART,TIMEREND, GO NEXT,MOVE2,TIMERSTART,TIMEREND,GO NEXT 等。
我还试图在outro one中移动kick()函数
function outro(e:TimerEvent):void{
kick();
e.currentTarget.removeEventListener(TimerEvent.TIMER_COMPLETE, outro);
trace("TIMEREND");
}
效果是它不会超过move2()。
您认为错误在哪里?在我用来写这个的逻辑上出了什么问题?
感谢您的帮助!
答案 0 :(得分:1)
根据定时器每秒触发,你已经定义Timer
每1秒发送一次定时器事件;虽然在发射TIMER_COMPLETE
之前重复3次。
var Tmr:Timer = new Timer(1000, 3);
如果您希望定时器每5秒触发一次,您可以:
var Tmr:Timer = new Timer(5000);
接下来,您永远不会停止或重置计时器。您可以stop()
和start()
计时器;或者,如果您依赖于计时器重复的特定次数,则reset()
计时器。
因为看起来你只想让一个事件每5秒无限地触发一次,所以真的没有必要启动/停止/重置/添加新的监听器 - 只需启动计时器并监听计时器事件:
var timer:Timer = new Timer(5000);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();
function timerHandler(event:TimerEvent):void {
// timer fired
}
把这一切放在一起,如果你只是想从:move1,move2,move3无限重复:
import flash.utils.Timer;
import flash.events.TimerEvent;
var timer:Timer = new Timer(5000);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();
var actions:Array = [move1, move2, move3];
var i:uint = 0;
function timerHandler(event:TimerEvent):void {
actions[i]();
if(++i >= actions.length)
i = 0;
}
function move1():void {
trace("move1");
}
function move2():void {
trace("move2");
}
function move3():void {
trace("move3");
}
function exit():void {
timer.reset();
timer.removeEventListener(TimerEvent.TIMER, timerHandler);
timer = null;
}