Implémenter un pattern locator avec DisplayObjectCollector en AS3

5 views
Skip to first unread message

Nairus

unread,
Jun 26, 2009, 3:56:19 AM6/26/09
to VEGAS - ECMASCript & ActionScript OpenSource framework
Hello,

Dans une discussion avec Mathieu ( post : [VEGAS] question exemple
eVideo, eGallery et le package display, classes extends Background,
CoreMovieClip du 4 juin) tu dis :

1 - Toutes ces classes sont "Identifiables" et il est possible de
définir
sur tous les displays un identifiant "unique"
Toutes les instances visuelles qui hérite d'une classe en
CoreXXX peuvent
être stockées dans un DisplayObjectCollector via leur
identifiant unique et
il est donc possible à tout moment de récupérer leur référence
via le
pattern Locator sans avoir vraiment besoin de fabrique IoC ou
autre...
d'ailleurs on peut utiliser les 2 en même temps du coup.

J'explique un peu ce que je dois faire:
Il s'agit de créer une petit jeu autonome qui se charge dans un swf
global.

Mon jeu contient des swf (charger en externe) de "Carte Postale"

L'application globale inititalize chaque jeu avec un fichier xml qui
lui dis quel swf à charger et lequel doit être sélectionné envoyé via
la même methode initialize.
Ces carte postales ont un background et 2 champs de teste dynamique
qui seront alimenter par les éléments d'un formulaire contenu dans le
jeu.

L'utilisateur pourra choisir une carte postal via un ScrollContainer
et l'envoyer à un ami avec son nom et son âge (champs du formulaire en
question)

Lors de l'envoi du formulaire, je récupère les infos du form et le
MovieClip sélectionné.
Je rempli les TextField correspondant, transforme le mc en image JPEG
et j'envoie son ByteArray un service Remoting pour envoyer l'email
avec l'image. (ça c fait avec la classe JPEGEncoder de Thibaut Imbert
au passage).

A moins que tu aies une classe dans Pegas qui fait pareil de celle de
Thibaud, ce serait pas mal de l'avoir dans ton framework avec celle
pour les PNG de flex, non?

Bref je pense que ça peut être pas mal d'utiliser la puissance de
Vegas pour ça.

En fait ma question est comment est-ce que tu implémenterais ce
pattern dans une application AS3 sans IoC ?

Tu ferais des ModelEngine, ViewEngine et ControllerEngine comme en
AS2 ?

A++
NairuS

ekameleon

unread,
Jun 26, 2009, 4:14:20 AM6/26/09
to veg...@googlegroups.com
Hello :)

Pour les formats d'images etc... c'est prévu dans le package library en principe ;) Mais je ne veux pas faire n'importe quoi là dessus et comme tu le sais je peux malheureusement pas tout faire tout de suite ;) mais cela va venir.

Le pattern locator.. tout dépend de tes besoins, tu ne précises pas exactement ce que tu cherches à cibler avec le pattern Locator ?

En IoC suffit d'utiliser la fabrique elle même si tu peux définir l'ensemble du contenu dans le context externe (ou en complément au context de la fabrique via des définitions d'objet singletons)

La fabrique IoC est avant tout un "container" et permet donc de gérer le pattern Locator en plus du pattern d'inversion of control.

Ensuite tout dépend vraiment de tes besoins... si tu utilises des ValueObject ou autre il est préférérable d'utiliser simplement un MVC et de stocker une référence dans chaque ValueObject des vues que tu cherches ensuite à cibler dans ton modèle... Ici on sépare donc les vo des modèles, des vues... et c'est plus simple ensuite pour la gestion visuelle, tu peux facilement adapter l'aspect graphique sans te prendre la tête.

PS : en IoC ModelEngine, ViewEngine et ControllerEngine c'est la même chose que les fichiers de context externe

context/application/model.eden
context/application/view.eden
context/application/controller.eden

Donc oui tu peux très bien coder tout cela à la main simplement, soit comme dans mes exemples dans les tutorials de AndromedAS, soit comme on le faisait en AS2 si l'application est un peu plus complexe.

PS2 : c'est tout de même plus simple de tout baser sur l'IoC

EKA+ :)

NairuS

unread,
Jun 26, 2009, 5:09:07 AM6/26/09
to veg...@googlegroups.com
re,
je sais qu'avec l'IoC j'aurais pas de problème mais je ne peux pas imposer cette techno sur ce projet car on est court au niveau délai et je dois m'adapter au méthode de mon collègue.

Le 26 juin 2009 10:14, ekameleon <ekam...@gmail.com> a écrit :
Hello :)

Pour les formats d'images etc... c'est prévu dans le package library en principe ;) Mais je ne veux pas faire n'importe quoi là dessus et comme tu le sais je peux malheureusement pas tout faire tout de suite ;) mais cela va venir.

Le pattern locator.. tout dépend de tes besoins, tu ne précises pas exactement ce que tu cherches à cibler avec le pattern Locator ?
Je pense qu'il va y avoir une class Form.as qui va avoir des VisualTextInput pour le formulaire et quand on clique sur le bouton "envoyer" il récupère le CardVO sélectionné, je charge le movie clip via un loader, je modifie ses 2 textfields et je le transforme en ByteArray pour l'envoyer au service remoting.
Au niveau visuel, j'ai :
- un model de CardVO dans un ScrollContainer avec un thumb de preview pour le visuel.
- un formulaire pour lancer le service remoting.
 


En IoC suffit d'utiliser la fabrique elle même si tu peux définir l'ensemble du contenu dans le context externe (ou en complément au context de la fabrique via des définitions d'objet singletons)

La fabrique IoC est avant tout un "container" et permet donc de gérer le pattern Locator en plus du pattern d'inversion of control.

Ensuite tout dépend vraiment de tes besoins... si tu utilises des ValueObject ou autre il est préférérable d'utiliser simplement un MVC et de stocker une référence dans chaque ValueObject des vues que tu cherches ensuite à cibler dans ton modèle... Ici on sépare donc les vo des modèles, des vues... et c'est plus simple ensuite pour la gestion visuelle, tu peux facilement adapter l'aspect graphique sans te prendre la tête.
Tout l'aspect graphique se charge via des librairie externe faite par la graphiste.
En fait je dois faire un jeu sur un moteur dont je n'ai pas la maitrise.
 
C'est pour ca que je ne peux pas faire d'IoC, ouiinnnnn ouinn :(
PS : en IoC ModelEngine, ViewEngine et ControllerEngine c'est la même chose que les fichiers de context externe

context/application/model.eden
context/application/view.eden
context/application/controller.eden

Donc oui tu peux très bien coder tout cela à la main simplement, soit comme dans mes exemples dans les tutorials de AndromedAS, soit comme on le faisait en AS2 si l'application est un peu plus complexe.
Ok, je pense que je vais plancher dessus. 


PS2 : c'est tout de même plus simple de tout baser sur l'IoC
I know, I know :(
 
EKA+ :)
merci
a++
NairuS ;)

ekameleon

unread,
Jun 26, 2009, 5:24:39 AM6/26/09
to veg...@googlegroups.com
Hello :)

Je comprends bien qu'en lisant XML tu n'as pas toutes tes libertés (dommage ;))

Tu peux toujours faire de l'IoC mais sans fichier externe ;) Avec juste des définitions d'objets définies directement dans le code du swf à la main ;)

Sinon la technique à l'ancienne marche toujours. Avec les DisplayObjectCollector, ModelCollector, SoundCollector, etc. et l'interface Identifiable présente sur les modèles, les CoreXXX (CoreSprite, CoreShape, CoreBitmap, CoreLoader, CoreTextField, etc.)

EKA+ :)

NairuS

unread,
Jun 26, 2009, 5:43:59 AM6/26/09
to veg...@googlegroups.com
re,

Le 26 juin 2009 11:24, ekameleon <ekam...@gmail.com> a écrit :
Hello :)

Je comprends bien qu'en lisant XML tu n'as pas toutes tes libertés (dommage ;))
Je te le fais pas dire!
 
Tu peux toujours faire de l'IoC mais sans fichier externe ;) Avec juste des définitions d'objets définies directement dans le code du swf à la main ;)
Ah oui c'est une idée.
 
Sinon la technique à l'ancienne marche toujours. Avec les DisplayObjectCollector, ModelCollector, SoundCollector, etc. et l'interface Identifiable présente sur les modèles, les CoreXXX (CoreSprite, CoreShape, CoreBitmap, CoreLoader, CoreTextField, etc.)
Je pense faire comme ça car ce jeu grosso modo ressemble à eGallery.
++ ;)

NairuS

unread,
Jun 29, 2009, 9:52:55 AM6/29/09
to veg...@googlegroups.com
Hello,
J'ai réussi à implémenter un pattern MVC sans IoC ;)
Pour l'instant tout marche, j'ai juste un CardModel qui sera alimenté par des appels externe...
En fait, j'essaie de mettre petit à petit du MVC dans les applications Flash dans ma boite.
Mon collègue n'en a jamais fait avec Flash.
J'espère (et je pense que ça se fera) à terme les appli seront full MVC.
Ma question est autre en fait.
J'ai comparé ton framework AS3 et AS2 pour fusionner les 2 logiques de dev et j'ai une problématique avec le remoting.
En AS2 tu l'initialise au départ dans le ControllerEngine:
{
    FrontController.getInstance( ChannelList.REMOTING ).insert( EventList.GET_GALLERY, new GetGallery() ) ;
}
Ce qui est logique vu que GetGallery est un simple controller.
En AS3, c différent avec les classes RemotingService et RemotingListener.
En IoC, c'est très simple car il suffit de définir le listener et le service en y mettant la référence du listener.
En code, il faut passer le service dans le listener.
Je me demande où est-ce que j'initialise les services?
Dans le ControllerEngine ? ou dans le FormDisplay qui va lancer le service ?
Je pense qu'il faille initialiser le service dans le FormDisplay.
Je dois juste lui affecter la référence du service, je pense.
Mon idée ce de faire comme ça dans FormDisplay:
{
  // dans le construteur
  service.listener          = new MyService() ; // controller.net.remoting
  service.methodName = "myMethod" ;
  service.serviceName = "MyService" ;
}
Ca te parrait correcte ?
A++
NairuS ;)
2009/6/26 NairuS <nicolas...@gmail.com>

ekameleon

unread,
Jun 29, 2009, 10:03:46 AM6/29/09
to veg...@googlegroups.com
Hello :)

Pour ce qui est des applis full MVC.. pense à utiliser la pattern si tu en as vraiment besoin et pas juste pour faire du MVC ;)

Pour remoting fait comme en AS3/IoC... ne passe surtout pas par un FrontController comme en AS2.. n'oublie jamais que tout ce qui est dans l'IoC peut être développé à la main dans le code.

Tu peux donc créer un ServiceEngine pour créer tes services et remoting listeners. 

Sinon je te le répète, même en AS3 (code pure) tu peux toujours créer tes définitions d'objets et utiliser une factory IoC (voir les exemples que je suis en train de mettre à jour dans les examples de AndromedAS...

var context:Array = [ ici tes définitions d'objets ] ;

factory.create( context ) ;

je trouve franchement dommage de pas utiliser la logique, surtout que même si tes définitions d'objets seront compilées dans le swf, cela change pas grand chose niveau architecture du coup en AS3.

Tu as juste du coup à initialiser dans ta classe main (Application) ta fabrique dans le constructeur et tu as juste à créer un ou plusieurs objets de context dans ton application. Faut jamais oublier que la méthode factory.create( objects:Array ) permet de surcharger la fabrique et a chaque appel de la fonction cela ne vide pas le contenu déjà en mémoire.

En gros tu peux vraiment commencer en pure code à utiliser la technique IoC et ensuite ce sera plus simple pour passer à une version avec fichier externe... sachant que bon dans tous les cas tu pourrais déjà utiliser à mon avis une version avec contexte externe... c'est vraiment pas très compliqué d'utiliser mon loader et ensuite de passer à la suite de l'application :)

EKA+ :)
Reply all
Reply to author
Forward
0 new messages