Forums Développement Multimédia

Aller au contenu

changer axe de rotation par le code as3

CODE 3D

50 réponses à ce sujet

#1 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 12 February 2015 - 09:51 AM

Bonjour,

j'utilise flashdevelop, je crée des objets Embed par le code suivant :
[Embed(source="../lib/cam.png")]
            const Sho:Class;
            var test45:DisplayObject = new Sho();

dans des classes ...

Je souhaite avoir acces 'simplement' à l'axe de rotation pour pouvoir creer un effet de mon image se retourne sur elle meme et non une rotation loin de son axe comme j'ai actuellement.

Je n'utilise pas Flash pour creer mes images. Elles sont imbriquées dans ma classe as. Je gère leurs positions ...mais la position de l'axe de rotation ???

J'ai beaucoup cherché et trouve un element de solution via la classe bitmap ...bitmpafill??

Pouvez vous me confirmer si je suis sur la bonen voie ou non?
Merci
++ :smile:
flashdevelop 4.5.2.5 +flexsdk
as3

#2 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 12 February 2015 - 10:41 AM

bonjour
je sais pas si j'ai bien tout compris donc j'ai fait un exemple
vois si ca correspond a ta demande
http://www.citroen-f...niog/Toniog.htm
@+ gustave02.

#3 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 12 February 2015 - 10:53 AM

Bonjour Toniog

La bonne solution me semblerait plutôt d'utiliser un conteneur, de type Sprite, autour des images, qui te permettront de positionner l'image centrée dans le conteneur, puis de faire tourner le conteneur.
Ceci, parce qu'il y a 2 domaines différents qui jouent sur la rotation :
- la rotation proprement dite : la matrice de transformation
- la représentation visuelle de cette rotation : la perspective

Pour la rotation proprement dite, le plus simple est d'avoir accès aux propriétés rotationX, rotationY et rotationZ des objets d'affichage, MAIS ceci nécessite que ton objet soit centré. Sinon, il te faut triturer les matrices de transformation elles même, et là, c'est assez coton. A toi de savoir si tu as le niveau ou pas.
Cas pratique : si test45 est ton image, alors :

// récupérer l'environnement de l'image
var image_parent:DisplayObjectContainer = test45.parent;

// dupliquer l'environnement de l'image
var sprite:Sprite = new Sprite();
sprite.x = test45.x + test45.width/2;
sprite.y = test45.y + test45.height/2;

// Recentrer l'image
test45.x = - test45.width/2;
test45.y = - test45.height/2;

// Encapsuler l'image dans le sprite
image_parent.addChild(sprite);
sprite.addChild(test45);

// Tu peux attaquer les rotations sur le sprite
sprite.rotationY=60;

Un exemple en flash avec ce code :
Fichier joint  test.fla   904.5 Ko   0 téléchargement(s)
Tu peux l'ouvrir et tester, le carré gris est bien transformé.
Si tu déplaces manuellement le carré gris vers les bords, tu vas tout de suite comprendre sur quoi joue la deuxième partie : la vue de la rotation change selon son emplacement sur la scène : c'est de la perspective.

Si à ce stade l'effet te convient, tu as de la chance. Car sinon, pour appliquer une perspective personnelle, ça devient un peu plus compliqué. Il faut que tu regardes la classe PerspectiveProjection du package flash.geom. Elle te permettra d'appliquer un espace de perspective spécifique à un objet (et à ses enfants) grâce à 3 propriétés : fieldOfView, focalLength et projectionCenter. Si tu as des notions en perspective, ces mots devrait vaguement te parler, sinon ce serait trop long de développer cette partie ici, mais si tu rencontres des soucis pour l'utiliser tu pourras reposer des questions.

Petit avis perso, si tu sens que tu n'as pas le niveau, il y a une méthode plus simple pour simuler une rotation qui consiste à étroitiser l'image (.scaleX) et à changer sa luminosité.

#4 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 12 February 2015 - 11:01 AM

@ gustave : je pense que Toniog veux plutôt faire ceci :


- Afficher le SWF -
Fichier joint  test.swf   1.11 Ko   4 téléchargement(s)

#5 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 12 February 2015 - 11:08 AM

oui
c'est pareil. il faut que le point de rotation soit au centre de l'objet (point d'ancrage).

j'ai utiliser un sprite contener pareil
tu prend rotationY et moi j'avais pris rotation


package
{
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite {
  [Embed(source = "Sans nom-1.gif")]private var Image: Class;
  private var contener:Sprite;
 
  public function Main():void
  {
   if (stage) init();
   else addEventListener(Event.ADDED_TO_STAGE, init);
  }
 
  private function init(e:Event = null):void
  {
   removeEventListener(Event.ADDED_TO_STAGE, init);
   var image:DisplayObject =  new Image();
   image.x = - (image.width / 2);
   image.y = -(image.height / 2);
 
   contener = new Sprite();
   contener.addChild(image);
   contener.x = 400;
   contener.y = 300;
   addChild(contener)
 
   contener.addEventListener(Event.ENTER_FRAME, tourne);
  }
 
  private function tourne(event:Event):void {
   contener.rotationY += 1;
  }
}

}
 

avec flash develop

Fichier(s) joint(s)



#6 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 12 February 2015 - 11:14 AM

merci je teste je vous dit.
flashdevelop 4.5.2.5 +flexsdk
as3

#7 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 12 February 2015 - 14:12 PM

J'ai bien compris l'idée mais la mise en oeuvre pose probleme.
J ai une classe main qui appelle une classe fille drapeau qui elle meme va appeler des sous classes pour chaque type de contenu
voici une de ses sous classes dans laquelle, j'affiche des images cliquables et que je veux animer "sur elles memes"
mais malgré mon effort de creer uncontener et d'y charger l'image à la bonne position ( demi largeur et hauteur) la rotation est toujours loin de ressembler à celle de gustave.
:cry: .

public class Subsonic extends Sprite
    {
        private var test456:DisplayObject;
        private var contener:Sprite;
        private var ii:int;
              private var titr:TextField;
              public var texform:TextFormat;
       
        public function Subsonic(para1:int)
        {
                [Embed(source = "../lib/eispn1.png")]
                var Sho:Class;
                        var test456: DisplayObject = new Sho();
                        //test456.width = 50;
                        //test456.height = 50;        
                        test456.x = -(test456.width/2);
                        test456.y = -(test456.height / 2);
                       
       
        contener = new Sprite();
        contener.addChild(test456);
        contener.x = 400;
        contener.y = 300 + 50 * para1;
        //imageparent.addChild(sprite);
        addChild(contener);
        //sprite.addChild(test456);
       
        this.ii = para1;
       
        titr = new TextField();
        texform = new TextFormat();
       
        addEventListener(MouseEvent.MOUSE_OUT, stopbouge)        
        addEventListener(MouseEvent.CLICK, qat );
        contener.addEventListener(MouseEvent.MOUSE_OVER, bouge);        
        //this.addChild(test456);
        }
       
       
         
          public function qat(param1:MouseEvent) : void
          {
          //conteneur.visible = false;
                 var _loc2_:URLRequest = new URLRequest("tonio/ATPL_POF_lessons/Subsonic-Aerodynamics" + ii + ".publi/pres/index.html");
          navigateToURL(_loc2_);
         }
         
          public function bouge(param1:MouseEvent) : void
          {
          //var b:uint = this.x;
          //trace(this.z);
          var myTween:GTween = new GTween(this, 2, { rotationY: 360, alpha:.5 }, { ease:Sine.easeInOut } );
            //this.rotationY = 60;
          //this.scaleX = .751;
          //this.scaleY = .751;
         texform.font = "Verdana";
                 texform.size = 15;
                 texform.color = 16711680;
                 titr.defaultTextFormat = texform;
                 titr.text = "Subsonics" + ii;
                 titr.x = 150;
                 titr.y = 50;
                 addChild(titr);
          }
       
          public function stopbouge(param1:MouseEvent) : void
          {
            // if(this.z == 50) var myTween:GTween = new GTween(this, 2, { z: 0, alpha:1 }, { ease:Sine.easeInOut } );
          titr.text = "";
         //this.scaleX = 1;
          //this.scaleY = 1;
          //this.z += 60;
          }
    }

}
 

flashdevelop 4.5.2.5 +flexsdk
as3

#8 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 12 February 2015 - 15:01 PM

tu utilise une classe GTween pour faire une rotation?
@+

#9 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 12 February 2015 - 15:15 PM

Si je teste ta classe dans flash, elle fonctionne très bien…
…sauf que :
Tu tween ton occurrence et non le conteneur de l'image, du coup, tu n'as rien changé.

Essaye d'abord avec :
var myTween:GTween = new GTween(contener, 2, { rotationY: 360, alpha:.5 }, { ease:Sine.easeInOut } );

Et si ça marche, demande toi ensuite si tu n'as pas une couche de trop cette fois.
Comme je ne connaissais pas la structure de ton programme, je t'ai conseillé d'ajouter un Sprite conteneur, mais en fait, tu en as déjà un ! La classe Subsonic peut peut-être prendre en charge ce rôle.
Dans ce cas, ta classe deviendrait :

public class Subsonic extends Sprite
        {
                private var test456:DisplayObject;
                private var ii:int;
                  private var titr:TextField;
                  public var texform:TextFormat;
               
                public function Subsonic(para1:int)
                {
                                [Embed(source = "../lib/eispn1.png")]
                                var Sho:Class;
                                                var test456: DisplayObject = new Sho();
                                                test456.x = -(test456.width/2);
                                                test456.y = -(test456.height / 2);
                                               
               
                this.addChild(test456);
                x = 400;
                y = 300 + 50 * para1;
               
           // etc
 


?

#10 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 12 February 2015 - 15:58 PM

La classe Tween ne fonctionne pas avec flex sdk seulement avec flash.
Donc je teste GTween , et je trouve cela tres simple d'usage.

pour ddler,
ca voudrait dire que mes ecouteurs sont mal placés ? pourtant ils ecoutent bien...
je testerai mardi car je vais me faire enlever un calcul :mad: :mad: .
En tout cas merci pour vos conseils je vous tiens au courant.


sinon mon shema :
class main
class drapeau (appelle dynamiquement les sous classes )
class subsonic (crée des boutons, les placent, des liens html)
class supersonic(idem)
class movie (crée d'autres boutons qui cliqués affichent dans un container des swf)
class videoflv (crée d'autres boutons qui cliqués affichent dans un container un FLVPlayback et lit le flv)
flashdevelop 4.5.2.5 +flexsdk
as3

#11 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 12 February 2015 - 16:31 PM

Les écouteurs sont bien placés, la fonction est bien lancé.
Pour moi, c'est juste l'appel du Tween qui est mauvais. Il lance la rotation sur l'objet Subsonic. Il devrait la lancer sur le contener.

#12 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 15 February 2015 - 11:52 AM

ok je teste.
merci
flashdevelop 4.5.2.5 +flexsdk
as3

#13 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 17 February 2015 - 16:40 PM

c'est bon, j'ai reussi à tourner sur moi meme dans la classe principale.

reste à transposer dans mes sousclasses ...

sinon j'ai enfin compris le passage d'une variable entre deux fonctions avec le

var mavar :Sprite = new Sprite();//variable locale accessible seulement dans la fonction qui la instancié
this.mavar = mavar;//rend l'acces à mavar dans le reste de la classe.
 

est ce que j'ai bon?
flashdevelop 4.5.2.5 +flexsdk
as3

#14 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 17 February 2015 - 17:08 PM

Bonjour Toniog

Voir le messageToniog, le 17 February 2015 - 16:40 PM, dit :

est ce que j'ai bon?


Pas tout à fait…

Effectivement, si tu déclares une variable dans une fonction, cette variable est "oubliée" dès l'arrêt d'exécution de la fonction.

public fonction ma_fonction():void {
   var ma_var:Sprite = new Sprite();
   trace (ma_var); // Fonctionne dans le corps de la fonction
}
trace(ma_var);// Ne fonctionne pas en dehors du corps de la fonction
 


Par contre :
this.mavar = mavar;
est un cas particulier qui est possible sur les classes dites "dynamiques" comme les movieClip. Pas sur la plupart des autres classes. C'est ce côté dynamique d'une classe qui permet de créer une variable "à la volée", à n'importe quel moment du code, et donc la possibilité de créer/déclarer la variable à l'intérieur d'une fonction. Inconvénient : les classes dynamiques sont beaucoup plus gourmandes et ralentissent l'exécution du code. Sur les gros projets, il vaut mieux éviter, surtout que cette simplicité apparente contourne les sécurités du compilateur et fait que certaines erreurs ne sont ni anticipées ni expliquées, et ça rend le déballage plus difficile.

Sinon, pour qu'une variable soit utilisables dans toutes les fonctions d'une classe, il suffit de la déclarer en dehors des fonctions. En peut le faire n'importe où, avant ou après l'écriture des fonctions, mais dans la pratique, on préfère déclarer les variables en début de classe.

var ma_var:Sprite = new Sprite();

public fonction ma_fonction():void {
   trace (ma_var); // Fonctionne dans le corps de la fonction
}

public fonction une_autre_fonction():void {
   trace (ma_var); // Fonctionne aussi
}

trace(ma_var);// Fonctionne encore


Enfin, les variables sont déclarées publiques ou privées. Ce qualificatif permet de préciser si une variable sera visible/joignable par une autre classe amenée à "piloter" l'instance. Dans tous les cas, la variable est déclarée en dehors des fonctions, et elle reste joignable à l'intérieur des fonctions de la classe où elle est déclarée.

Par exemple, voici une déclaration de classe Toto :
classe Toto {
  private var une_variable:int=0;

  public var une_autre_variable:int=0;

fonction une_fonction():void {
   trace(une_variable); // Fonctionne

   trace(une_autre_variable); // Fonctionne aussi
}

et lors de son utilisation :
var toto:Toto = new Toto();
trace(toto.une_variable); // Ne fonctionne pas : l'accès à la variable est privé
trace(toto.une_autre_variable);// Fonctionne, accès à la variable est publique


Et ceci est vrai aussi pour les fonctions, que l'on peut déclarer comme publiques et privées de la même façon.

(PS : il existe aussi d'autres qualificatifs comme protected… qui permettent quelques nuances supplémentaires)

#15 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 20 February 2015 - 15:54 PM

Merci pour ces notions ...

Je souhaiterai dans une boucle for(i=0; i<9 ; i++)
crée un Sprite qui dans son "nom" instance, aurait le i
genre var monSprite[i] //mais ce code ne marche pas ..
puis bien sur y avoir acces par son nouveau nom pour mettre des ecouteurs ...pour simplifier le genre de code qui suit :

var contener1:Sprite = new Sprite();//ici au lieu du 1 mettre la var i
   this.contener1 = contener1;
   contener1.x = 50;
   contener1.y = 150;
   addChild(contener1);
 
   var contener2:Sprite = new Sprite();
   this.contener2 = contener2;
   contener2.x = 50;
   contener2.y = 200;
   addChild(contener2);
 
   var contener3:Sprite = new Sprite();
   this.contener3 = contener3;
   contener3.x = 50;
   contener3.y = 250;
   addChild(contener3);
 
   var contener4:Sprite = new Sprite();
   this.contener4 = contener4;
   contener4.x = 50;
   contener4.y = 300;
   addChild(contener4);
 
:roll:
flashdevelop 4.5.2.5 +flexsdk
as3

#16 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 20 February 2015 - 16:06 PM

Ça, je ne t'apprendrai pas à le faire même si c'est possible ;-)
Justement parce que ce n'est pas une bonne façon de penser :
- ça t'empêche de penser "un sprite" puisque tu cherches toujours le sprite nº X
- c'est très lent au niveau du code (même si pour un petit projet ça ne serait pas pénalisant) de rechercher un objet par son "nom". Le nom nous semble être naturel, parce que nous pouvons nous adresser à un groupe : "Ecoutez-moi tous, je cherche Mr Marchand" et Mr Marchand se met en avant… En code, ça n'est pas possible. Il faut à chaque fois que le code aille voir les éléments un par un et leur parle "Bonjour, est-ce que tu es un MovieClip ? Est-ce que tu t'appelles Mr Marchand ?" et à chaque fois qu'il obtient un "non" il passe au suivant.

L'idée, comme je te l'ai déjà soufflée, c'est de réfléchir de façon globale.
Et quand on a une série d'objets, on les range dans un tableau, qui lui sait très bien retrouver l'élément 1, l'élément 5, l'élément "i"…

var mes_sprites:Array = []; // Pour les stocker tous
var un_sprite:Sprite; // Pour parler de n'importe lequel
for (var i:int =0; i<10; i++) {
   un_sprite = new sprite();
   un_sprite.x = 50;
   un_sprite.y = 150 + i*50;
   mes_sprites[i] = un_sprite;
  addChild(un_sprite);
}
// Les tableaux permettent ensuite des formulations très simples pour parcourir une liste :
for each(un_sprite in mes_sprites) {
  un_sprite.addEventListener(Event.CLICK,click)
}
//


#17 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6947 messages

Posté 20 February 2015 - 16:09 PM

Salut,

Mauvais pratique.
Il est inutile de donner un nom à tes clips, c'est coûteux en mémoire et ça ne sert à rien dans de très nombreux cas.
Il faut penser dans l'autre sens :

Créer des objets, les placer dans un tableau, utiliser les propriétés des événements (Event) pour récupérer la source de l'objet concerné.

Exemple pour crée 9 boutons (auxquels sont associés une classe ayant une méthode action() ) :

var conteneur:Sprite;
 
   for (var i:int = 0; i < 9; i++) {
           conteneur = new Sprite();
           conteneur.x = 50;
           conteneur.y = 150 + i * 50;
           conteneur.addEventListener(MouseEvent.CLICK, actionBouton);
           conteneur.addEventListener(MouseEvent.MOUSE_OVER, hoverBouton);
           conteneur.addEventListener(MouseEvent.MOUSE_OUT, outBouton);
   }
 
   function hoverBouton(e:MouseEvent):void {
           e.target.gotoAndStop(2);
   }
   function outBouton(e:MouseEvent):void {
           e.target.gotoAndStop(1);
   }
   function actionBouton(e:MouseEvent):void {
           e.target.action();
   }






EDIT : Grillé par Didier ;)

#18 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 21 February 2015 - 10:14 AM

Merci pour ces conseils tres productifs,
Je teste. :smile:
flashdevelop 4.5.2.5 +flexsdk
as3

#19 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 01 March 2015 - 17:50 PM

Bonjour,
je reviens avec un probleme sans doute tres simple :

je cré une image dans ma fonction main de ma classe principale

[Embed(source="../lib/eispn1.png")]
   const Sho:Class;
   var test456:DisplayObject = new Sho();
   test456.x = 0;
   test456.y = 0;
   //test456.y = 100 + 50*ii;
   test456.width = 50;
   test456.height = 50;
   this.addChild(test456);
 
image avec le code suivant

dans la fonction main de la classe principale et je souhaite reutiliser cette classe dans mes autres classes, comment je l'appelle?
Merci
flashdevelop 4.5.2.5 +flexsdk
as3

#20 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 01 March 2015 - 18:58 PM

moi je fais comme ça.
je remet le code

[Embed(source = "Sans nom-1.gif")]private var Image: Class;
 
dans les class ou je veux l'utiliser.

si il y a mieux je suis preneur. (avec flash develop)
@+gustave02

#21 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 01 March 2015 - 21:34 PM

Dans chaque classe du projet je met cette ligne dans les declarations ...pour la meme image, je trouve ca un peu lourd ...

On doit pouvoir certainement "communiquer " entre les classes.
@+
Tonio
flashdevelop 4.5.2.5 +flexsdk
as3

#22 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1668 messages

Posté 03 March 2015 - 18:10 PM

avec une classe statique

package com {
  public class Globals {
        [Embed(source = "Sans nom-1.gif")]
        public static var Sho: Class;
  }
}
 
puis dans ta classe

import com.Globals;
var test456:DisplayObject = new Globals.Sho();
test456.x = 0;
test456.y = 0;
//test456.y = 100 + 50*ii;
test456.width = 50;
test456.height = 50;
addChild(test456);
 


#23 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 05 March 2015 - 17:21 PM

ok je teste. merci.

Autre question "naive" : un Array en fait c'est un "tableau " à une seule colonne.
SI je veux gerer pour chaque case de mon array 4 ou 5 propriétés differentes ...Je dois imbriquer les tableaux ...
De meme différence ou interet du Vector par rapport à l'array.

Si quelq'un a un tut la dessus merci.

;-)
flashdevelop 4.5.2.5 +flexsdk
as3

#24 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6947 messages

Posté 05 March 2015 - 17:34 PM

Salut,

Citation

imbriquer les tableaux


var monArray:Array = [

    [a1,a2,a3],
    [b1,b2,b3],
    [c1,c2,c3]

]
 

Imbriquer les tableaux = créer un super tableau contenant des tableaux à chaque index.
Pour y accéder :


trace(monArray[0]); // renvoie [a1,a2,a3]
trace(monArray[0][0]); // renvoie a1
 

Citation

différence ou interet du Vector par rapport à l'array

Vector est un tableau où tous les index sont typés (et de même type), c'est plus optimisé qu'un tableau normal où les index peuvent contenir tous types de données, mais plus rigide car le Vector ne peut contenir qu'un seul type de donnée pour tous les index.

#25 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 05 March 2015 - 18:42 PM

Super , merci.
Par contre fkash develop ne veut pas de com. j'ai mis la classe dans mon arborescence avec les autres.
est ce que je peux dans cette classe statique redimentionner l'image ...
j 'ai essaye ca mais en vain

package
{
import flash.display.DisplayObject;
/**
  * ...
  * @author tonio
  */

public class Globals1
{
 
            [Embed(source = "../lib/eispn1.png")]
            public static var Sho: Class;
 
  /*public static var test45: DisplayObject = new  Sho();
    test45.x = 0;// 150;
    test45.y = 0;// 100 + 50 * param1;
    test45.width = 50;
    test45.height = 50;*/

 
  }
}
 

flashdevelop 4.5.2.5 +flexsdk
as3

#26 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 05 March 2015 - 18:44 PM

Merci Mr Spi,
tres limpide.
flashdevelop 4.5.2.5 +flexsdk
as3

#27 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1668 messages

Posté 05 March 2015 - 18:54 PM

redimensionne le DisplayObject comme dans ton exemple

#28 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1668 messages

Posté 05 March 2015 - 20:59 PM

comme ça

package {
  import flash.display.DisplayObject;
  public class Globals {
    [Embed(source = "../lib/eispn1.png")]
    private static var Sho: Class;

    public static function test456():DisplayObject {
      var test456:DisplayObject = new Sho();
      test456.x = 0;
      test456.y = 0;
      //test456.y = 100 + 50*ii;
      test456.width = 50;
      test456.height = 50;
      return test456;
    }
  }
}
 
et dans tes classes

var test456:DisplayObject = Globals.test456();
addChild(test456);
 


#29 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 06 March 2015 - 08:49 AM

Impecable merci.
++
flashdevelop 4.5.2.5 +flexsdk
as3

#30 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1668 messages

Posté 06 March 2015 - 10:35 AM

à noter que dans ce cas on n'est pas obligé d'utiliser de variable statique

package {
  import flash.display.DisplayObject;
  public class Globals {
    [Embed(source = "../WildLlama.jpg")]
    private var Sho: Class;

    public function test456():DisplayObject {
      var test456:DisplayObject = new Sho();
      test456.x = 0;
      test456.y = 0;
      //test456.y = 100 + 50*ii;
      test456.width = 50;
      test456.height = 50;
      return test456;
    }
  }
}
 
et dans tes classes

var test456:DisplayObject = new Globals().test456();
addChild(test456);
 


#31 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 07 March 2015 - 11:28 AM

new Globals.test 456()
Renvoie une erreur.
Alors que Globals.test456()
Sans le. New fonctionne impec.??
flashdevelop 4.5.2.5 +flexsdk
as3

#32 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1668 messages

Posté 07 March 2015 - 19:39 PM

tu as enlever static avec new ?

#33 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 09 March 2015 - 11:10 AM

Ca y est ...
sans le static dans Globals1.as :

new Globals().test456()
fonctionne si j' omet les premieres parantheses ca bing.
Globals.test456() //
renvoie une erreur
pourquoi au dessus je n'avait pas besoin des parentheses en static .

Je n'ai pas tout compris.
++
flashdevelop 4.5.2.5 +flexsdk
as3

#34 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 09 March 2015 - 11:30 AM

Helo :

- tu as une fonction 'non statique' test456 dans ta déclaration de classe Globals
- si elle n'est pas static, elle est associée à une occurrence
- d'ou l'obligation de faire un premier new pour obtenir une occurrence de Globasls, puis un accès à la fonction test456 de cette occurrence… qui, elle te renvoie un new () de ton image…

C'est pas terrible, à mon avis.
Ce qu'il y a, c'est que je ne sais toujours pas où tu veux aller avec cette image :

– Est-ce qu'elle est toujours réellement unique dans ton affichage ? Si oui, tu devrais stocker directement une occurrence de ton image dans une variable statique

– Est-ce que tu affiches plusieurs fois la même image en même temps, mais toujours à la même dimension ? Dans ce cas, le top du top, ce serait de stocker le bitmapdata dans une variable statique, et une fonction statique pour renvoyer une occurrence de bitmap

- Est-ce que tu affiches plusieurs fois l'image, pas en même temps, sauf que c'est dans des objets qui resservent plusieurs fois au fil de ton programme, donc tu veux les conserver en place, toujours aux même dimensions ? ou pas ? animées ? ou pas ? 2, 3 fois ou 200 000 fois ? Les réponses seront différentes.

Je sais, ça n'aide peut-être pas beaucoup et je ne voudrais pas tout te chambouler. Je reviens une vision plus générale :
Si tu veux gérer des variables globales dans une classe dédiée, 2 solutions :
1)
La plus simple c'est de tout passer en static. Comme ça, tu n'as pas besoin de créer une instance de ta classe global. Elle est dispo tout le temps, accessible par tout le monde. Avec quelques réserves sur la sécurité du truc.
2)
La plus propre :
Avoir une classe Global avec des variables et fonctions non statiques.
Dans ta classe main, tu crées une constante statique avec une occurrence de ta classe global. Tous ceux qui connaîtront la classe Main auront accès à tes globales, pourront en récupérer les constantes, modifier les variables… Bref, tu as un meilleur contrôle de l'accès.

#35 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 09 March 2015 - 16:51 PM

Hello Didier,
Alors : le but de mon projet est de me familiariser avec l'environnement des classes as sous flashdevelop.
Pour comprendre par l'exemple et l'utilisation les acces autorises ou refuses.
Dans ma classe main avant la declaration de la function Main je declare cette constante


public static const test45: DisplayObject = new Globals1().test456();
 

qui devrait enregistrer mon image instanciée dans la classe Globals1

et bien quand j'appelle cette fonction dans ma classe utilisateur
var test456:DisplayObject = Main.test45 ;//ici je n'ai qu'une seule image au lieu des 8 attendues

je n'ai pas du tout le meme resultat qu'avec le code ci dessous qui marche tres bien ...

var test456:DisplayObject = new  Globals1().test456(); //la ca marche j'ai bien acces à mon image que je peux charger dans un loader ...
 

flashdevelop 4.5.2.5 +flexsdk
as3

#36 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 09 March 2015 - 16:52 PM

Illustre le resultat affiché.

Fichier(s) joint(s)


flashdevelop 4.5.2.5 +flexsdk
as3

#37 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 09 March 2015 - 18:02 PM

Voir le messageToniog, le 09 March 2015 - 16:51 PM, dit :

public static const test45: DisplayObject = new Globals1().test456();

qui devrait enregistrer mon image instanciée dans la classe Globals1

et bien quand j'appelle cette fonction dans ma classe utilisateur
var test456:DisplayObject = Main.test45 ;//ici je n'ai qu'une seule image au lieu des 8 attendues

OK, c'est clair. Un petit point :
- dans cet exemple, tu crées une et une seule image (dans le sens DisplayObject). C'est donc normal que tu ne puisses l'afficher qu'une fois. Au deuxième addChild, l'image est retirée de sa liste d'affichage précédente… Ce n'est donc pas ce que tu veux (par contre, l'usage pour une image unique est propre). (((fais juste à ne pas confondre : variable, constante et fonction… Ce que tu appelles dans ta classe utilisateur, c'est une constante dans ce cas, pas une fonction)))

Voir le messageToniog, le 09 March 2015 - 16:51 PM, dit :

[…] qu'avec le code ci dessous qui marche très bien ...
var test456:DisplayObject = new  Globals1().test456(); //la ca marche j'ai bien acces à mon image que je peux charger dans un loader ...
 
OK aussi. Ce code fait ce que tu désires : 8 images différentes. Par contre, il ne s'y prends pas très bien : pour créer une occurence de l'image, il crée d'abord une occurrence de Globals1… C'est contre productif.




C'est là que 2 méthodes sont possibles :
- soit tu crées une et une seule occurrence de Globals en début de ton Main et tu la stockes dans une constante. Ensuite, tu pourras appeler la fonction qui crée une image autant de fois que tu veux. Dans ce cas, toutes tes variables, constantes et fonctions peuvent être 'non statiques' et c'est la méthode la plus maîtrisée.
// La classe Global
package {
   import flash.display.DisplayObject;
   public class Globals {
         [Embed(source = "../WildLlama.jpg")]
         private var Sho: Class;

         public function sho():DisplayObject {
          var nouvelle_image:DisplayObject = new Sho();
          nouvelle_image.x = 0;
          nouvelle_image.y = 0;
          nouvelle_image.width = 50;
          nouvelle_image.height = 50;
          return nouvelle_image;
         }
   }
}



et dans ta classe Main

//Déclarer une variable ou (mieux) une constante :
private const GLOBALS:Globals = new Globals();


//…


var test456:DisplayObject = GLOBALS.sho();
addChild(test456);




- soit tu déclares ta classe Sho en statique ET ta fonction en statique aussi. Comme ça, pas besoin de créer une occurrence de Globals, l'accès à la Class suffit. C'est la méthode la plus souple.
// La classe Global
package {
   import flash.display.DisplayObject;
   public class Globals {
         [Embed(source = "../WildLlama.jpg")]
         private static var Sho: Class;

         public static function sho():DisplayObject {
          var nouvelle_image:DisplayObject = new Sho();
          nouvelle_image.x = 0;
          nouvelle_image.y = 0;
          nouvelle_image.width = 50;
          nouvelle_image.height = 50;
          return nouvelle_image;
         }
   }
}

Et dans ta classe Main :

var test456:DisplayObject = Globals.sho();
addChild(test456);


#38 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1668 messages

Posté 09 March 2015 - 19:25 PM

@dldler
ce code est plus rapide

package {
  import flash.display.DisplayObject;
  import flash.display.BitmapData;
  import flash.display.Bitmap;

  public class Globals {
        [Embed(source = "../WildLlama.jpg")]
        private static const Sho: Class;
   
        private static var _test456:BitmapData;
        public static function test456():DisplayObject {
          if(!_test456) _test456 = new Sho().bitmapData;
       
          var test456:Bitmap = new Bitmap(_test456);
          test456.x = 0;
          test456.y = 0;
          //test456.y = 100 + 50*ii;
          test456.width = 50;
          test456.height = 50;
       
          return test456;
        }
  }
}
 


#39 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 09 March 2015 - 19:27 PM

Merci beaucoup Didier pour ces explications.
flashdevelop 4.5.2.5 +flexsdk
as3

#40 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 11 March 2015 - 16:25 PM

Bonjour,
je reviens avec un tableau qui contient des tableaux de sprite, classes et uint.
Je souhaite charger dans mon container la classe affectée de l'uint comme paarametre.

var mecont:Array = new Array();
   mecont = [[contener, Supersonic, 3], [contener1, Subsonic, 9],[contener2, Propeller, 2]];
 



var testtt:DisplayObject =  mecont [0][1](j) ///ici je souhaite afficher Supersonic(1) [Fault] exception, information=TypeError: Error #1034: Echec de la contrainte de type : conversion de "[class Supersonic]1" en flash.display.DisplayObject impossible.
 
Merci
flashdevelop 4.5.2.5 +flexsdk
as3

#41 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 11 March 2015 - 17:19 PM

Hello.
Ça me parait quand même tordu ton truc… J'ai beaucoup de mal à comprendre ce que tu fais.
En plus, plein de petites choses de base ne sont pas encore calées. Es-tu sûr de ne pas attaquer par un trop gros projet ?

Sinon :
var mecont:Array = new Array();
A gauche du égal, c'est une déclaration de variable.
À droite du égal : tu crées un objet tableau tout neuf… et tout vide. Pourquoi pas
Et le égal affecte ce beau tableau tout neuf à la variable typée mecont
OK. Passons à la suite.

mecont = [[contener, Supersonic, 3], [contener1, Subsonic, 9],[contener2, Propeller, 2]];
À gauche : tu appelles la variable mecont, déjà déclarée. OK.
À droite, tu crées un nouveau tableau tout neuf, mais plein cette fois.
Et le égal toujours, affecte ce tableau à la variable mecont…
… variable qui s'occupait déjà d'un tableau vide. Pour s'occuper du nouveau, elle lâche le vieux, que tu ne peux plus atteindre, mais qui occupe de la mémoire vive. Je sais, il sera sans doute ramassé par ce qu'on appelle le garbage collector (ramasse miette) mais quand même. Pourquoi l'avoir créé ?

Il vaudrait mieux :
- déclarer la variable
- affecter le tableau
var mecont:Array;
mecont = [[contener, Supersonic, 3], [contener1, Subsonic, 9],[contener2, Propeller, 2]];

Ou, ce que l'on fait d'habitude : déclarer et affecter dans la même ligne :
var mecont:Array = [[contener, Supersonic, 3], [contener1, Subsonic, 9],[contener2, Propeller, 2]];



Il y a ensuite ta question…
Mais là, c'est pareil. J'ai l'impression que tu ne comprends pas ce que tu manipules.
Entre Classe et occurrence, tu ne fais pas la différence.
La Classe est une sorte d'usine qui fabrique des objets.
L'occurrence est un objet fabriqué par une usine (une Classe), grâce à l'instruction new Classe()

Alors, ta Classe Supersonic, a-t-elle une fonction portant le même nom ? C'est elle qui est exécutée quand on appelle l'instruction new…
Cette fonction accepte-t-elle un paramètre de type uint ?
Je ne vois pas trop l'intérêt d'un montage aussi compliqué mais au moins si tu as tout ça, c'est presque bon.

Dans ton second code, si on le décompose, quand tu appelles : mecont [0][1], tu obtiens la Classe Supersonic
Quand tu ajoutes les parenthèses, tu essayes de faire :
Supersonic(j);
Ça n'a pas de sens… Supersonic n'est pas une fonction.
Si c'est la fonction constructeur de la classe Supersonic que tu veux exécuter, alors tu dois faire :
new Supersonic(j);
Il faudra encore que :
- la fonction accepte un paramètre de type uint
- que j soit définit
- que la classe Supersonic étende la classe DisplayObject, ou l'une de ses classes filles…

Ce qui me dérange, c'est que je suis obligé de supposer beaucoup de choses, et peut-être que je perds mon temps et te fais perdre le tien.

Également, cela fait un bout maintenant que tes questions n'ont plus rien à voir avec la question d'origine, il serait pas mal que tu ouvres d'autres sujets quand tu as d'autres questions.

Bon courage en attendant.

#42 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6947 messages

Posté 11 March 2015 - 19:32 PM

Hello,

+1 Didier ;)

Autre chose qui me fait me poser des questions, mais j'avoue ne pas avoir tout lu.
En gros, comme Didier plus haut, je ne comprend pasoù tu veux en venir.
Je vais donc me permettre de non seulement appuyer ce que dit Didier, c'est à dire que je crois qu'il te manque quelques bases et que tu vas trop vite, mais également ajouter une couche en parlant d'analyse et structure.

Peux-tu nous expliquer clairement où tu veux en venir avec ton programme, que doit-il faire exactement et dans quel contexte ?
Plus ta description sera claire et concise, plus ton programme sera facile à construire car tu auras pris du temps pour y réfléchir avant même d'avoir écrit une ligne de code.

On pourrait parler d'analyste, d'algorithmique, de schématisation UML, de structure, et de tout un tas d'autres choses qui se passent avant même d'essayer d'écrire une ligne de code. Plus le travail de préparation est bien fait, plus ton code sera facile à écrire. Là j'ai un peu l'impression que tu prends le problème à l'envers et c'est sans doute ça qui pose les problèmes que tu rencontre.

#43 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 12 March 2015 - 11:08 AM

Messieurs Spi et Didier Bonjour,

Je ne suis pas un professionnel de l'informatique mais de l'aéonautique ...Cependant depuis longtemps je fais du flash AS1AS2 et maintenant 3.
Depuis peu de as3 pur sans FLASH avec Flashdevelop.
Mon projet est simple et il fonctionne : créer une interface sympa pour lancer mes cours (URL), mes films (FLV) ou mes animations (swf).

Cependant, meme si mon code fonctionne, il n'est pas vraiment tres propre car je me familiarise doucement avec certains concepts par exemple class const, ou la classe Array Array index .

Pour répondre à Didier :

1-oui mes classes ont une fonction constructeur avec parametre

2- oui je vais affiner mes questions et ouvrir de nouveaux posts

3- Pour la manipulation des Array avec des elements différents ...nouveau post

Merci pour votre patience et vive l'AS3 + flashdevelop.
flashdevelop 4.5.2.5 +flexsdk
as3

#44 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 12 March 2015 - 12:43 PM

OK. Donc j'arrive à suivre.
Si on te presse un peu sur la vision globale, c'est parce que c'est elle qui définit un bon code, évolutif et réutilisable.

Par exemple, plutôt qu'un tableau, une classe de distribution peut être plus efficace, exemple en version statique :
package {
  public class Distribution {
 
   public static const SUPERSONIC:uint=0;
   public static const SUBSONIC:uint=1;
   public static const PROPELLER:uint=2;
 
 
   public static function image(id:uint):DisplayObject{
    switch (id) {
         case SUPERSONIC : return new Supersonic(3);
         case SUBSONIC :  return new Subsonic(9);
         case PROPELLER :  return new Propeller(2);
    }
   }
  }
}

Qui s'utilise alors ainsi :
package {
  public class Main {
 
 
   // à titre d'exemple
   var a:DisplayObject = Distribution.image(0); // Obtient une occurrence de Supersonic
   var b:DisplayObject = Distribution.image(1); // Obtient une occurrence de Subsonic
   var c:DisplayObject = Distribution.image(2); // Obtient une occurrence de Propeller
 
   var mecontZ:DisplayObject = Distribution.image(Math.random()*3); // Obtient une image au hasard
  }
}
Et ce n'est qu'un exemple, sachant que je n'ai pas assimilé l'intérêt du uint et encore moins du conteneur stocké dans ton tableau qui me paraît très louche…

#45 Toniog

  • Members
  • PipPipPipPipPipPipPipPip
  • 547 messages

Posté 12 March 2015 - 13:14 PM

Ok,
l'uint représente le nombre de cours par theme ( subsonic 9 cours, supersonic 3 cours ...)

donc quand je fabrique mes boutons , j'ai besoin de savoir combien je vais en créer, j'utilise la classe (c'est peut etre stupide mais ca m'apprend a les manipuler ..) pour stoquer le lien qui va ouvrir le cours dans ce lien j'ai le numero du cours.

pour l'instant j'ai imbrique des boucles de if(j<9) ... et je trouve pas ca tres propre mais ca marche.



le conteneur d'accord aucun interet de le stoquer la car c'est toujours le meme.


++
flashdevelop 4.5.2.5 +flexsdk
as3



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