我有一个20帧的弹跳球电影剪辑" ballAnim "在舞台的第1帧,我只是想计数每次" ballAnim "循环播放。我对actionscript没有经验,我已经搜索并尝试了一些东西,但无济于事。
这是我最近尝试的代码:
import flash.events.Event;
var loopCounter:int;
ballAnim.addEventListener(Event.ENTER_FRAME, addOneLoop);
function addOneLoop(e:Event){
if(ballAnim.currentFrame == 20)
{loopCounter+1}
}
trace(loopCounter);`
我得到的只是一个0的实例。我已经搜索了周围,我认为问题是,loopCounter重置为0在每一帧,因为ENTER_FRAME?我试图通过在我的动作时间轴图层上添加第二个关键帧来解决这个问题;(影片剪辑层跨越下面的两个帧),但它没有帮助。我读到我可能需要使用一个类,但我不确定那是什么,我认为这将是一个相当简单的事情。
好的,我们来创建一个类。
你的问题是不理解事物的流动。简单来说,Flash Player在循环阶段的无限循环中执行影片/应用程序:
- 播放头MovieClips(也是主时间轴)移动到下一帧。
- 执行框架脚本。
- 整个影片被渲染,画面在屏幕上更新。
- 暂停到下一帧。 事件被处理。
正确的顺序是可能与众不同(这是可能的,但现在不重要)。重要的是要理解:
- Flash Player(通常)不是一个多线程环境,阶段相互遵循,它们从不重叠,一次只发生一件事我们几乎可以跟踪哪一个。
- 您提供的脚本将在"frame scripts"阶段,并且ENTER_FRAME事件处理程序直到"事件处理"才执行。阶段开始。
那么,让我们检查一下:
import flash.events.Event;
// This one returns time (in milliseconds) passed from the start.
import flash.utils.getTimer;
trace("A", getTimer());
ballAnim.addEventListener(Event.ENTER_FRAME, addOneLoop);
// Let's not be lazy and initialize our variables.
var loopCounter:int = 0;
function addOneLoop(e:Event):void
{
trace("BB", getTimer());
// Check the last frame like that because you can
// change the animation and forget to fix the numbers.
if (ballAnim.currentFrame >= ballAnim.totalFrames)
{
trace("CCC", getTimer());
// Increment operation is +=, not just +.
loopCounter += 1;
}
}
trace("DDDD", getTimer());
trace(loopCounter);
现在,一旦你运行它,你会得到这样的东西:
A (small number)
DDDD (small number)
0
BB ...
BB ...
(20 times total of BB)
BB ...
CCC ...
BB ...
BB ...
因此,为了跟踪发生的循环次数,您需要在处理程序中输出,而不是在框架脚本中输出:
import flash.events.Event;
import flash.utils.getTimer;
ballAnim.addEventListener(Event.ENTER_FRAME, addOneLoop);
var loopCounter:int = 0;
function addOneLoop(e:Event):void
{
if (ballAnim.currentFrame >= ballAnim.totalFrames)
{
loopCounter += 1;
// This is the very place to track this counter.
trace("The ball did", loopCounter, "loops in", getTimer(), "milliseconds!");
}
}