Domanda

Come faccio ad accedere alla fase in Actionscript 3 in una classe che non è la mia classe principale e non un DisplayObject?

È stato utile?

Soluzione

Il modo più semplice è quello di utilizzare un oggetto globale

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

questa pagina ha esempi su come impostare e recuperare gli oggetti da qualsiasi classe.

Altri suggerimenti

Il modo più semplice, è possibile conservarlo in un static var ad esempio:

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

e nella vostra altra classe di importazione della classe che sta tenendo il var statica, naturalmente, la var deve essere inizializzato prima di accedervi.

import MyMain;

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

Adobe non è riuscito a fornire l'accesso statica allo stadio, lasciando soltanto la possibilità di implementarla da sé.

Questo è un epic fail, dal momento che è impossibile accedere alla fase prima che il costruttore di istanza della classe documento principale corre per riporre l'istanza fase in qualche variabile statica arbitrario.

Dal momento che si dovrà inizializzare quella variabile statica arbitraria ogni volta che si desidera accedere statica sul palco, è meglio per assicurarsi di avere a che fare solo una volta.

Per garantire dovrai solo per inizializzare una volta, si dovrà fare in modo che ogni metodo STATICO mai scrivere punti a quella variabile e non cerca di accedervi prima che sia inizializzato.

dato tutto quello che ... i passi più logiche sono:  1. presentare una richiesta Feature con Adobe ORA.  2. Creare un o "documento" classe di base "globale" che inizializza una variabile fase statica per voi, e di avere tutte le classi di documenti ereditano da essa. Estendere MovieClip ti dà la massima flessibilità:

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

Non dovrete scrivere questa classe più di una volta, a condizione che tutte le classi di documento estendono la classe "Documento" di cui sopra definito (e chiede "super" nel suo costruttore subito). Così facendo, il codice del costruttore del documento e il resto del progetto da quel punto in avanti avranno accesso statica alla fase tramite "Document.sstage". Non v'è alcun modo per un contesto statico di avere accesso alla fase prima che si verifichi questa inizializzazione nella classe documento principale.

Vi suggerisco di adottare questo tipo di coerenza molto presto, perché renderà più facile da risolvere se Adobe mai aggiunge l'accesso statica a stage. E 'semplicemente una questione di sostituire "Document.sstage" con qualsiasi Adobe fornisce.

Si potrebbe usare di accesso e la classe mutator per impostare e recuperare l'istanza palco?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top