Forums Développement Multimédia

Aller au contenu

changer axe de rotation par le code as3

CODE 3D

50 réponses à ce sujet

#46 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 12 March 2015 - 13:56 PM

Je commence à entrevoir où tu veux aller, mais j'aurais encore plein de questions…
…notamment : que fait la classe Subsonic exactement, pourquoi est-elle de type displayObject ? Ce genre de choses.

En fait, je pense que tu cumules sur un gros projet 2 principaux défauts des débutants :
– parce que tu as beaucoup travaillé dans Flash, tu imagines tes structures en partant des objets graphiques. Il vaut mieux faire l'inverse.
– tu ne sais pas 'abstraire' une structure. Hors, c'es là tout l'intérêt des classes.

Par exemple : au lieu de faire une classe Supersonic, une autre Subsonic, tu devrais sans doute faire une classe Thematique. Qui ressemblerait un peu à ça :
package {
  public class Thematique {
 
   public var nom:String;
   public var image:DisplayObject;
   public var cours:uint;
 

   public function Thematique(_nom:String,_image:DisplayObject,_cours:uint=0):void {
        nom = _nom;
        image = _image;
        cours = _cours;
   }
  }
}

Et à l'usage, tu peux "structurer" tes thématiques avec des occurrences.
Dès que c'est fait tu dois pouvoir "oublier" Subsonic, et ne penser qu'en terme de Thematique.
Exemple de classe Main :
package {
  public class Main {


   var thematiques:Array=[];
 
   function Main():void {
        thematiques.push(new Thematique ("Subsonic",ImageSubsonic,3));
        thematiques.push(new Thematique ("Supersonic",ImageSupersonic,9));
        thematiques.push(new Thematique ("Propeller",ImagePropeller,2));
 
 
        addChild (menu(thematiques[0]);
   }
 
   public function menu(_them:Thematique):DisplayObject
   {
        var _menu:DisplayObject = new DisplayObject();
        for (var i:int = 0; i< _them.cours; i++) {
         var _image:DisplayObject = new _them.image();
         _image.y = _menu.height;
         _menu.addChild(_image);
        }
        return _menu;
   }
  }
}
Dans l'exemple, j'ai créé une fonction "menu" qui ne connais que le type Thématique et est capable de construire un displayObject contenant x images correspondant à la thématique. La fonction se débrouille pareil pour un Subsonic que pour un Supersonic, un Propeller…
NB : ensuite, on peut se demander si la bonne position pour cette fonction, c'est dans la classe Main ou dans la classe Thematique…

Est-ce que ça te parle ?

#47 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 12 March 2015 - 17:09 PM

ok je commence à comprendre ...ce que abstraction veut dire .

-je suppose aussi que dans ton exemple seule la premiere thematique est ajoutée à la displaylist
-de meme toutes les images seront au meme endroit.

Je teste et essaie de repenser facon globale. :?
++
flashdevelop 4.5.2.5 +flexsdk
as3

#48 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 13 March 2015 - 09:07 AM

Voir le messageToniog, le 12 March 2015 - 17:09 PM, dit :

-je suppose aussi que dans ton exemple seule la premiere thematique est ajoutée à la displaylist

Oui. C'est ce que fait la ligne :
addChild (menu(thematiques[0]);

Mais on est bien d'accord que ce n'est qu'un exemple, pas une obligation. Comme je ne visualise pas ce que tu veux faire, tu dois sans doute poser d'autres choix. Mais la structure est là.
Par exemple, si tu veux afficher tous les menus de toutes les thématiques, une sorte de tableau, il suffit de parcourir le tableau des thématiques :
var tous_les_menus:DisplayObject = new DisplayObject();
for each(var _t:Thematique in thématiques) {
  var _m:DisplayObject = menu(_t);
  _m.x = tous_les_menus.with;
  tous_les_menus.addChild(_m);
}
addChild (tous_les_menus);


#49 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 13 March 2015 - 15:10 PM

bjr,
j'ai des problemes avec la classe DisplayObject qui "refuse" de s'instancier !!! dans la fonction menu si je la remplace par la classe Sprite, ca marche.

var _menu:DisplayObject = new DisplayObject();
 

flashdevelop 4.5.2.5 +flexsdk
as3

#50 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 13 March 2015 - 15:16 PM

Citation

DisplayObject est une classe de base abstraite. De ce fait, il est impossible de l’appeler directement. Appeler new DisplayObject() renvoie une exception ArgumentError.

alors comment faire ?
flashdevelop 4.5.2.5 +flexsdk
as3

#51 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 13 March 2015 - 17:03 PM

Arf.
Désolé.
J'ai tout fait sans test et là encore, en supposant que tu connaissais les objets graphiques…

Petit recapitulatif :
- la classe mère est DisplayObject

En classes filles directes : on à :
– Shape qui à juste une zone graphique vectorielle
– Bitmap qui est juste une zone d'affichage bitmap
– DisplayObjectContainer qui permet d'afficher une liste de DisplayObjects
– et sans doute d'autres exotiques…

Le plus souvent, tu te serviras de DisplayObjectContainer, mais c'est aussi une classe virtuelle. Tu ne peux pas l'instancier.
Elle à comme enfants :
– Sprite : un conteneur très simple et léger, peu de fonctions et propriétés donc rapide
– MovieClip : un conteneur avec scénario inclus, propriétés dynamiques, objet gourmand et lent mais qui sait tout faire
[EDIT : je viens de revoir mes classiques, la hiérarchie est un peu plus compliquée, mais dans l'idée, c'est quand même ça.


Donc, tu pourrais garder le type de tes variables en DisplayObject, sauf si tu veux ajouter des objets "dedans". Dans ce cas, tu dois les typer en DisplayObjectContainer, ça te permettra d'utiliser son instruction addChild().

Par contre, pour l'opération new, tu dois utiliser une classe Sprite ou MovieClip.
Dans ton cas, un Srite me semble suffisant, alors autant en profiter pour son côté léger.

Ce qui te donne :
var _menu:DisplayObjectContainer = new Sprite();


Si ça te perturbe un peu, retiens juste le Sprite, et type ta variable du même type que le new. Ça, ça marche tout le temps :
var _menu:Sprite = new Sprite();
Utiliser un type "parent" pour typer la variable associée à un objet, c'est de l'optimisation (mais c'est aussi très bon pour la conceptualisation dans le cerveau, si tu as pigé le truc je te conseille de le pratiquer pour t'y habituer).



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP