2010-04-08 6 views
0

C'est l'une de ces questions de base pour lesquelles google ne fonctionne pas. J'ai généralement distribué des événements de mes classes et traité l'interface utilisateur dans la classe de document. Mais maintenant je veux séparer toute l'interface utilisateur dans une classe séparée, accessible par d'autres classes.symboles de référence sur le scénario principal

Je l'ai ajouté en tant qu'enfant à la classe main/document, mais comment puis-je référencer la classe principale sans passer par shananigans parent.parent?

modifier. encore une chose dont je me souvenais. Certains de mes éléments d'interface utilisateur ne sont pas ajoutés par programmation.

voici le code que j'ai. Je reçois éventuellement une erreur de propriété indéfinie.

package rpflash.ui { 

import flash.display.Sprite; 
import flash.display.MovieClip; 
import flash.display.Stage; 
import nowplaying; 

public class RPUserInterface{ 

    public function RPUserInterface(){ 
     var np:nowplaying = new nowplaying(); 
     MovieClip(this.root).addChild(np); 
     } 


} 
} 

Répondre

1

La racine est dépréciée dans AS3 si je me souviens bien; Si ce que vous essayez de faire là-bas avec le MovieClip np est l'ajouter à la scène, juste un this.addChild(np) va le faire. En ce qui concerne le référencement de votre classe de document principale à partir de votre interface utilisateur, je suppose que vous créez la classe d'interface utilisateur à partir de Main? Si c'est le cas, la façon la plus simple (bien que certains puissent indiquer que vous créez une référence forte, ce qui pourrait fuir la mémoire) est de créer une fonction dans votre classe UI qui accepte un objet de type Main, puis l'appelle Main, en passant lui-même, comme ceci:

//inside Main 
UIclassInstance.setMain(this); 

//inside UI class 
public function setMain(mainIn:Main):void 
{ 
    main = mainIn; 
} 

Vous aurez besoin d'une variable membre dans votre classe d'interface utilisateur, de type principal. Comme ceci, vous pouvez alors accéder à des choses à l'intérieur de Main en utilisant main.someObjectInMain;.

Espoir qui aide,

Debu

1

vous obtenez une erreur peut-être définie parce que la racine est pas ce qu'il était. root est maintenant la base programmatique de la structure, la scène a pris sa place en tant que détenteur d'objets d'affichage, et doit donc être référencée pour ajouter des enfants, etc.

La propriété Stage est une propriété dynamique qui est donnée uniquement aux objets qui sont activés. la liste d'affichage Donc, si vous créez cette classe par programme, cela peut renvoyer une erreur nulle si vous changez simplement de racine pour la scène, car elle n'a pas encore reçu de référence de scène car elle n'a pas été ajoutée à la liste. essayez d'utiliser l'écouteur Event.ADDED_TO_STAGE s'il ne peut pas être joint pour être sûr que l'étape ne sera pas nulle.

plus est pourquoi vous prévoyez d'attacher les choses à la scène de cette façon. En général, ce n'est pas une idée géniale car la scène elle-même n'aura aucune référence directe à l'enfant (bien que vous puissiez utiliser getChildByName ou getChildAt) et pourrait causer des problèmes avec la perte de références plus tard. essayez de penser à soit ajouter l'enfant à l'userinterface actuel ou l'ajout d'une fonction qui attribuera une sorte de valeur au clip étant passé, par exemple:

public static const PLAY_THIS:String = "the event to play the mc"; 

public function RPUserInterface(){ 
    var np:nowplaying = new nowplaying(); 
    addEventListener(Event.ADDED_TO_STAGE, init); 
} 

public function getClip():nowplaying{ 
    return np; 
} 

private function init(ev:Event):void{ 
    //If you want it to play immediately, else use mouseEvent etc 
    dispatchEvent(new Event(PLAY_THIS)); 
} 

sur votre scénario principal:

var userInt:RPUserInterface = new RPUserInterface(); 
userInt.addEventListener(RPUserInterface.PLAY_THIS, addFromThis); 
addChild(userInt); 

private function addFromThis(ev:Event){ 
    //add a global var ref here if needed. 
    var clip = (ev.target as RPUserInterface).getClip(); 
    addChild(clip); 
} 

cela peut sembler plus complexe et un gaspillage d'espace, mais c'est une bonne pratique et beaucoup plus facile de faire interagir les classes comme ça. C'est aussi beaucoup plus facile de changer à la volée plus tard.

Questions connexes