ENTER_FRAME事件空闲发生或被调用gotoAndPlay?

时间:2013-08-23 20:40:27

标签: actionscript-3 flash

我有一个带有跳过框架标签的MC。目前,我可以检测它何时启动新标签,但我还希望能够重新启动操作,如果使用gotoAndPlay()调用当前标签,而不使用ENTER_FRAME每秒调用30次。知道如何过滤掉它吗?

    private function onNewFrame(e:Event) {

        if(e.target.currentLabel != _currentLabel) {
            // started new label (working)
            trace("New label: "+ e.target.currentLabel);

        }else if(e.target.currentFrame == _currentFrame && e.target.isPlaying) {
            // repeated frame (doesn't work)
            trace("Repeated label: "+ e.target.currentFrame);
        }

        _currentFrame = e.target.currentFrame;
        _currentLabel = e.target.currentLabel;
    }

2 个答案:

答案 0 :(得分:0)

据我了解,你需要知道接下来的两件事: 1)。当movieclip使用新的帧标签前进到下一帧时; 2)。当下一帧与前一帧具有相同的标签时。

首先,MovieClip没有“isPlaying”属性。这听起来不切实际,但没有内置方法来检查MC是否正在播放。所以e.target.isPlaying总是会返回false;因此,您的第二个“if”语句也将始终返回false。

此外,您根本不需要“isPlaying”检查,因为MovieClip仅在播放时调度Event.ENTER_FRAME。

所以这会奏效:

var testMc:TestMC = new TestMC();
testMc.addEventListener(Event.ENTER_FRAME, onNewFrame);
testMc.play();

private function onNewFrame(e:Event):void
{

    if (e.target.currentLabel != _currentLabel)
    {
        // started new label (working)
        trace("New label: " + e.target.currentLabel);

    }
    else if (e.target.currentFrame !== _currentFrame)
    {
        // started frame with the same label
        trace("New frame with same label: " + e.target.currentFrame);
    }

    _currentFrame = e.target.currentFrame;
    _currentLabel = e.target.currentLabel;
}

但也许我不明白你的问题?

答案 1 :(得分:0)

我最终通过在类构造函数中手动存储帧标签索引来解决此问题。 MovieClip属性currentFrameLabel应该处理这个问题,但是我的测试显示总是未定义。

public class DynamicMC extends MovieClip {

    private var _currentLabel:String;
    private var _currentFrame:int;

    private var _labels:Object = {};

    public function DynamicPlanComparison() {
        super();

        findLabels();
    }

    private function findLabels():void {
        for(var i:uint = 0; i < currentLabels.length; i++) {
            var l:FrameLabel = currentLabels[i];
            _labels[l.name] = l;

        }
    }

    private function onNewFrame(e:Event) {
        if(e.target.currentLabel != _currentLabel) {
            // started new label
            trace("New label: "+ e.target.currentLabel);

        }else if(_labels[e.target.currentLabel].frame == e.target.currentFrame) {
            // repeated label
            trace("Repeated label: "+ e.target.currentLabel);
        }

        _currentFrame = e.target.currentFrame;
        _currentLabel = e.target.currentLabel;
    }
}