Frage

Wie greife ich auf die Bühne in Actionscript 3 in einer Klasse, die nicht meine Hauptklasse und kein Display?

War es hilfreich?

Lösung

ist der einfachste Weg ist ein globales Objekt zu verwenden,

http://github.com/inruntime/AS3-Global-Object

Diese Seite hat Beispiele dafür, wie Objekte aus jeder Klasse zu setzen und abzurufen.

Andere Tipps

Die einfache Art und Weise, können Sie es in einem static var zum Beispiel halten:

public class MyMain extends Sprite {
 public static var STAGE:Stage;

 public function MyMain() {
  if (stage)
   init();
  else
   addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
  }
 }

 private function init(e:Event=null):void{
  removeEventListener(Event.ADDED_TO_STAGE, init);
  // store stage reference when stage ready  
  STAGE=stage;
 }
}

und in der anderen Klasse Import der Klasse, die die statische var hält, natürlich die var haben vor dem Zugriff auf sie initialisiert werden.

import MyMain;

public class Other {
 public function useStage():void {
   MyMain.STAGE...
 }
}

ist fehlgeschlagen Adobe statischen Zugriff auf die Bühne bieten, haben Sie keine Möglichkeit zu verlassen, aber es selbst zu implementieren.

Dies ist ein episches ausfallen, da es unmöglich ist, die Bühne, bevor Ihr Hauptdokument Klasse Instanzkonstruktors läuft für den Zugriff auf die Bühne Instanz in einer beliebigen statischen Variablen beiseite zu schaffen.

Da Sie jedes Mal, dass beliebige statische Variable initialisieren müssen werden Sie statischen Zugriff auf die Bühne wollen, ist es am besten nur, um sicherzustellen, haben es einmal zu tun.

Sie nur, um sicherzustellen, werden haben es einmal zu initialisieren, werden Sie sicher machen müssen, dass jede statische Methode, die Sie jemals Schreib Punkte auf diese Variable und nicht versucht, um ihm Zugang, bevor es initialisiert wird.

Da alles, was ... die logischste Schritte sind:  1. ein Feature Request mit Adobe NOW.  2. Erstellen Sie eine Klasse base „Global“ oder „Dokument“, das für Sie eine statische Phase Variable initialisiert, und haben alle Ihre Dokumentenklassen von ihm erben. Erweitern MovieClip- gibt Ihnen die Flexibilität:

package
{
    import flash.display.Stage;
    import flash.display.MovieClip;
    import flash.events.Event;
    public class Document extends MovieClip
    {
        public static var _stage:Stage = null;

        public static function get sstage():Stage //added an extra s for "static" to differentiate the static property name from the instance property name "stage"; call it what you want
        {
            return _stage;
        }

        public function Document()
        {
            super();
            if (stage != null)
               initStage( null ); //explicitly pass null to indicate no listener was attached
            else
                addEventListener( Event.ADDED_TO_STAGE, initStage, false, 0, true ); //prefer weak references
        }

        private function initStage( e:Event ):void
        {
            _stage = stage;
            if (e != null) //event listener will be non-null iff listener was added
                removeEventListener( Event.ADDED_TO_STAGE, initStage, false );           
        }
    }
}

Sie werden diese Klasse nicht mehr als einmal zu schreiben, solange alle Ihre Dokumentenklassen erweitern die oben definierte „Dokument“ Klasse (und Anrufe „super“ in seinem Konstruktor sofort). Dadurch, dass Ihr Dokument Konstruktor Code und der Rest Ihres Projekts von diesem Zeitpunkt an wird statischen Zugriff auf die Bühne über „Document.sstage“. Es gibt keine Möglichkeit für einen statischen Kontext Zugriff auf die Bühne zu haben, bevor diese Initialisierung im Hauptdokument Klasse auftritt.

Ich schlage vor, Sie diese Art von Konsistenz annehmen sehr früh, weil es leichter zu beheben machen, wenn Adobe jemals statischen Zugriff auf Stufe hinzufügt. Es wird einfach eine Frage der Ersetzung „Document.sstage“ mit dem, was Adobe bietet.

Sie Accessor und Mutator-Klasse festlegen können und die Bühne Instanz?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top