2010-02-26 8 views
2

Lorsque vous construisez un flash à partir de zéro en utilisant le flash, et qu'il s'agit principalement d'AS3 et que vous utilisez tous les fichiers de classe .as externes, comment structurez-vous votre logiciel? Quel type de structure de variable globale utilisez-vous? votre classe de haut niveau est-elle toujours la même? quelle ligne de code utilisez-vous pour programmer l'attachement des objets d'affichage secondaire principaux à la racine MovieClip?Architecture du logiciel Flash CS AS3 OOP

Répondre

2

Il existe deux façons de traiter les questions architecturales dans Flash OOP. Le modèle standard auquel tout développeur sérieux doit se familiariser utilise des événements personnalisés. Dans votre exemple ci-dessus, votre windowKnob ne sait rien de la fenêtre - il sait juste s'il a été pressé. Lorsqu'elle est pressée, elle envoie un événement "knobPressed". L'objet Car attrape cet événement et demande à WindowManager d'ouvrir la fenêtre associée. Les événements sont un peu difficiles à traiter au début, car il n'est pas évident de savoir comment envoyer une charge de données avec eux. Peut-être que votre bouton peut être appuyé vers le haut ou vers le bas, mais n'envoie qu'un seul événement. Comment, alors, la voiture sait-elle si vous voulez ouvrir ou fermer la fenêtre? Parce que vous étendez la classe Event à WindowKnobEvent créé et sur WindowKnobEvent vous exposez une propriété publique appelée "direction" qui peut être définie sur haut ou bas. Lorsque cet événement se déclenche et est passé à votre WindowManager, vous avez peut-être une instruction switch configurée pour se comporter différemment en fonction de la propriété "direction" - est-ce logique? Donc, 95% du temps, vous allez vouloir utiliser le modèle d'événement pour propager des données dans toute votre application.

Parfois, cependant, il peut être approprié d'utiliser des rappels. En d'autres termes, vous passeriez votre objet WindowKnob une référence à la fonction OpenWindow dans votre WindowManager. Puisque les fonctions sont tous des objets, vous diriez simplement var openWindowFunction: Function = WindowManager.openWindow, puis passez openWindowFunction à votre classe de boutons.

C'EST GÉNÉRALEMENT UNE MAUVAISE IDÉE: cela signifie que votre code est étroitement couplé. Cela signifie que vous ne pouvez pas prendre ce bouton et le déposer dans une voiture différente - vous le casseriez, car il ne serait plus capable de contenir une référence à WindowManager de la première voiture. Cependant, dans certaines circonstances, les rappels peuvent être plus efficaces. Dans l'optimisation des appareils mobiles, par exemple, il est généralement préférable de minimiser le nombre d'objets créés. Chaque événement que vous envoyez utilise de la mémoire. Il est un peu plus efficace d'établir une référence de rappel une seule fois, puis de la laisser s'exécuter sans créer d'objet Event à chaque fois que quelqu'un appuie sur le bouton.

Cela aide-t-il? Je veux dire, AS3 OOP Architecture est à peine quelque chose qui peut être facilement résumé en une seule réponse SO - mais je suppose que l'essentiel est la suivante: apprendre comment les événements fonctionnent et tout va se mettre en place. N'utilisez pas les rappels sauf si vous comprenez les implications.

Bravo, et j'espère que ça aide! myk

+0

great answer. J'aimerais avoir plus de détails sur la structure des événements personnalisés. mais j'ai une question plus générale. comment structurez-vous votre hiérarchie d'objets d'affichage. si j'ai une voiture, et que la voiture a un moteur, une porte et un coffre alors je ferais ceci: package videogame { import flash.display.*; public class Car extends MovieClip { private var engine:Engine; private var door:Door; private var trunk:Trunk; public function Car() { addChild(engine = new Engine()); ... } } } est-il nécessaire de garder des variables d'instance pour les enfants? – Ryan

+0

merde qui n'a pas fonctionné. pouvez-vous faire du code dans les commentaires? – Ryan

+0

Je comprends l'essentiel de ce que vous dites, pas de soucis de formatage. La réponse n'est pas vraiment simple - je veux dire qu'il y a un million de façons de faire les choses - mais de manière générale, quand vous avez un objet hiérarchique comme ça, les variables d'instance sont une approche solide. Votre voiture peut avoir un membre "Dashboard" qui a à son tour des membres "Speedometer" et "Radio", etc. Il existe d'autres façons d'aborder le problème - vous pourriez avoir une classe ComponentManager ou un CarPartsPool qui instancie uniquement des objets lorsque vous avez besoin eux - mais c'est une discussion architecturale de niveau supérieur. – Myk

1

La programmation AS3 devrait être similaire dans la plupart des aspects à la programmation en langage C#, Java, ou un autre langage OO.

La classe de premier niveau reste très similaire et est calquée sur Adobe Practices. Il ressemble à ceci:

package 
{ 
    import flash.display.Sprite; 

    public class FirstCircle extends Sprite 
    { 
     public function FirstCircle() 
     { 

     } 
    } 
} 

Fixation du code à la MovieClip racine est accomplie dans l'IDE en entrant le nom de votre classe dans les principales propriétés dans Flash.

Ne pas utiliser des variables globales, utiliser les propriétés comme vous le feriez en C# ou Java:

private var _prop:String; 

public function get prop():String { 
    return _prop; 
} 

Hope this helps.

+0

Je comprends tout cela. Qu'est-ce que vous utilisez pour la communication objet-objet? Comment Main-> Car-> Dashbaord-> Knob appelle Main-> Car-> Window-> Open(), Knob ne devrait évidemment pas avoir une instance de fenêtre. – Ryan

+0

myObject.myMethod.call (myOtherObject, 1, 2, 3); –

+0

@Ryan one way est de faire quelque chose comme: dans la fonction Knob envoyer un événement Knob.Pressed personnalisé lorsqu'il est pressé. L'objet Car devrait être à l'écoute de cela. Lorsque cet événement est reçu, l'objet de la voiture appellera Window-> Open() – Allan