Forums Développement Multimédia

Aller au contenu

Bibliothèque Partagée avancée

CODE Actionscript

1 réponse à ce sujet

#1 phil

  • Members
  • PipPipPipPipPipPipPipPip
  • 738 messages

Posté 04 November 2011 - 11:34 AM

Bonjour,

Je charge dans une classe Main une bibliothèque partagée (library.swf).

DEPUIS MA CLASSE MAIN :
J'arrive à instancier un élément de la bibliothèque (ex : lib.navigation.Menu qui contient tous mes boutons). Afin de lancer ma classe j'utilise une interface IMenu qui comporte la fonction init() (la même bien entendu que dans Menu). Cette fonction est bien appelée.

MA CLASSE MAIN me sert aussi à charger les différentes pages de mon site.

J'aimerais cependant faire la même chose depuis mes autres pages du site, en instanciant une classe (ex : Ascenseur.as) qui est en fait un ascenseur pour mes textes.

PROBLEME : j'arrive à afficher ma classe et donc l'ascenseur mais je n'arrive pas à communiquer avec.

Pour mon Menu voilà comment je fais depuis la classe Main.

domaineApp = (loaderLibrary.contentLoaderInfo as LoaderInfo).applicationDomain
var defHeader : Class
defHeader = domaineApp.getDefinition("lib.navigation.Menu") as Class
var header : DisplayObject = new defHeader()
                       
/// j'ajoute à la liste d'affichage le header contenant le menu
addChild(header)
defHeader(header as IMenu).init()

Je n'arrive pas à faire la même chose depuis une autre page chargée dans Main.

main = GlobalVars.$vars.MAIN
domaineApp = main.domaineApp
var DefAscenseur : Class = domaineApp.getDefinition("lib.assets.AscenseurDynamique") as Class
var mcAscenseur : DisplayObject = new DefAscenseur()
DefAscenseur(mcAscenseur as IAscenseurDynamique).init()

Erreur : "Il est impossible d'accéder à la propriété ou à la méthode d'une référence d'objet nul."


Merci.

Modifié par webphil, 04 November 2011 - 11:39 AM.


#2 deuxsucres

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 115 messages

Posté 04 November 2011 - 17:57 PM

Ahhh, la joie des domaines d'application...

La communication avec des instances chargées depuis une bibliothèque dépend du contexte de chargement de la bibliothèque. Les classes de la bibliothèque peuvent :
  • exister dans un domaine d'application enfant du domaine d'application système
  • exister dans un domaine d'application enfant du domaine d'application courant
  • être ajoutée au domaine d'application courant

En fonction du contexte de chargement choisi, la communication entre les instances est gérée différemment. Je crois que par défaut, le domaine d'application courant [A], même s'il peut instancier une classe d'un autre domaine d'application [B], ne voit que les classes de sont propre domaine d'application . Donc si vous instancier depuis B une classe qui hérite de MovieClip, vous ne verrez depuis [A] qu'un MovieClip. Je crois que c'est votre cas.

Au chargement du SWF, essayez de le charger comme suit :

var urlrequest:URLRequest = new URLRequest("bibliothèque.swf") ;
var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);

var loader:Loader = new Loader();
loader.load(urlrequest, loaderContext);
 

Ainsi, les classes de la bibliothèque seront chargées dans le domaine d'application à partir duquel vous chargez la bibliothèque.

Doc Adobe Utilisation de domaines d’application

Bon courage.



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)