Forums Développement Multimédia

Aller au contenu

Ajouter un shape sur la scène

PAO Flash

9 réponses à ce sujet

#1 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 06 March 2013 - 18:29 PM

Bonjour,

A l'intérieur d'un script je créais jusqu'à lors des formes dans une fonction de la manière suivante :

public function Individu():void
{
 
   graphics.beginFill(000000,0.3);
   graphics.drawRect(0,0,2,2);
 
   graphics.endFill();
   x=(Math.random()-.5)*400;
   y=(Math.random()-.5)*400;
   z=(Math.random()-.5)*400;
}
 

Mais je voudrais pouvoir modifier cette forme dans une autre fonction. Je voulais donc stocker la forme dans une variable en créant une propriété "_forme" par exemple et en écrivant à la place :


public function Individu():void
{
 
   _forme.graphics.beginFill(000000,0.3);
   _forme.graphics.drawRect(0,0,2,2);
 
   _forme.graphics.endFill();
   _forme.x=(Math.random()-.5)*400;
  _forme. y=(Math.random()-.5)*400;
   _forme.z=(Math.random()-.5)*400;
}
 
Si je laisse le script tel quel, rien ne s'ajoute à la scène. Je pensais utiliser addChild(_forme) par exemple mais ça ne fonctionne pas ...
Comment faire ?

Merci

#2 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 06 March 2013 - 21:23 PM

Bonsoir,

addChild devrait fonctionner. Ton problème est peut-être que ton tout petit carré est parfois placé à des coordonnées négatives en dehors de la scène ?

Ce code fonctionne:


var _forme:Shape = new Shape();
addChild(_forme);
Individu();
stage.addEventListener(MouseEvent.MOUSE_DOWN, onClick);

public function onClick(e:Event):void {
    Individu();
}

public function Individu():void
{
   
    _forme.graphics.beginFill(000000,0.3);
    _forme.graphics.drawRect(0,0,2,2);
   
    _forme.graphics.endFill();
    _forme.x=(Math.random()-.5)*400;
    _forme. y=(Math.random()-.5)*400;
    _forme.z=(Math.random()-.5)*400;
}
 

J'ai rajouté un écouteur sur le clic. A chaque clic la position est choisie de nouveau. On voit passer le petit carré de temps en temps.

#3 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 06 March 2013 - 21:30 PM

Merci pour ta réponse.
Je sais pas si ça change quelque chose que ce script soit à l'intérieur d'une classe ?
En fait c'est pas exactement ceci que je veux dessiner, j'ai juste mis ici pour simplifier.
Si tu penses que c'est important je vais te donner le script exact:



public function Individu():void
        {

           
            var pointA:Vector3D = new Vector3D(0,0,0);
            var pointB:Vector3D = new Vector3D(10,0,0);
            var pointC:Vector3D = new Vector3D(0,10,0);
            var pointD:Vector3D = new Vector3D(0,0,0);
            var pointE:Vector3D = new Vector3D(0,0,10);
            var pointF:Vector3D = new Vector3D(10,0,0);
           
            var tab:Array = new Array(pointA,pointB,pointC,pointD,pointE,pointF);
           
            var i;
       
            for(i=0;i<tab.length;i++) {
                add_point(tab[i]);
               
               
            }

            var j;
           
           _forme.graphics.lineStyle(1,000000,0.3);
   
       
           _forme.graphics.moveTo(_points[0].x,_points[0].y);
           
            for (j=1; j<_points.length; j++)
            {
                 _forme.graphics.lineTo(_points[j].x,_points[j].y);
            }

         _forme.x=(Math.random()-.5)*400;
         _forme.y=(Math.random()-.5)*400;
         _forme.z=(Math.random()-.5)*400;
           
addChild(_forme);
   
           
        }
 
Ce qui me renvoit l'erreur :
Appel à une méthode qui ne semble pas définie, addChild.

Merci encore

#4 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 06 March 2013 - 22:45 PM

Si ta fonction est dans une classe, écrire addChild(_forme) c'est dire à flash "exécute la méthode addChild() de cette classe en lui passant le paramètre _forme".
Vu le message d'erreur, j'en déduis que ta classe n'est pas un DisplayObjectContainer (les Sprites, les MovieClips), et n'a donc pas de méthode addChild(). Voici une façon de faire avec une classe qui étends la classe Sprite (extends Sprite)

package {

        import flash.display.Shape;
        import flash.display.Sprite;
       
        public class Truc extends Sprite {
               
                private var _forme:Shape;
               
                public function Truc() {
                       
                        _forme = new Shape();
                   // Comme cette classe étend Sprite, elle a une méthode addChild, héritée de Sprite.
                   // On peut faire:
                    addChild(_forme);
                        Individu();
                       
                }
               
                public function Individu():void {
                       
                        _forme.graphics.beginFill(000000,0.3);
                        _forme.graphics.drawRect(0,0,100,100);
                       
                        _forme.graphics.endFill();
                        _forme.x=200 + (Math.random()-.5)*400;
                        _forme.y=200 + (Math.random()-.5)*400;
                        _forme.z=(Math.random()-.5)*400;
                       
                }
       
        }
}

et une autre façon de faire possible:

package {

        import flash.display.Shape;
        import flash.display.Sprite;
       
        public class Truc2 {
               
                private var _forme:Shape;
               
                public function Truc2() {
                       
                        _forme = new Shape();
                        Individu();
                       
                }
               
                public function get forme():Shape {
                        return _forme;
                }
               
                public function Individu():void {
                       
                        _forme.graphics.beginFill(000000,0.3);
                        _forme.graphics.drawRect(0,0,100,100);
                       
                        _forme.graphics.endFill();
                        _forme.x=200 + (Math.random()-.5)*400;
                        _forme.y=200 + (Math.random()-.5)*400;
                        _forme.z=(Math.random()-.5)*400;
                       
                }
       
        }
}

Avec l'exemple d'utilisation:

var truc:Truc = new Truc();
var truc2:Truc2 = new Truc2();
addChild(truc); // possible car Truc extends Sprite
addChild(truc2.forme);

La classe truc aurait du coup pu se passer du Shape forme... allez tiens, voici un dernier exemple:

package {

        import flash.display.Shape;
       
        public class Truc3 extends Shape {
               
                public function Truc3() {
                        Individu();
                }
               
                public function Individu():void {
                       
                        graphics.beginFill(000000,0.3);
                        graphics.drawRect(0,0,100,100);
                       
                        graphics.endFill();
                        x=200 + (Math.random()-.5)*400;
                        y=200 + (Math.random()-.5)*400;
                        z=(Math.random()-.5)*400;
                       
                }
       
        }
}


var truc3:Truc3 = new Truc3();
addChild(truc3); // possible car Truc3 extends Shape
 

Fichier(s) joint(s)

  • Fichier joint  Truc.as   571 octets   1 téléchargement(s)
  • Fichier joint  Truc2.as   603 octets   0 téléchargement(s)
  • Fichier joint  Truc3.as   408 octets   2 téléchargement(s)


#5 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 06 March 2013 - 22:51 PM

P.S: Si tu ne connais pas, tu trouveras de très bonnes informations dans Pratique d'Actionscript 3. Chapitres 4 et 9 dans ce cas.

#6 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 06 March 2013 - 22:51 PM

Merci pour ta réponse, je venais de trouver et j'ai utilisé extends Sprite...
Si je veux stocker les points dans une variable c'est parce que je veux appliquer des transformations matricielles à tous mes points.
SI j'utilise les coordonnées x, y, et z je ne vais pas pouvoir si ? Il faut bien que j'ai tous les points dans un tableau n'est-ce pas ?

#7 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 06 March 2013 - 22:59 PM

Voir le messagecharlesd, le 06 March 2013 - 22:51 PM, dit :

Merci pour ta réponse, je venais de trouver et j'ai utilisé extends Sprite...
Avec plaisir. Comme nos 2 derniers posts se sont croisés je ne sais pas si tu as vu le lien que j'ai mis.


Voir le messagecharlesd, le 06 March 2013 - 22:51 PM, dit :

SI j'utilise les coordonnées x, y, et z je ne vais pas pouvoir si ? Il faut bien que j'ai tous les points dans un tableau n'est-ce pas ?
Je ne te suis plus là :)

#8 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 06 March 2013 - 23:07 PM

Bon je vais rentrer dans le vif du sujet pour t'expliquer concrètement ce que je veux faire.
Je me suis lancé dans une modélisation de nuées d'étourneaux (des petits oiseaux qui volent en groupes et qui forment une espèce d'entité unique et qui se dilate et se comprime... Video sur youtube)
Jusqu'à lors je faisais ceci en 2D : Je plaçais des carrés sur le plan, un cercle (le prédateur) les poursuivait et venait briser la cohésion du groupe.
J'ai voulu passer en 3D pour faire apparaître de nouvelles formes.
J'ai donc simplement ajouté une troisième coordonnée... Mais les formes ne faisaient que de se translater suivant l'axe des z ce qui ne donnait rien de très joli.
Du coup, j'ai voulu les faire s'orienter en fonction de leur "vecteur vitesse" en gros de leur direction, ce que je ne parviens pas bien à faire : Je calculais simplement l'angle entre la destination et le vecteur vitesse initial, et je rajoutais cet angle à l'angle d'inclinaison initiale.
Ce qui m'amène pour l'instant ici :


C'est pas très joli.
Je voudrai donc faire des formes plus complexes. Dans l'idéal, une espèce de pyramide (pour pouvoir orienter les oiseaux). J'y connais pas grand chose en 3D sous flash, j'ai donc lu que le mieux c'était d'utiliser des matrice : En gros de stocker tous les points du polygone dans un tableau, et d'utiliser les transformations matricielles pour appliquer la même transformation à tous les points du polygone.
Voilà pourquoi je te demande ça...
J'espère avoir été clair ?

Merci encore

#9 lilive

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 2993 messages

Posté 06 March 2013 - 23:47 PM

Oui c'est plus clair.
J'ai peu d'expérience en 3D, mais je sais qu'il y a pleins de solutions.

Pour faire une pyramide, tu peux effectivement déplacer chacun des sommets de la pyramide avec les matrices, et dessiner les faces avec des beginFill et lineTo.
Tu peux aussi utiliser Graphics.drawTriangles (un tuto) pour le dessin.
Tu peux aussi utiliser le drawTriangles de Stage3D.

Tu dois également pouvoir dessiner chacune des faces de la pyramide dans un Shape différent, et positionner ces shapes en 3D dans un Sprite oiseau qui les contient, puis pour déplacer l'oiseau tu joues sur x,y,z et les rotations de ce sprite. Je n'ai jamais essayé cette façon de faire mais ça doit marcher. Niveau optimisation je ne sais pas ce que ça donne.

Tu peux aussi utiliser un moteur 3D tout fait qui permettra surement de créer des objets oiseau, puis de déplacer cet oiseau de la même manière que dans le paragraphe précédent.

Si tu as encore des questions tu devrais surement ouvrir un nouveau sujet qui a le bon titre et qui démarre avec ta question.

Et pour finir quelques recherches vite fait:
https://www.google.f...=flash+flocking
http://blog.soulwire...ering-behaviors
http://board.flashki...-Code-Challenge


#10 charlesd

    Ceinture Jaune

  • Members
  • PipPip
  • 29 messages

Posté 07 March 2013 - 00:01 AM

Dernière question avant que j'ouvre encore un sujet.
Si je veux poursuivre et utiliser lineTo, ça veut dire qu'il faut que je redessine la forme à chaque instant non ? ça risque peut être d'être très lourd? Sinon je n'aurai pas cet effet 3D n'est ce pas ?



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