使用 TimerEvent AS3 循环函数数组
Cycle array of functions with TimerEvent AS3
我正在制作一个动画片段,其中包含我希望在特定时间间隔执行的一小部分函数。
代码如下:
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() 被播放之后:显然它开始每秒循环一次函数而不是 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 等
我还尝试将结尾部分的 kick() 函数上移
function outro(e:TimerEvent):void{
kick();
e.currentTarget.removeEventListener(TimerEvent.TIMER_COMPLETE, outro);
trace("TIMEREND");
}
结果是它不会超过 move2()。
您认为错误在哪里?我以前写这个的逻辑有什么问题?
感谢您的帮助!
根据每秒触发的计时器,您已定义 Timer
每 1 秒调度一次计时器事件;虽然,在开火前重复 3 次 TIMER_COMPLETE
。
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
}
将所有这些放在一起,如果您只想从:移动 1、移动 2、移动 3 无限重复:
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;
}
我正在制作一个动画片段,其中包含我希望在特定时间间隔执行的一小部分函数。
代码如下:
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() 被播放之后:显然它开始每秒循环一次函数而不是 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 等
我还尝试将结尾部分的 kick() 函数上移
function outro(e:TimerEvent):void{
kick();
e.currentTarget.removeEventListener(TimerEvent.TIMER_COMPLETE, outro);
trace("TIMEREND");
}
结果是它不会超过 move2()。
您认为错误在哪里?我以前写这个的逻辑有什么问题?
感谢您的帮助!
根据每秒触发的计时器,您已定义 Timer
每 1 秒调度一次计时器事件;虽然,在开火前重复 3 次 TIMER_COMPLETE
。
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
}
将所有这些放在一起,如果您只想从:移动 1、移动 2、移动 3 无限重复:
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;
}