2011-02-04 5 views
1

Je travaille sur un projet utilisant Flash Professional et Flash Builder. L'équipe artistique crée des éléments dans Flash Pro et publie le projet en tant que SWC. Je copie ensuite le fichier SWC dans le répertoire lib de mon projet Flash Builder et j'y accède par l'intermédiaire des ressources.Comment puis-je créer une super-classe disponible dans Flex et Flash?

L'équipe artistique crée beaucoup du même type de chose; disons qu'ils font beaucoup de symboles/composants de lézard. Tous ces lézards ont des animations similaires (walk_left, walk_right, etc.) et pour cette raison ils ont tous des constantes définies dans ActionScript (WALK_RIGHT_START, WALK_RIGHT_END, etc.) relatives aux images clés dans leurs animations. Du côté Flex des choses, quel que soit le lézard que je charge, je veux pouvoir lui dire de marcher à gauche. J'ai donc créé une superclasse dans Flash Professional et maintenant toutes les classes AS pour les lézards Extend Flash Professional cette classe - Lizard.as

Tout cela est bien beau, mais quand je veux ajouter plus de complexité à mes lézards, je ne veux pas avoir à ouvrir le projet Flash Pro, modifier la classe, recompiler le SWC, le renvoyer à Flex, puis le tester. Je veux être en mesure d'avoir mon lézard superclasse disponible pour l'édition dans Flex - donc je fait une autre superclasse dans Flex: Lizard.mxml

Dans Flex, chaque composant de lézard (comme Gecko.mxml) étend actuellement Lizard.mxml, et chaque contient un composant AS défini dans le SWC (Gecko.as dans ce cas).

Cela semble assez compliqué: Un composant mxml étendant une superclasse mxml, contenant un composant AS qui étend une superclasse AS. Qu'est-ce que je voudrais faire est de définir une super-classe dans le projet Flex, ont mes composants Flash Pro étendent cette classe (qui est la partie que je crois impossible), puis ont mes composants Flex (Gecko.mxml) étendre ceux-ci.

Y at-il un moyen de le faire?

+1

Si vous créez une classe uniquement AS3, vous pouvez l'utiliser à la fois depuis Flex et Flash, et l'éditer aux deux endroits. Avec certains chemins de mappage/bibliothèque de répertoires créatifs, vous pouvez même utiliser le même fichier exact aux deux endroits. Cependant, si vous changez cette classe, vous devrez toujours recompiler. Au lieu de prolonger, je me demande si la composition fonctionnerait mieux pour vous. Avoir un cours indépendant que chacun utilise. – JeffryHouser

Répondre

1

Vous ne pouvez pas changer de classe, vous pouvez seulement l'étendre.

Il y a quelques années, je travaillais sur un projet où l'interface était faite en Flash et compilée dans le compilateur Flex.

J'avais différents composants d'interface utilisateur qui consistaient en différentes classes. Mais il fallait les traiter de la même manière que je l'étais. Cela voulait dire que toutes les classes devaient avoir la même classe de base, ce qui devait être fait par ma propre classe de base. donc un bouton et une liste devaient tous les deux étendre un customUIClass. Lequel pour autant que je sais que vous ne pouvez pas faire (s'il vous plaît laissez-moi savoir si vous lisez ceci et connaissez un moyen)

ma solution était de créer un emballage.

Appliqué à votre question irait quelque chose comme ça

  • faire une « superclasse » appelé Lizard (ou animal, organisme, etc.) qui étend un MovieClip (ou casaMovieClip).
  • Lizard aurait une variable private var _view:MovieClip
  • et un INIT constructeur init (type $: MovieClip) `(pas le constructeur réel)
  • _view=$type et vous ajoutez vue addChild(_view);

alors vous créer vos actions comme celle-ci

function walk():void{ 
    _view.gotoAndPlay("WALK"); 
} 

dernière chose serait de créer la classe Gecko, qui prolongerait le lézard, et serait ont ce constructeur comme

function Gecko(){ 
    init(new flaGecko()); 
} 

alors si vous avez encore besoin de remplacer toutes les fonctions que vous pouvez le faire

ou vous pouvez simplement créer var gecko:Lizard = new Lizard(new flaGecko()); mais vous auriez besoin init() pour le constructeur.

Pour plus d'informations, consultez le modèle de décoration. J'ai trouvé le AS3 design patterns book très utile.

+0

Si vous souhaitez modifier la liste et le bouton afin qu'ils s'étendent de l'une de vos propres classes, vous pouvez. Fondamentalement, si vous avez une classe définie avec la même structure de paquetage que celle définie dans vos dépendances, le compilateur résoudra celui du projet au lieu de celui de la dépendance. Par exemple, si vous faites mx.controls.Button dans votre application, il peut faire n'importe quoi et quand quelqu'un utilise mx.controls.Button, il utilisera votre classe de boutons (toujours pas d'extension multiple, donc votre classe de base devrait s'étendre d'un commun super classe de liste et de bouton pour votre cas). – shaunhusain

+0

BTW commentaires ne vise pas à invalider votre réponse, ne comprends pas vraiment assez clairement pour dire que c'est bon ou mauvais. Bien que je suis également d'accord avec le commentaire de Flextras en ce sens que vous devriez être capable d'utiliser une classe AS3 commune seulement comme classe de base dans Flex et Flash. J'ai toujours trouvé que c'était toujours une bonne idée de créer des classes de base dans Flex écrites en AS3 juste pour un contrôle plus strict de la création des enfants et d'autres choses que MXML fait implicitement pour vous quand il se convertit en AS3. – shaunhusain