2009-08-22 7 views
1

je les deux catégories suivantes:AS3 - Pourquoi ne puis-je pas utiliser un stage en dehors de ma classe racine?

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite 
    { 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      // entry point 
      var test:NewClass = new NewClass(); 
     } 

    } 

} 

ET

package 
{ 
    import flash.display.Sprite; 

    public class NewClass extends Sprite 
    { 

     public function NewClass() 
     { 
      trace(stage.width); 
     } 

    } 

} 

Je reçois l'erreur suivante:

TypeError: Erreur # 1009: Impossible d'accéder à une propriété ou méthode d'un objet nul référence. à NewClass() [C: \ Documents and Settings \ Roma \ poo \ src \ NewClass.as: 10] à Main/init() [C: \ Documents and Settings \ Roma \ poo \ src \ Main.as: 23] à Main() [C: \ Documents and Settings \ Roma \ poo \ src \ Main.as: 15]

Pourquoi ???

+0

réponse mise à jour ... greetz – back2dos

Répondre

8

ouais, un flash de développer l'utilisateur ...: D

Uhm, la raison est: la scène est uniquement disponible pour les objets, qui sont sur la liste d'affichage ...

modifier votre classe comme suit:

package { 
    import flash.display.Sprite; 
    import flash.events.Event; 
    public class NewClass extends Sprite { 
     public function NewClass():void { 
       if (stage) init(); 
       else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 
     private function init(e:Event = null):void {  
       removeEventListener(Event.ADDED_TO_STAGE, init); 
       trace(stage.width);//you may want to use stage.stageWidth actually 
     } 
    } 
} 

et Main :: init comme suit:

private function init(e:Event = null):void {  
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      var test:NewClass = new NewClass();  
      this.addChild(test); 
    } 

oh, et vous pouvez changer votre Coding Style TypeBraceAfterLine-BraceOnLine dans Tools > Program Settings > FlashDevelop > Indenting, juste au cas où vous êtes incliné ...;)


modifier: si vous voulez accéder à la scène, dans le portée d'un DisplayObject, vous devez être sûr, la scène est disponible pour elle ... si vous voulez accéder à la scène dès que possible, alors vous aurez besoin de l'astuce fournie ... mais si vous accédez à la scène dans un cliquez sur le gestionnaire par exemple, cela implique automatiquement le DisplayObject est sur la liste d'affichage ... il ne pourrait pas être cliqué autrement ...

un petit mot cependant: je ne pense pas qu'il soit particulièrement intelligent d'accéder à la scène de partout ... en matière d'affichage, la hiérarchie de votre application doit suivre la hiérarchie de la liste d'affichage, à savoir l'accès branches, et non l'inverse ... ce qui est important pour atteindre réutilisabilité ...


greetz

back2dos

+0

Cela signifie donc que si j'importe une bibliothèque, je devrai ajouter if (stage). .. lignes de code à chaque classe qui utilise la scène? – RValentine

+1

Si la bibliothèque que vous importez référence "stage", elle ne fonctionnera probablement que si elle a été ajoutée à la scène. Plutôt que de l'éditer, la solution est probablement de s'assurer qu'elle est ajoutée à la scène quand elle doit l'être. – fenomas

+0

Je viens d'avoir le même problème et cela a résolu, merci. – Boundless

0

Comme back2dos dit correctement, seuls les éléments qui sont sur la liste d'affichage avoir une référence valide à la scène. Comme l'instance de NewClass est simplement une variable temporaire dans la méthode init de votre instance Main et que vous n'avez pas encore addChild pour la mettre dans la liste d'affichage, la valeur de sa propriété stage sera nulle. Remarque: seuls les enfants de parents qui figurent également sur la liste d'affichage obtiendront une référence valide à la scène.

Si vous avez besoin d'une référence à la scène d'une classe qui ne sera pas ajoutée à la liste d'affichage, vous devrez passer la scène dans une instance de cette classe.Contrairement à AS2, il n'y a pas de référence globalement accessible à la scène (_root et _level0 sont obsolètes)

Questions connexes