2015-11-14 1 views
0

Quelqu'un pourrait-il m'aider à appeler Main constructor? En général, mon idée est de réinitialiser la scène.Comment utiliser Main d'une autre classe en as3

Classe principale:

public class Main extends Sprite 
{ 
    private var sprite:Sprite = new Sprite(); 

    public function Main() 
    { 
     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   

     sprite.graphics.lineStyle(1, 0x990000, 1); 
     sprite.graphics.drawRoundRect(5, 5, 500, 150, 10, 10); 
     addChild(sprite); 
    } 
} 

En utilisant un bouton j'ai enlevé que sprite, et ma scène va à blanc, mais j'ai une autre classe:

public class AnotherClass 
{ 
    public function Action() 
    { 
     ResetMain(); 
    } 

    private function ResetMain() 
    { 
     //what to write here for reseting Main(re-calling Main()) ? 
    } 
} 

Répondre

0

Je suppose que, si vous vouliez vraiment à, vous pouvez supprimer la classe de document et re-instancier:

//a function in your Main class that resets itself: 
public function resetMain() 
{ 
    var s:Stage = stage; //need a temporary reference to the stage 
    parent.removeChild(this); //remove the Main class from the stage 
    s.addChild(new Main()); //add a new instance of the Main class 
} 

Ceci est une drôle de façon Rese t votre programme cependant, et je ne le recommanderais pas. Vous perdrez l'utilisation du mot-clé root pour ce faire. Tout écouteur d'événement non référencé faiblement ou explicitement supprimé entraînerait également des fuites de mémoire.

Il serait préférable d'écrire simplement une fonction qui remet à zéro tous vos trucs, au lieu de re-appeler le contructor principal en ré-instancier la classe de document (classe principale)

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

    reset(); 
} 

public function reset():void { 
    //clear out any vars/display objects if they exist already 
    if(sprite) removeChild(sprite); 

    //now create those objects again 
    sprite = new Sprite(); 
    sprite.graphics.lineStyle(1, 0x990000, 1); 
    sprite.graphics.drawRoundRect(5, 5, 500, 150, 10, 10); 
    addChild(sprite); 
} 

De votre commentaires, il semble que vous avez juste besoin d'un moyen de référencer votre classe principale de AnotherClass.

Il y a plusieurs façons d'y parvenir.

  1. Transmettez une référence à AnotherClass lorsque vous le créez. Vous ne montrez pas comment vous créez AnotherClass, mais vous pouvez changer son constructeur de prendre une référence de l'instance principale:

    public class AnotherClass 
    { 
        private var main:Main; 
    
        public function AnotherClass(main_:Main){ 
         this.main = main_; 
        } 
    
        //....rest of class code 
    

    Ensuite, lorsque vous instancier AnotherClass, passent dans la référence:

    var another:AnotherClass = new AnotherClass(this); //assuming your in the main class with this line of code 
    
  2. Utilisez le mot-clé root.

    Le mot-clé root vous donne une référence à la classe document (ce que je suppose que Main est). Donc, de toute classe qui se trouve sur la liste d'affichage, vous pouvez faire:

    Main(root).reset(); 
    
  3. Faire une référence statique à l'instance principale

    méthodes et les variables statiques sont accessibles à l'aide de la classe elle-même (pas une instance de la classe). Ainsi, vous pouvez faire quelque chose comme ceci:

    public class Main extends Sprite 
    { 
        public static var me:Main; //a static var to hold the instance of the main class 
        public function Main() 
        { 
         me = this; //assign the static var to the instance of Main 
         //.... rest of Main class code 
    

    Ensuite, vous pouvez le faire de n'importe où dans l'application:

    Main.me.reset(); 
    
+0

je fais comme vous sujest, mais ACCURE d'erreur: Erreur # 1009: ne peut pas accéder à une propriété ou à une méthode d'une référence d'objet null. Dans AnotherClass.as j'ai créé une variable, "private var main: Main;" et appelez reset() - "main.reset();" en action func. et cette fenêtre d'erreur. – L6go1as

+0

Je pense que cela se produit en raison de main == null, mais comment appeler reset() w \ o je ne sais pas ... Dans AnotherClass.comme je transfère "ceci" (de Main.as) comme "DisplayObjectContainer" pour ajouter des éléments sur la scène d'AnotherClass.as – L6go1as

+0

Merci pour votre réponse. Tous fonctionnent bien, mais pourriez-vous m'aider à comprendre comment cela fonctionne ... Par exemple. J'ai une AnotherClass, là "public var main_class: Main;" et je l'appelle de Main comme ça: "var quelque chose: AnotherClass = new AnotherClass(), something.main_class = this;". Donc ça marche bien, mais seulement une fois. Pourquoi ? Parce que j'utilise la fonction 'ClearAll', qui supprime tous les enfants/événements et variables de la scène. Si je m'arrêtais à 'annuler' toutes les varialbes dans une classe - tout fonctionne bien, peu importe comment vous l'avez fait (votre variation ou la mienne). – L6go1as