POO et AS2 (bientot AS3 :) )

POO et AS2 (bientot AS3 :) ) - Flash/ActionScript - Programmation

Marsh Posté le 11-08-2006 à 09:34:29    

Bonjour à tous les flasheurs,
 
voila au risque de créer encore un topic POO en actionscript (j'ai cherché mais rien trouvé), je pose ma question ici. Je traine sur média box ou flashxpress mais pareil, je n'ai pas trouvé de réponses simples.
 
De plus ici, on pourra peut etre faire la liaison avec d'autres langages (php par exemple, le plus courant pour la création de sites).
 
Ce matin (non promis, c'est pas mode 36 15 ta vie lol), j'ai lu qqes sujets POO dans la salle PHP. Personnellement, je vois à peu près pourquoi utiliser la POO mais concretement je n'ai jamais réussi a coder, surtout en flash.
 
Colin Moock m'a largué plutot qu'autre chose (bon c'était la version anglaise mais quand même...).
 
Plutot que d'avoir toujours des réponses assez théoriques, j'aimerais des personnes qui ont des exemples simples et concret.
Qqn a t-il un fla avec une/des classe(s) et pourrait expliquer l'intéret de son utilisation par rapport à du séquentiel dans la timeline ?  
Ne me dites pas svp la réponse bateau "ça permet de réutiliser ton code". ça j'ai compris, sauf que pour faire la liaison entre une classe et ensuite ma bibliothèque etc, je suis largué. Je n'ai trouvé sur le net que des exemples vagues qui n'aident pas à comprendre cette POO appliquée à flash.
 
Je me débrouille en as1, j'ai voulu faire l'aveugle avec l'as2 mais en me tenant un peu au courant avec l'as3 qui va arriver en fin d'année, début 2007, je dois les ouvrir et changer "radicalement" (j'exagere sur le terme volontairement) ma façon de coder.
 
Toutes ressources, explications avec portions de codes, je suis preneur   :)


Message édité par CUT HERE le 11-08-2006 à 09:37:10
Reply

Marsh Posté le 11-08-2006 à 09:34:29   

Reply

Marsh Posté le 14-08-2006 à 20:06:42    

en pro j'utilise l'AS2 sur :
- les structures de données complexes arborescentes, du type jeu en quizz/test, ça permet de manipuler plus simplement des données profondes, en utilisant des méthodes sobres (quizzData.getQuestion(1) plutôt que firstChild.childNodes.childNodes...),
- "quand y faut que ça bourre" : typiquement les systèmes de particules/moteurs 3D,
- quand y faut réutiliser du code : typiquement les scrollers dynamiques, les barres de chargement, les menus à zones sensibles désynchronisées (plans interactifs),
 
j'utilise aussi quelques bibliothèques/framework en AS2 : pixLib, ASDK, et le XPath d'Xfactorstudio, bien sûr.  
 
il reste plus grand chose d'autre, tiens, finalement.


Message édité par craps_youpla le 14-08-2006 à 20:07:48
Reply

Marsh Posté le 14-08-2006 à 20:58:00    

Oui c'est vrai qu'une classe pour traiter le xml plus simplement serait pas mal  :) .
 
craps_youpla, aurais tu un bout de code pas trop complexe à me montrer, genre une classe de preload ou scroll avec son fla pour voir comment tu fais la liaison après dans l'IDE de flash ?
 
Quand je te lis, je me rends compte que je suis vraiment en retard, je peux très bien coder des sites en flash avec scroll, xml, etc mais à "l'ancienne"  :whistle:

Reply

Marsh Posté le 14-08-2006 à 21:04:43    

Citation :

craps_youpla, aurais tu un bout de code pas trop complexe à me montrer, genre une classe de preload ou scroll avec son fla pour voir comment tu fais la liaison après dans l'IDE de flash ?


 
euh par définition c'est complexe, sinon on me paierait pas pour le faire :\ du code pas trop complexe, c'est antinomique non ? essaie de poser une définition claire du "complexe" à tes yeux pour m'aider à appréhender quelles difficultés tu rencontres.
 

Code :
  1. // C_gallery
  2. import mx.transitions.Tween;
  3. import mx.transitions.easing.*;
  4. class C_gallery extends MovieClip {
  5. public var itemList:Array = new Array();
  6. private var catNumber:Number;
  7. private var imgNumber:Number;
  8. private var imgBttn:MovieClip;
  9. private var hspace:Number = -60;
  10. private var i:Number;
  11. private var j:Number;
  12. public function C_gallery() {
  13.  //this._visible = false;
  14. }
  15. public function initialize(XMLSource:XML) {
  16.  // parses XML file into an intricated array itemList
  17.  catNumber = XMLSource.firstChild.childNodes.length;
  18.  for(i=0 ; i < catNumber ; i++) {
  19.   itemList[i] = new Array();
  20.   itemList[i][0] = XMLSource.firstChild.childNodes[i].attributes.galerie_id;
  21.   imgNumber = XMLSource.firstChild.childNodes[i].childNodes.length;
  22.   for(j=1 ; j <= imgNumber ; j++) {
  23.    itemList[i][j] = new Object();
  24.    itemList[i][j].src = XMLSource.firstChild.childNodes[i].childNodes[j-1].attributes.src;
  25.    itemList[i][j].titre = XMLSource.firstChild.childNodes[i].childNodes[j-1].childNodes[0].firstChild.nodeValue;
  26.    itemList[i][j].legende = XMLSource.firstChild.childNodes[i].childNodes[j-1].childNodes[1].firstChild.nodeValue;
  27.    itemList[i][j].technique = XMLSource.firstChild.childNodes[i].childNodes[j-1].childNodes[2].firstChild.nodeValue;
  28.   }
  29.  }
  30.  delete XMLSource;
  31. }
  32. public function loadGallery(id:Number) {
  33.  this.clearGallery();
  34.  var alpha:Tween = new Tween(this , "_alpha" , Strong.easeOut , 0 , 100 , 2 , true);
  35.  imgNumber = itemList[id].length;
  36.  for(i=1 ; i<imgNumber ; i++) {
  37.   imgBttn = this.attachMovie("mc_galleryItem" , "mc_galleryItem_"+i , i);
  38.   if (i>9)
  39.   {
  40.    imgBttn._x = (i%9) * hspace;
  41.    imgBttn._y -= hspace;
  42.   }
  43.   else
  44.   {
  45.    imgBttn._x = i * hspace;
  46.   }
  47.   this["mc_galleryItem_"+i].id = id;
  48.   this["mc_galleryItem_"+i].src = i;
  49.   this["mc_galleryItem_"+i].createEmptyMovieClip("mc_target" , 1);
  50.   this["mc_galleryItem_"+i].mc_target.loadMovie("vignettes/" + itemList[id][i].src);
  51.  }
  52. }
  53. private function clearGallery() {
  54.  for(i=1 ; i<imgNumber ; i++) {
  55.   this["mc_galleryItem_"+i].removeMovieClip();
  56.  }
  57. }
  58. }


 
euh voilà, là c'est une classe très laide qui gère un objet "galerie" sur un portfolio online typique. elle est pétée de bug, mais c'est un exemple d'une classe de bas niveau utilisée en lieu et place d'une platrée de code procédural ingérable.

Message cité 1 fois
Message édité par craps_youpla le 14-08-2006 à 21:10:27
Reply

Marsh Posté le 15-08-2006 à 04:50:03    

craps_youpla a écrit :


 
euh par définition c'est complexe, sinon on me paierait pas pour le faire :\ du code pas trop complexe, c'est antinomique non ? essaie de poser une définition claire du "complexe" à tes yeux pour m'aider à appréhender quelles difficultés tu rencontres.


 
Lol, oui c'est sur.
 
En fait, je travaille sur un RPG (style mario), pas pour un client mais pour que je le code en AS2 POO.  
Un truc basique avec une map constitué de briques de même dimension (tiles), il se déplace de gauche a droite et en hauteur.
Bref, je suis encore en train de réfléchir sur tout ce que je vais devoir gérer (décor, personnages, intéractions, niveau).
D'ailleurs, vu que tu sembles bien calé  :) , cette technique est-elle toujours d'actualité ?
 
Je m'écarte un peu de ma question de départ car c'est vrai que pour un jeu, l'utilité est assez flagrante (après techniquement, il faut encore y arriver :) ).
 
Mais pour un site, par exemple, tu dis avoir une classe de preload, donc je suppose que tu as un code ou tu as :  
Les paramètres
-MC conteneur,
-MC barre_progress,  
et les variables :
-PoidTotal,  
-PoidEnCours,  
-Ratio.
 
Ensuite sur ta scène dans le fla, à la 1ere image , tu appelles ta classe avec tes fichiers contenus dans la bibliothèque auquels tu as un mis un nom de liaison (suis je clair ?).
Après dans le fla, je suis paumé à ce niveau là.
 
ça doit donner qqe chose du genre  

Code :
  1. var preload:Preload=new Preload();


mais après je suis complètement perdu.  
J'ai peut être même dis des betises juste sur la théorie dans ce post.
 
Autre cas typique,
je charge un fichier xml de news (généré à chaque mise à jour dans le back-office).
La personne clique sur le bouton "Actualité", Hop, je vais faire appel à une classe type (un peu pléonasme :) ) qui va charger le xml et le traiter.
Sauf qu'il existe plein de méthode, un systeme de navigation est généralement unique dans un site.
 
Pour un systeme de news
-un simple textfield avec 2 boutons haut/bas, une scrollbar
 
ou plus complexe (mais plus joli),  
 
-un clip conteneur news contenant un autre clip news_item qui contiendrait 2 champs textes, titre_news et contenu_news. Cela permettrait avec un systeme de masque de faire des tween sur chaque news (vu que chaque news serait dans un clip au final). Bon ce n'est surement pas très clair, le meilleur exemple c'est que tu vois un exemple, http://www.effet-placebo.fr/ , regarde le système de news.
 
Le plus dur aussi (désolé ça va faire un pavé), c'est de créer des classes assez larges pour qu'elles s'adaptent au maximum de projet, hors, ça me parait assez difficile.  
Pour résumé, mon plus gros souci est de raisonner en POO, ensuite de l'appliquer avec l'IDE de Flash.
Mais par exemple, ta classe est simple (pas 10 000 lignes de codes) et c'est typiquement ce genre d'aide que je recherche, du concret "accessible". Pas pour copier le code, mais comprendre grace à celui-ci, sans de suite entrer dans des scripts de dingo (exemple : moteur 3d, et j'en passe :) )
 
Petite apparté
 
Je ne pense être la seule personne (si ?  :ouch: ) à avoir lu le tuto Intro a POO en AS2 de média box et au final, n'avoir rien compris, encore une fois pas sur la théorie (nécessaire) mais sur l'utilisation.
Un "bon" tuto serait selon moi de faire un exemple simple de preload en procédural, et sa transcription en AS2 avec des classes. Ou comme toi, un exemple de galerie, toujours dans un esprit simple, à la fois pour qu'il reste accessible pour le débutant, et aussi que le développeur qui met à dispo ce tuto ne voit pas son code betement copié par un type qui dit "wé je sais faire de la POO" (j'ai été comme ça au début, avec Flash 5 ^^, hop un preload, hop un champ texte avec scroll, j'adaptais sans vraiment comprendre).


Message édité par CUT HERE le 15-08-2006 à 07:31:12
Reply

Marsh Posté le 20-08-2006 à 12:07:57    

Citation :

CUT HERE a dit :
Le plus dur aussi (désolé ça va faire un pavé), c'est de créer des classes assez larges pour qu'elles s'adaptent au maximum de projet, hors, ça me parait assez difficile.


 
Lorsque tu auras quelques notions plus concrêtes de la POO, tourne-toi vers la notion de classes abstraites. ça te permet de développer une "base" qui sera réutilisée par tes classes.
 
Par exemple : créer une classe "AbstractTile" qui ne contient que le code nécessaire à l'affichage et au placement de ton tile, puis étendre d'autres classes à partir de cette première en rajoutant les fonctionnalités que tu veux : SimpleTile pour un tile basique, AdvancedTile pour un tile avec un code plus complexe, etc...
 
Et chacune de tes classes contient la "base", c'est à dire les variables et méthodes de la classe abstraite.

Reply

Marsh Posté le 20-08-2006 à 12:58:04    

Egalement, pour l'expliquer à la manière de craps_youpla... faire de la poo, c'est "encapsuler" les données pour n'avoir plus qu'a instancier un objet et l'utiliser, plutôt que d'avoir une tonne de code sur ta timeline.  
 
Mais ça va aussi bien plus loin. Il y a beaucoup de "design patterns" applicables en orienté objet, et c'est là toute la force de cette manière de programmer... c'est relativement simple de faire une classe, de l'instancier et de l'utiliser, puis de dire "yeah, je fais de la poo".  
En réalité, la poo va beaucoup plus loin dans l'assemblage d'objets. La délégation, le MVC, l'Observer, le Singleton, le ServiceLocator couplé au pattern Command pour l'exécution de commandes vers le serveur, etc... Il y a plein de subtilités qui sont assez complexes au premier abord, mais très intéressantes à implémenter lorsqu'on les a compris.
 
Pour ce qui est du linkage de classes avec la bibliothèque, il existe 2 méthodes : soit tu hérite ta classe de MovieClip, soit tu fais de la composition. J'ai ma préférence pour la composition, car l'héritage nécessite d'aller toucher aux éléments de la librairie. développant en général avec mtasc (et swfmill pour générer les librairies), il est plus difficile de faire cette liaison par héritage.
 
La composition se distingue par la chose suivante : c'est une classe à laquelle on passe en paramètre au constructeur le "parent", le movieClip qui va l'héberger.
A partir du parent, on va faire un "createEmptyMovieClip" pour créer un nouveau mc qui correspondra à l'élément de base de la classe.
On manipule ensuite ce mc grace aux méthodes de la classe. ça implique que "this" ne correspond pas au mc mais à la classe elle-même, lorsqu'on code. Mais mis à part ce détail, ça revient à peu près au même que de développer par héritage.
 
Voici un exemple basique de composition (basique... bon, il est déjà un peu long, mais y a les commentaires avec...) :
 

Code :
  1. import mx.events.EventDispatcher;
  2. import com.bourre.commands.Delegate;
  3. [Event( 'press' )]
  4. // --------------------------------------------------------------------------------
  5. /**
  6. * @class   HaircolorButton
  7. * @author   titouille
  8. * @version   0.1
  9. * @date   11.08.2006
  10. * @description  <p>Design HaircolorButton</p>
  11. */
  12. class ch.titouille.controls.HaircolorButton
  13. {
  14. // --------------------------------------------------------------------------------
  15. // VARIABLES DECLARATIONS
  16.   /**
  17.   */
  18.  public static var SymbolName:String = "ch.titouille.controls.HaircolorButton";
  19.     public static var SymbolOwner = ch.titouille.controls.HaircolorButton;
  20.     private static var isSymbolLinked = Object.registerClass('__Packages.ch.titouille.controls.HaircolorButton', SymbolOwner);
  21.  private var nColor:Number;
  22.  private var nH:Number;
  23.  private var nW:Number;
  24. // --------------------------------------------------------------------------------
  25. // CONTROLS DECLARATIONS
  26.   /**
  27.   */
  28.  private var _targetMC:MovieClip;
  29. // --------------------------------------------------------------------------------
  30. // FUNCTIONS DECLARATION
  31.  // --------------------------------------------------------------------------------
  32.  // --------------------------------------------------------------------------------
  33.   /**
  34.   * @var dispatchEvent:Function to broadcast event from EventDispatcher
  35.   * @var addEventListener:Function to add listener on component
  36.   * @var removeEventListener:Function to remove listener on component
  37.   */
  38.  public var dispatchEvent   :Function;
  39.  public var addEventListener   :Function;
  40.  public var removeEventListener  :Function;
  41.  public var removeMovieClip   :Function;
  42.  private static var eventDispatcherInitialized = EventDispatcher.initialize(HaircolorButton.prototype);
  43. // --------------------------------------------------------------------------------
  44. // EVENTS DECLARATIONS
  45.  // --------------------------------------------------------------------------------
  46.   /**
  47.   */
  48. // --------------------------------------------------------------------------------
  49. // CONSTRUCTOR
  50.  // --------------------------------------------------------------------------------
  51.   /**
  52.   * @constructor
  53.   */
  54.  function HaircolorButton( instanceName:String, target:MovieClip, depth:Number, props:Object, mcProps:Object )
  55.   {
  56.   _targetMC = target.createEmptyMovieClip( instanceName, depth );
  57.   _targetMC.gotoAndStop(1);
  58.   for( var val:String in props )
  59.    this[val] = props[val];
  60.   init( mcProps );
  61.   }
  62. // --------------------------------------------------------------------------------
  63. // --------------------------------------------------------------------------------
  64. // INITIALISATION AND BASE METHODS
  65.  // --------------------------------------------------------------------------------
  66.   /**
  67.   * initialize the control
  68.   *
  69.   * @param props:Object properties to add to the control
  70.   * @return Void
  71.   */
  72.  private function init( props ):Void
  73.   {
  74.   for( var val:String in props )
  75.    this[val] = props[val];
  76.   _targetMC.focusEnabled = true;
  77.   _targetMC._focusrect = true;
  78.   createChildren();
  79.   }
  80.  // --------------------------------------------------------------------------------
  81.   /**
  82.   * initialize the control
  83.   *
  84.   * @param props:Object properties to add to the control
  85.   * @return Void
  86.   */
  87.  private function createChildren()
  88.   {
  89.   colorElement();
  90.   _targetMC.onPress = Delegate.create( this, press );
  91.   }
  92.  // --------------------------------------------------------------------------------
  93.   /**
  94.   * move the control to the x:y positions
  95.   *
  96.   * @param x:Number x position
  97.   * @param y:Number y position
  98.   * @return Void
  99.   */
  100.  public function move( x:Number, y:Number ):Void
  101.   {
  102.   _targetMC._x = x;
  103.   _targetMC._y = y;
  104.   }
  105. // --------------------------------------------------------------------------------
  106. // GETTER / SETTER
  107.  // --------------------------------------------------------------------------------
  108.   /**
  109.   * set visibility
  110.   *
  111.   * @param state:Boolean state of property
  112.   * @return Void
  113.   */
  114.  public function setVisible( state:Boolean ):Void
  115.   {
  116.   _targetMC._visible = state;
  117.   }
  118.  // --------------------------------------------------------------------------------
  119.   /**
  120.   * get visibility
  121.   *
  122.   * @return Boolean
  123.   */
  124.  public function getVisible():Boolean
  125.   {
  126.   return _targetMC._visible;
  127.   }
  128.  // --------------------------------------------------------------------------------
  129.   /**
  130.   * get color
  131.   *
  132.   * @return Number
  133.   */
  134.  public function getColor():Number
  135.   {
  136.   return nColor;
  137.   }
  138. // --------------------------------------------------------------------------------
  139. // HANDLERS
  140.  // --------------------------------------------------------------------------------
  141.   /**
  142.   * press handler
  143.   *
  144.   * @return Void
  145.   */
  146.  private function press():Void
  147.   {
  148.   dispatchEvent( { type:'press', color:nColor } );
  149.   }
  150. // --------------------------------------------------------------------------------
  151. // DRAW METHODS
  152.  // --------------------------------------------------------------------------------
  153.   /**
  154.   * draw rect in movieClip
  155.   *
  156.   * @return Void
  157.   */
  158.  private function colorElement():Void
  159.   {
  160.   with( _targetMC )
  161.    {
  162.    beginFill( nColor, 100 );
  163.    moveTo( 0, 0 );
  164.    lineTo( nW, 0 );
  165.    lineTo( nW, nH );
  166.    lineTo( 0, nH );
  167.    lineTo( 0, 0 );
  168.    endFill();
  169.    }
  170.   }
  171. }

 
 
 
 
En fait, c'est un bouton paramétrable au niveau de la couleur, la largeur et la hauteur.
 
Dans ma classe principale, je n'ai plus qu'a faire :  
 

Code :
  1. var myNewHairColorButton:HaircolorButton = new HaircolorButton( 'myNewHairColorButton', _level0, 10, { nW:100, nH:50, nColor:0xff0000 }, {} );


 
 
et mon bouton est créé. Je peux ensuite utiliser la méthode "move( x, y )" pour le déplacer.
Dans mon cas, je passe 2 objets dans le constructeur. Le premier peut contenir des valeurs de variables internes à la classe (nW, nH, nColor), le second peut contenir des valeurs de propriétés du movieClip qui sert d'instance principale à ma classe. J'aurai pu y passer des propriétés tels que _x, _y, _xscale, _yscale, etc...
 
 
Ainsi, tout le code de mon bouton est dans une classe, et lorsque je veux créer un nouveau bouton, je n'ai plus qu'a l'instancier.  
Le code est relativement simple, je n'ai pas voulu compliquer... Mais on pourrait imaginer :  
 
- rajouter une valeur par défaut à la propriété nColor (voir la section déclaration de variables) :

Code :
  1. private var nColor:Number = 0x00ff00;


- rajouter une méthode "setColor( color:Number )" qui permette de recoloriser le carré après son instanciation : (voir la section getters/setters) Il faudrai d'abord rajouter la ligne  

Code :
  1. _targetMC.clear();


en début de méthode colorElement, puis rajouter la méthode suivante :
 

Code :
  1. public function setColor( color:Number ):Void
  2. {
  3. nColor = color;
  4. colorElement();
  5. }


 
Ensuite, on n'aurai plus qu'a appeler :
 

Code :
  1. myNewHairColorButton.setColor( 0xff00ff );


pour modifier la couleur du bouton.
 
Je pourrais également aller puiser des éléments dans la bibliothèque à coups d'attachMovie pour rattacher des graphiques en vue de personnaliser mon bouton. Les possibilités sont multiples.
 
Et il est intéressant de regarder la méthode "press" qui utilise l'eventDispatcher afin de générer un évenement lorsqu'on presse sur le bouton.
Cet évenement peut être intercepté dans la scène principale en utilisant les mêmes méthodes que les composants V2 :
 

Code :
  1. myNewHairColorButton.addEventListener( 'press', new Delegate( this, pressColorButton ) );
  2. function pressColorButton( evt:Object ):Void
  3. {
  4. trace( evt.color ); // récupération de la couleur, passée dans la classe via la méthode dispatchEvent
  5. }


 
La gestion d'évenement est intégrée via l'eventDispatcher, donc on a tout ce qu'il faut pour faire du travail propre.
 
Voilà, en espérant que ça soit compréhensible, lol
 
a++

Reply

Marsh Posté le 20-08-2006 à 13:21:14    

Merci titouille, je vais étudier attentivement ton code. Tu as utilisé  des notions un peu compliqué lol avec la POO.  
 
Je peux te poser une question, je code un mini rpg style mario (je trouve que ce type de jeu est assez bien fait pour appréhender la POO).
J'en suis encore qu'au papier a définir ce que je vais devoir gérer. actuellement, en as1, j'utilise une map créé a partir d'un tableau et je rempli de tuiles. (je pense que tu vois ce que je veux dire).
 
Mais en POO et as2, ça devient moins facile pour créer les classes etc. Mais je vais essayer pour le moment de me creuser encore le crane (hé ho, ça serait trop facile si tu me donnais la réponse de suite :) ).
 
Par contre, le coup de la map en tuile me gene en fait. Par exemple, je n'arrive pas (meme en as 1 :/) a créer des objets de tailles différentes.
 
Regarde cette image.
http://www.juegomania.org/Super+Ma [...] +Bros..jpg
 
Les nuages sont fait comment ? je pensais moi attacher des clips avec une profondeur supérieur a ma map constitué de tuiles (ou briques) de tailles fixes. Au niveau du tunnel, la "bidouille" que j'ai trouvé est de constitué ma map par exemple de cette sorte
 
[ 3 4 5 ] avec comme symbole pour le 3 et 5, le coté de l'entrée (donc la tuile contient du bleu issu du fond, et le dessin du rebord) et pour le symbole 4 le milieu de l'entrée du tunnel auquel je teste, si fleche bas, j'accède à un autre niveau. Je trouve ça plus que rudimentaire  :sweat:  
Je suis preneur de conseil si ça ne te dérange pas (en attendant, lecture de ton post et mise en application pour comprendre )

Reply

Marsh Posté le 20-08-2006 à 13:54:48    

Re,
 
pour le coup de la map, il faut savoir qu'en général, on développe une "multi-map" dont les différents niveaux accueillent différents éléments graphiques...
 
Par exemple la map la plus profonde sera le ciel, puis devant le ciel, on aura la foret, puis devant la foret, en haut, les nuages, puis devant les nuages, on aura enfin le sol et les briques qui interagissent avec le héro.
 
Après, au niveau des nuages, pour avoir un meilleur rendu encore, tu pourrais créer une map différenciée, superposée au reste, et qui se déplace différemment (plus ou moins vite que le reste)... pour donner une meilleure impression de mouvement.
 
Mais bon, je ne me suis pas beaucoup penché sur les jeux, mis à part l'isométrie (un moteur qui attend toujours sa suite, lol). Je m'étais pas mal inspiré à l'époque des tutos de tonypa : http://www.tonypa.pri.ee/tbw/start.html
 
Tu devrai y trouver une mine d'informations utiles pour le développement de jeux à base de briques. C'est développé en AS1, mais sous forme de classes, donc ça derai t'aider à comprendre la mise en place des différents éléments.
 
Mais ton système ne semble pas si rudimentaire... ça fonctionne de cette manière... si le héro est sur la bonne brique et qu'il actionne la flèche vers le bas, ça va déclencher un trigger qui va lancer un nouveau processus, sinon rien.
 
a++

Reply

Marsh Posté le 20-08-2006 à 14:34:56    

concrétement, tu suis ce que dit titouille dans un précédent post :
- une classe AbstractTileMap, qui implémente une logique générique,
- une instance de ConcreteTileMap (héritant d'Abstract) par couche successive de tile. La taille des tiles étant définie au niveau de cette classe concrète, et non de l'AbstractTileMap.
- le scrolling différentiel est géré dans une classe de plus haut niveau, qui agrége (composition) les différentes ConcreteTileMap - une classe GameView par exemple.
 
note que c'est ambitieux de te lancer là-dedans sans avoir une certaine maîtrise, commence par développer des composants UI simples, ce qui est un bon moyen pour appréhender le dév. oo sous Flash. Construit ensuite des patterns de plus en plus complexe avec ces objets : http://home.earthlink.net/~huston2/dp/patterns.html
 
Java est le langage par excellence de la POO, ça vaut le coup de l'apprendre aussi...

Reply

Marsh Posté le 20-08-2006 à 14:34:56   

Reply

Marsh Posté le 20-08-2006 à 14:42:33    

et CUT_HERE qui disait que j'utilisais des notions un peu compliquées, loool :)

Reply

Marsh Posté le 20-08-2006 à 14:49:47    

rôooh, on a été hyper-didactiques tous les deux :)
 
(et qui a parlé de patterns le premier, hein  ;)  ?)


Message édité par craps_youpla le 20-08-2006 à 14:53:37
Reply

Marsh Posté le 20-08-2006 à 15:04:30    

C'est vrai, ça !! qui a parlé de patterns, d'abord ?? :D

Reply

Marsh Posté le 20-08-2006 à 15:18:38    

Au fait, j'apprécierai que tu répondes à la toute première question du topic en détaillant de la même manière que moi, pour ma culture personnelle. Je pense que c'est une question que tout développeur Flash se pose actuellement : où et quand (et à partir de combien $$$ ?) sortir l'artillerie lourde ? Pour moi, en dessous de 10j, j'évite les patterns complexes, en dessous de 5, ça sera du procédural moisi :)


Message édité par craps_youpla le 20-08-2006 à 15:22:58
Reply

Marsh Posté le 20-08-2006 à 17:51:48    

Ben disons que ma réponse était déjà dans une autre... J'utilise mtasc et swfmill pour générer mes librairies et mes animations (encore 1 peu mx 2004, pour faire les flas de librairie pour les clients aussi)... Donc poo à toutes les sauces, que ça soit pour un petit ou un gros projet, ça reste toujours du dev en AS2, avec au moins quelques rudiments de poo.
 
Dans l'ensemble, je développe d'une manière assez simple, sans trop rentrer dans les patterns lorsque je n'en ai pas d'utilité. Quand je dois créer des interfaces de site web ou des applicatifs qui véhiculent beaucoup de données, là je commence à y regarder de plus près pour mettre en place des mécanismes un peu plus complexes.  
 
En général, je préfère faire des petits applicatifs que des grosses usines à gaz difficiles à maintenir. Donc je préfère m'appliquer car ces applicatifs subissent souvent des modifications / évolutions après coup car le client désire ceci ou celà en +. Mais lorsque je parle d'application, c'est plus la manière de créer mes classes et de les assembler que le fait d'utiliser des patterns...
Car dès fois, on te parle de patterns par ci, patterns par là, mais il n'y a pas forcément un réel besoin de les utiliser, selon ce que tu fais... J'ai aussi dès fois l'impression que c'est + pour dire qu'on l'a fait que pour en utiliser toutes les possibilités. Les patterns servent à résoudre des cas bien spécifiques, mais ce sont souvent des cas qu'on rencontre lorsqu'on commence du développement lourd, pas des applicatifs de quelques jours.
 
Sinon, je réutilise un maximum mes classes, même si ça reste difficile à faire selon les projets... J'ai différentes classes d'utilitaires pour XML, les fichiers txt (config), les css, les styles sur composants V2, des trucs axés dataSet et recherche dans les tableaux, etc... j'essaye de développer des composants qui sont rapidement modifiables pour pouvoir les adapter selon les projets.
 
Et j'ai quelques éléments de framework inspirés de ARP pour le développement en mode Formulaire, vers lequel je me suis penché assez rapidement, du genre des classes abstraites pour les formulaires, des patterns singleton, command pour les requêtes, etc...
Grace à ça, je peux mettre en place assez rapidement toute une architecture pour du développement lourd via le mode "formulaires".  
 
Toutes ces classes réutilisables sont situées dans un et un seul répertoire sur mon disque dur. Le chemin est valorisé dans les préférences ActionScript, je peux donc les atteindre depuis toutes les animations que je crée, sans pour autant en avoir de multiples copies sur le disque.
 
J'ai également un framework php qui me permet de coupler Flash à php via remoting. Je n'ai plus qu'a développer des classes en php et les méthodes dont j'ai besoin pour récupérer mes données.
 
Vala :)

Reply

Marsh Posté le 20-08-2006 à 18:15:27    

SSII ou Web-agency?

Reply

Marsh Posté le 20-08-2006 à 18:25:53    

Indépendant, en Suisse, en plein milieu des montagnes :p :)

Reply

Marsh Posté le 29-08-2006 à 09:13:25    

Bonjour,
 
J'aurais une petite question:
Pour m'initier à la POO désire gerer un systême de profondeur sur un axe Z entre des movie clips qui seront placés ultérieurements et dont les noms d'occurences seront variables. Ajoutons à cela la gestion d'une "caméra".
La logique voudrais que je crée une classe zClip extends movieclip pour ajouter des propriétés spécifiques à ces clips, une classe zHandler qui gêrera le tout (swapdepth, xscale, yscale, etc) et une classe zCamera, non? Et ces classes ne devraient pas hériter des éléments des autres... Dans ce cas, est il possible de partager quand même des éléments (par exemple une liste des occurences zClip pour les calculer dans le gestionnaire)?
 
De plus dans le cas où je désirerais qu'un clip devienne via actionscript un objet zClip ça se passe comment?

Reply

Marsh Posté le 29-08-2006 à 21:28:23    

oui (drôle de question), on appelle ça la composition.
 
Caster un MovieClip via actionscript c'est pas possible, mais en le liant simplement à ta classe ZClip via la bibliothèque ça suffit pour mettre en place la structure que tu décrit.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed