0

フレーム ラベルがジャンプ スルーされた 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;
    }
4

2 に答える 2

0

私が理解している限りでは、次の 2 つのことを知っておく必要があります: 1)。ムービークリップが新しいフレーム ラベルで次のフレームに進むとき。2)。次のフレームが前と同じラベルを持つ場合。

まず、MovieClip には「isPlaying」プロパティがありません。非現実的に聞こえますが、MC が再生されているかどうかを確認する組み込みメソッドはありません。したがって、e.target.isPlaying は常に false を返します。したがって、2 番目の「if」ステートメントも常に false を返します。

また、MovieClip は再生時にのみ Event.ENTER_FRAME をディスパッチするため、「isPlaying」チェックはまったく必要ありません。

したがって、これは機能します:

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;
}

でも、もしかしたらあなたの質問が理解できなかったのでは?

于 2013-08-24T11:40:43.053 に答える
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;
    }
}
于 2013-08-26T15:24:51.617 に答える