Frage

Mit ActionScript3 für Flash Player 9+, was ist der schönste Weg, um eine „einmalige“ -Funktion nach genau einem Rahmen zu nennen?

Ich bin mir bewusst, der Timer-Klasse und es Anwendungen, und die Methode auf calllater Flex UIComponents (die durch die Quelle Blick, sehen nicht sehr effizient in diesem Szenario). Ich bin auch bewusst setTimeout (in flash.utils).

Die Timer-Klasse und SetTimeout Dienstprogramm sind sowohl Zeit als Basis, so wie würden wir garantieren, dass unsere Funktion nach genau einem Rahmen genannt wird erhalten?

Aus meinen begrenzten Tests scheint es, dass Funktionen erst nach mindestens einem Rahmen SetTimeout geführt execute (versuchen, die Verzögerung auf 0 setzen). Aber dies ist nicht garantiert.

Natürlich haben wir für Event.ENTER_FRAME Ereignisse von einem Display hören konnten, aber das scheint übertrieben für einen einmaligen Funktionsaufruf verzögert.

War es hilfreich?

Lösung

Flex wurde abstrahieren soll weg die rahmenbasierte Natur des Flash Player, so dass Sie nicht viel finden werden Sie mit Ihrem Problem zu helfen. Der beste Ansatz ist für ENTER_FRAME zu hören, wie Sie vorschlagen. Wenn das übertrieben (und ich bin nicht sicher, warum Sie denken, es ist), könnten Sie eine Hilfsklasse erstellen, die eine Display und Funktion als Argumente übernehmen, die den ENTER_FRAME Ereignis-Listener werden für Dich automatisch hinzufügen / entfernen.

public class NextFrameCommand() {

    private var functionToCall : Function;

    public function NextFrameCommand(dObj: DisplayObject, func : Function) {
        functionToCall = func;
    }

    public function start() : void {
        dObj.addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }

    private function onEnterFrame(e : Event) : void {
        e.target.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
        functionToCall.call();
    }

}

Ich habe diesen Code nicht getestet, aber hoffentlich bekommen Sie die Idee ....

Andere Tipps

Beim Spielen mit den Lösungen von Theo und brd6644 bereitgestellt ich kam, um uns mit diesem. Es kann mehrere Funktionen (mit Parametern) am nächsten Frame, um die Warteschlange gestellt und ausgeführt werden.

public class DelayedFunctionQueue
{
    protected var queue:Array;
    protected var dispatcher:Sprite;

    public function DelayedFunctionQueue()
    {
        queue = new Array();
        dispatcher = new Sprite();
    }

    public function add( func:Function, ... args ):void
    {
        var delegateFn:Function = function():void
        {
            func.apply( null, args );
        }
        queue.push( delegateFn );
        if ( queue.length == 1 )
        {
            dispatcher.addEventListener( Event.ENTER_FRAME, onEF, false, 0, true );
        }
    }

    protected function onEF( event:Event ):void
    {
        dispatcher.removeEventListener( Event.ENTER_FRAME, onEF, false );
        queue = queue.reverse();
        while ( queue.length > 0 )
        {
            var delegateFn:Function = queue.pop();
            delegateFn();
        }
    }
}

Könnte jemand nützlich sein.

Eine Möglichkeit wäre, um zu sehen, wie viele Frames pro Sekunde Ihr Projekt gesetzt und lassen Sie die setTimeout-Funktion Verzögerung für 1 Rahmenzeit innerhalb dieser Einstellung.

Also, wenn Ihr Projekt mit 24 Bildern pro Sekunde eingestellt ist, können Sie verzögern für 42 Millisekunden in SetTimeout.

var timerSprite:Sprite = new Sprite();

timerSprite.addEventListener(Event.ENTER_FRAME, oneFrameHandeler);

function oneFrameHandeler(e:Event):void
{
   timerSprite.removeEventListener(Event.ENTER_FRAME, oneFrameHandeler);
   timerSprite = null;

   trace("one frame later!")
}

ENTER_FRAME ist nicht übertrieben - so etwas wie das ist kurz und einfach

addEventListener(Event.ENTER_FRAME, function(e:Event):void
{
    removeEventListener(Event.ENTER_FRAME, arguments["callee"]);
    onceOffFunction();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top