在Flash(AS3)中的场景结束处停止动作脚本

时间:2014-03-11 14:22:58

标签: actionscript-3 flash

我是动作脚本的新手,我遇到了一些问题。

我在Flash CC中创建了一个有8个场景的电影。场景6有一个动作脚本,随机放置飞过屏幕的鸟。场景7有一个几乎完全相同的脚本,它只做较慢的事情(使用不同的符号)并改变了几个变量。

当测试电影时,第一个问题浮出水面,动作脚本只放置在场景6中,它只是没有在场景6的结尾处结束,而是继续播放场景7和场景8。

将脚本添加到场景7时,它会完全中断。测试单个场景工作正常,但在测试整个电影时没有任何反应,我得到错误。

这是我正在使用的动作脚本:

场景6

import flash.utils.Timer;

var timer: Timer = new Timer(100, 45);
timer.addEventListener(TimerEvent.TIMER, timerF);
timer.start();

function timerF(event: TimerEvent): void {
    var mcClip: Bird = new Bird();
    var yVal:Number = (Math.ceil(Math.random()*200));
    mcClip.x = -20;
    mcClip.y = yVal;
    addChildAt(mcClip,10);
}

场景7

import flash.utils.Timer;

var timer: Timer = new Timer(100, 40);
timer.addEventListener(TimerEvent.TIMER, timerF);
timer.start();

function timerF(event: TimerEvent): void {
    var mcClip: Bird2 = new Bird2();
    var yVal:Number = (Math.ceil(Math.random()*400));
    mcClip.x = 0;
    mcClip.y = yVal;
    addChildAt(mcClip,3);
}   

这些是我得到的错误:

Scene 7 (Birds), Layer 'Bird Action Script', Frame 1114, Line 3, Column 5
1151: A conflict exists with definition timer in namespace internal.

Scene 7 (Birds), Layer 'Bird Action Script', Frame 1114, Line 7, Column 10
1021: Duplicate function definition.

我需要在每个场景结束时停止脚本,但我不知道如何。我搜索了Google,找不到任何有用的信息。

非常感谢任何帮助。

非常感谢

2 个答案:

答案 0 :(得分:0)

在场景6完成之前,您需要删除Timer事件侦听器,停止计时器甚至可能使其无效,即:

timer.removeEventListener(TimerEvent.TIMER, timerF);
timer.stop();
timer = null;

如果您正在使用时间轴,则错误问题可能是“包含”场景6的动作脚本的帧可能正在进行到场景7中。在场景结束之前在该层上放置空关键帧可能帮助

编辑 - 回应以下新评论:

在定义计时器的行之前,添加:

var _birds:Array = new Array();

然后,在你的TimerEvent处理程序中:

function timerF(event: TimerEvent): void {
    _birds.push(new Bird());
    var yVal:Number = (Math.ceil(Math.random()*200));
    _birds[_birds.length-1].x = -20;
    _birds[_birds.length-1].y = yVal;
    addChildAt(_birds[_birds.length-1], 10);
}

然后,在你的场景结束时:

stop();
timer.removeEventListener(TimerEvent.TIMER, timerF);
timer.stop();
timer = null;
for (var loop:int=0;loop<_birds.length;loop++) {
    removeChild(_birds[loop]);    
}
_birds.length = 0;
// additional code here to go to next scene?

显然,计时器变量名称应该更改为与您现在在每个场景中使用的名称相匹配。

答案 1 :(得分:0)

  

需要在每个场景结束时停止脚本

只需将stop();放在场景的最后一帧即可。 选择场景的最后一帧,热键F9将打开带有操作的窗口。

Action window