2010-04-21 8 views
5

Il problema che ho riscontrato è che sto usando un keyboardEventListener per far girare un Movie Clip. Dato che sono uno studente universitario, sto creando questo per un incarico, ma siamo costretti a utilizzare classi as3.Come accedere allo stage da una classe AS3 in Adobe Flash

Quando eseguo il codice nella maintimeline, non ci sono problemi. Ma quando provo ad accedervi da un'altra classe (con un 'Export for ActionScript' sul MovieClip in questione) ottengo un errore che non può affrontare lo stage.

this.stage .addEventListener (KeyboardEvent.KEY_DOWN, dostuff);

risposta

9

Una classe in AS3 non è sul palco finché non la metti effettivamente lì. Di conseguenza, "this.stage" sarà nullo al momento della compilazione. Puoi aggirare questo problema utilizzando l'evento ADDED_TO_STAGE per ritardare l'associazione degli ascoltatori fino al momento giusto.

public function MyClass(){ 
    this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); 
} 

private function addedToStageHandler(e:Event):void{ 
    this.stage.addEventListener(KeyboardEvent.KEY_DOWN, dostuff); 
} 
+0

Alrgiht! Ho risolto il problema del palcoscenico. Ho ancora alcuni errori però. Sto ottenendo l'errore che non riesce a trovare la tastiera e ogni errore si trova sul seguente tipo di codice "se (evt.keyCode == Keyboard.RIGHT) {// roba }" la l'errore è il seguente: "1120: accesso alla tastiera non definita." già grazie per aver risolto il problema!Ho cercato Google ma non ho trovato nulla di rilevante! – Graphithy

+0

@Grafite se hai una domanda diversa, fai una nuova domanda su StackOverflow invece di chiederlo in un commento. – davr

0

"1120:. L'accesso di indefinito tastiera proprietà C'è la risposta non è stata definita la proprietà della tastiera che significa che non sono stati importati al pacchetto

dovrebbe essere simile a questo... :

import flash.display.*; 
import flash.events.*; 
import flash.ui.*; 

Consigli:. uno sguardo più profondo nella importazione provare a utilizzare builder flash, è molto meglio per i principianti e le classi di importazione automatica in modo da non u bisogno di memorizzare everythi ng.

0

questa risposta mi ha aiutato un milione di volte, ma non ho ancora abbastanza punti per aprirlo, o lo farei.

Questo succede genericamente quando si tenta di accedere a qualsiasi cosa sul palco prima che venga aggiunto allo stage. Sono stato, per un po ', usando un init() nel costruttore di tutte le classi principali dei miei progetti, ma a causa di questo problema, non lo faccio più. Ora, invece ho sostituito con questo (dove è principale costruttore della classe/nome):

public function Main():void { 
    this.addEventListener(Event.ADDED_TO_STAGE, init); 
    super();  
} 
... 
private function init(e:Event):void { 
... 

Spero che questo aiuta chiunque altro che ha letto nessuno dei libri che ho fatto su flash, che offrono l'init() idea.

And..thanks Greg W.

0

Quando si crea classe che si deve fare riferimento alla fase dall'interno della classe coz il suo non è accessibile a livello globale si deve passare in classe, e qui è un esempio per i usa un listener di eventi stage all'interno di una classe.

package { 
    import flash.events.KeyboardEvent; 

    public class Eventhndl{ 

     private var obj:Object; //create local variable to refarance stage 


     public function Eventhndl(objStage:Object):void{ 
      obj = objStage; //make local refarance for stage inside the class 

      obj.addEventListener(KeyboardEvent.KEY_DOWN,runit); //add the event listener 
     } 

     private function runit(Event:KeyboardEvent):void{ 
      trace("keyDownHandler: " + Event.keyCode); 
      trace("ctrlKey: " + Event.ctrlKey); 
      trace("keyLocation: " + Event.keyLocation); 
      trace("shiftKey: " + Event.shiftKey); 
      trace("altKey: " + Event.altKey); 
     } 
    } 

} 

Salva il file come Eventhndl.as e ora si può semplicemente aggiungere l'istanza di questa classe e passare qualunque sia l'oggetto che è necessario ascoltare l'evento, ecco come fare.

import Eventhndl; 

var EH:Eventhndl = new Eventhndl(stage); 
Problemi correlati