2012-03-26 6 views
1

Ich habe einen Movie Clip, und ich muss den Film stoppen, wenn es einen bestimmten Frame erreicht. Dazu muss ich einen Ereignis-Listener hinzufügen, der ausgelöst wird, wenn dieser bestimmte Movieclip in einen neuen Frame eintritt (im Gegensatz zur gesamten Animation ENTER_FRAME).Dispatch-Ereignis auf jedem Frame für MovieClip

bar.addEventListener(Event.ENTER_FRAME, function(e:Event) { 
    var b:MovieClip = MovieClip(e.currentTarget); 
    if(b.currentFrame == mp.getPopularity()) 
     b.stop(); 
}); 

Irgendwelche Ideen?

Danke.

+0

könnten Sie wahrscheinlich 'addFrameScript()' versuchen - es ist undokumentiert, aber es könnte funktionieren: http://www.kirupa.com/forum/showthread.php?223798-ActionScript-3-Tip-of-the-Day/page22 & p = 2098268 # post2098268 – divillysausages

Antwort

1

Versuchen Sie dies;

Eine einfache Funktion:

function playUntil(target:MovieClip, frame:int):void 
{ 
    target.stopFrame = frame; // Works because MovieClip is dynamic. 
    target.addEventListener(Event.ENTER_FRAME, _checkFrame); 
} 

Mit dem Mithören:

function _checkFrame(e:Event):void 
{ 
    var m:MovieClip = e.target as MovieClip; 

    if(m.currentFrame == m.stopFrame) 
    { 
     m.stop(); 
     m.removeEventListener(Event.ENTER_FRAME, _checkFrame); 
    } 
} 

Wenden Sie es auf alle Ihre Instanzen:

playUntil(instance1, 15); 
playUntil(instance2, 27); 
playUntil(instance3, 113); 
+0

Da der Rahmen der Movie Clip bei Änderungen für jede Instanz gestoppt werden muss – Nick

+0

@Nick Ok, versuchen Sie es. – Marty

1

Sie sollten den Ereignis-Listener entfernen, wenn es nicht ist länger benötigt, sonst riskieren Sie Speicherlecks. Eine anonyme Funktion kann dies schwierig machen, obwohl Sie dies möglicherweise mit arguments.callee tun können.

bar.addEventListener(Event.ENTER_FRAME, function(e:Event) { 
    var b:MovieClip = MovieClip(e.currentTarget); 
    if(b.currentFrame == mp.getPopularity()){ 
     b.stop(); 
     b.removeEventListener(e.type, arguments.callee); 
      // ^^ this may work to remove your anonymous listener. 
    } 
}); 

Es gibt jedoch einen anderen Weg, dies zu tun. Ändert sich mp.getPopularity() häufig? Wenn es sich nicht ändert, nachdem der Takt gespielt wurde(), können Sie addFrameScript verwenden. Denken Sie daran, dass addFrameScript 0-indiziert ist. Wenn Sie ein Skript zu Frame 1 hinzufügen, müssen Sie also 0 übergeben. Wenn also eine Aktion auf mp.getPopularity() ausgeführt werden soll, müssen Sie mp.getPopularity() übergeben. - 1.

var framescript:Function = function():void{ 
    bar.stop(); 
    bar.addFrameScript(bar.currentFrame-1, null); 
     // ^^ nulling the framescript after 
     // ^^ it is no longer needed. 
} 

bar.stop(); // Generally a good idea to call stop before calling addFrameScript 

bar.addFrameScript(mp.getPopularity() - 1, framescript); 

bar.gotoAndPlay(1); // or wherever it needs to start from. 

Dies ist eine genauere Lösung, aber Sie dürfen nicht vergessen, Ihre Frame zu bereinigen, nachdem Sie fertig sind, wenn Sie diese gleiche bar Instanz verwenden möchten später mit einem anderen mp.getPopularity() Wert.

Verwandte Themen