Hello :)
Oui beaucoup de chose mais faut s'y prendre doucement avec tous les
exemples dans trunk/examples et ensuite avec les tutoriaux et pour
finir les exemples dans le framework documentaire AST'r :
http://code.google.com/p/astr/
1 - franchement tu devrais essayer d'utiliser "eden" avec ma classe
vegas.net.EdenLoader et tu verras que tu vas gagner beaucoup de temps
en créant directement tes VO dans le fichier texte externe de
configuration :)
Tu commences par créer un fichier texte avec du contenu au format eden
simple avec dedans ("datas.eden") :
questions =
[
new vo.QuestionVO
(
{
id : 1
text : "Question1" ,
score : 0 ,
responses :
[
new vo.ResponseVO( { text : "oui" } ) ,
new vo.ResponseVO( { text : "oui" } ) ,
new vo.ResponseVO( { text : "peut être ?" } )
]
}
)
];
Ensuite dans ton code AS3 :
public var loader:EdenLoader ;
et dans ton code principal
loader = new EdenLoader() ; // au lieu de XMLLoader
loader.addEventListener( Event.COMPLETE, complete ); // remarque le
nom simple de la méthode
Et dans ta fonction d'écoute "complete" tu as par exemple :
protected function complete( e:Event ):void
{
var questions:Array = loader.data.questions as Array ;
if (questions && question.length > 0)
{
var len:int = questions.length ;
for( var i:int ; i<len ; i++ )
{
model.addVO( questions[i] as QuestionVO ) ;
}
}
}
Vaut mieux séparer la logique de chargement des données du modèle (MVC
ne doit pas connaitre les vues, ne doit pas connaitre la logique de
chargement des données, etc). C'est plus simple ensuite de gérer
justement le loader selon des stratégies différentes et d'éviter la
dépendance inutile avec le modèle.
Tu peux donc créer un singleton de ton modèle avec un singleton simple
(constante de package)
2 - Pour ta première question, franchement pas besoin d'utiliser
l'artillerie lourde (Vector ou map complexe) pour ce que tu cherches à
faire :) Les ValueObjects doivent toujours être très simple :) Si tu
veux les complexifié pense à utiliser des getter/setter mais attention
car par exemple si un jour ton VO tu dois l'utiliser avec AMFPHP et du
remoting tu risques d'avoir des soucis avec la classe Vector (existe
pas dans AMFPHP)
Tuto AMFPHP :
https://sites.google.com/site/ekameleon/amf-and-remoting-services
Par contre pour le modèle... faut un id surtout sur les MapModelObject
et je ne vois pas de propriété "id" dans tes VO... c'est un soucis ;)
A noter idem que si tu utilises les ResponseVO uniquement pour un
champ de texte cela ne vaut pas le coup, autant utiliser un simple
champ de texte et pas forcément se prendre la tête à typer la réponse
(plus rapide d'envoyer des strings qu'un objet typé) par contre si tu
commences à avoir des réponses avec d'autres propriétés là cela
devient indispensable.
3 - Comme je te l'ai dit pas besoin pour ta question 2 de dispatcher
un événement, surtout en sortant la logique de chargement dans ton
application principal sans dépendance avec le modèle. A la fin tu peux
directement lancer du coup la fonction qu'il faut ou je te conseille
vivement d'essayer d'utiliser les Signals :)
TUTO Signals :
https://sites.google.com/site/ekameleon/Home/opensource/vegas-opensource-project/vegas-tutorials/signalers-and-receivers
##### Note : la prochaine fois fais plusieurs questions dans plusieurs
posts ;) C'est plus simple... là je passe une plombe à lire toutes tes
questions et cela va être pareil pour toi ;) Pour que je puisse
t'aider efficacement pense à poser des questions précises et si il
faut pense à numéroter le titre des tes questions avec une base de
titre identique pour qu'on s'en sorte mieux ;) ########
Reprenons maintenant l'exemple sur QuestionUI :)
4 - Pour ta classe de base de ton affichage si tu as pas d'animation
cela sert à rien d'utiliser un CoreMovieClip .. autant utiliser un
CoreSprite (ou un Sprite tout simplement si tu cherches pas à utiliser
les logs et les fonctions lock/unlock de la classe CoreSprite). Faut
penser à utiliser les classes qu'il faut selon tes besoins.
Pour des exemples plus complet je te conseille de regarder ma galerie
vidéo dans AST'r (récupère les sources du répertoire AS3) :
http://code.google.com/p/astr/source/browse/#svn/trunk/AS3/trunk/examples/evideo
Avec une liste de thumb remplies par un modèle :)
Avec le controller quand je modèle de VideoVO se rempli :
http://code.google.com/p/astr/source/browse/trunk/AS3/trunk/examples/evideo/trunk/src/evideo/controllers/models/videos/AddVideo.as
et la classe ListValueObject :
http://code.google.com/p/astr/source/browse/trunk/AS3/trunk/examples/evideo/trunk/src/evideo/display/ListValueObject.as
Utilisée pour créer la classe VideoList :
http://code.google.com/p/astr/source/browse/trunk/AS3/trunk/examples/evideo/trunk/src/evideo/display/VideoList.as
Regarde le SWF de l'exemple avant de te lancer dans la lecture du code
(qui utilise de l'ioc pour se mettre à jour... mais bon avec du code
simple cela marche pareil)
#######
5 - Oui les singletons c'est avant tout une instance unique d'une
classe et surtout pas une classe qui est "fermée" :) Si tu veux fermer
ta classe pourquoi pas mais :
* Si tu fermes une classes tu peux plus la tester
* Hériter de cette classe cela devient difficile
* Mettre du getInstance statique dans toutes les classes cela sert à
rien ;) Faut en avoir besoin.. et sérieux on se rend compte à force
que c'est un mauvais design de code (anti-pattern si on maitrise la
notion d'inversion de contrôle avec injection de dépendance via une
fabrique IoC)
Regarde :
http://code.google.com/p/maashaack/wiki/Singleton
Tu peux donc lire ici les bonnes pratiques ECMASCript et AS3 pour
faire du singleton (faut pas penser JAVA mais ActionScript ;))
Remarque : Pour les composants UI tu as tout ce qu'il faut pour faire
les composants de bases d'une application (bouton, progress/scroll
bar, textinput, label) ensuite vu que dans mon taf j'ai toujours des
composants spécifiques à réaliser en fonction de l'ergonomie et la
créativité du graphiste.. j'aime pas me limiter ;)
Pas de soucis pour d'autres questions mais pense à diviser pour régner
et pense à faire plusieurs post pour différentes questions ;)
EKA+ :)
> id:questi...@id.toString(),