2010-04-21 8 views
5

Le problème que je l'ai rencontré est que je me sers d'un keyboardEventListener pour faire un MovieClip courir. Comme je suis un étudiant, je crée ceci pour une tâche, mais nous sommes obligés d'utiliser des classes AS3.Comment accéder à la scène d'une classe AS3 dans Adobe Flash

Quand je lance le code dans le maintimeline, il n'y a pas de problème. Mais quand j'essaie d'y accéder à partir d'une autre classe (avec un 'Export for ActionScript' sur le MovieClip en question), j'obtiens une erreur qu'il ne peut pas aborder.

this.étage .addEventListener (KeyboardEvent.KEY_DOWN, dostuff);

Répondre

9

Une classe dans AS3 n'est pas sur la scène tant que vous ne l'avez pas réellement placée. Par conséquent, "this.stage" sera nul au moment de la compilation. Vous pouvez contourner ce problème en utilisant l'événement ADDED_TO_STAGE pour retarder la liaison de vos écouteurs jusqu'à ce que le moment soit venu.

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! J'ai résolu le problème de la scène. J'ai quand même quelques erreurs. Je reçois l'erreur qu'il ne peut pas trouver le clavier et chaque erreur est situé sur le type de code suivant « if (evt.keyCode == Keyboard.RIGHT) {// choses } » la erreur est la suivante: "1120: Accès du clavier de propriété indéfini." déjà merci pour résoudre le problème de la scène!Cherché Google pour cela, mais n'a rien trouvé de pertinent! – Graphithy

+0

@Graphithy si vous avez une question différente, posez une nouvelle question sur stackoverflow au lieu de la poser dans un commentaire. – davr

0

« 1120:. L'accès du clavier propriété non définie Il est votre réponse Vous n'avez pas défini les propriétés du clavier qui signifie que vous n'avez pas importé au paquet

devrait ressembler à quelque chose comme ça... :

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

Conseil:. ont un regard plus profond dans l'importation essayez d'utiliser constructeur flash, son bien meilleur pour les débutants et les classes d'importation automatique si u ne avez pas besoin de mémoriser everythi ng

0

cette réponse m'a aidé un million de fois, mais je n'ai pas encore assez de points pour pop up l'un, ou je.

Cela se produit lorsque génériquement vous essayez d'accéder quoi que ce soit sur la scène avant qu'il ne soit ajouté à l'étape. J'ai utilisé un init() dans le constructeur de toutes les classes principales de mes projets, mais à cause de ce problème, je ne le fais plus. Maintenant, au lieu que je l'ai remplacé avec ce (où principal est le constructeur de la classe/nom):

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

J'espère que cela aide quelqu'un d'autre qui a lu un des livres que je faisais sur le flash, qui offrent le init() idée.

And..thanks Greg W.

0

Lorsque vous créez la classe vous devez renvoyer l'étape à l'intérieur de votre classe coz son mondial, il ne est pas accessible pour passer dans la classe, et est un exemple ici pour utiliser l'écouteur d'événement de scène dans une 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); 
     } 
    } 

} 

Enregistrez le fichier sous Eventhndl.as et maintenant vous pouvez simplement ajouter l'instance de cette classe et passer quel que soit l'objet que vous avez besoin d'écouter son événement, voici comment faire.

import Eventhndl; 

var EH:Eventhndl = new Eventhndl(stage);