Création de MovieClips Dynamiques
Boujour à tous,
Je viens juste de commencer à développer en actionscript 3 et j'ai pour but de créer un menu.
Je suis parti d'une base existante (carroussel de forme ADN):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
//Rayon de rotation (en pixels) autour de l'axe y
var Rx:Number=120;
//Nombre d'icones (pas plus que 10, quoique...)
var N:Number=10;
//angle de rotation des clips autour de l'axe z
var angle:Number=0;
//Attachement des icones
var Reference:Class;
for(var i:Number=0;i<N;i++)
{
// extraction des références de classe
Reference = Class (getDefinitionByName ( "MonClip"+i ));
// ajout à la liste d'affichage
this.addChild ( DisplayObject (new Reference()) );
//Nom du clip
this.getChildAt(i).name='ID'+i;
//position initial du ieme clip en y (position helice)
//64=taille de l'icone, 64/2=distance du bord au centre de l'icone (icone carré ou cercle)
//2*3= marge de 3 pixels en haut et en bas de l'image
//la place totale en y prise par les icones = (stage.stageWidth-2*3)
//la premiere icone (son centre) se place apres la marge 3+64/2
//d'ou la repartion des icones sur y :
this.getChildAt(i).y=(stage.stageHeight-2*3-64/2)*i/N+3+64/2;
//Position initial du ieme clip en x
this.getChildAt(i).x=Rx*Math.cos(2*Math.PI*i/N)+stage.stageWidth/2;
//taille initiale du ieme clip
this.getChildAt(i).scaleX=0.6/2*(Math.sin(2*Math.PI*i/N)+ 1)+0.4;
this.getChildAt(i).scaleY=this.getChildAt(i).scaleX;
//ajout d'un ecouteur sur le ieme clip
this.getChildAt(i).addEventListener(MouseEvent.CLICK, OnClick);
}
//Fonction de click sur les icones
function OnClick ( pEvt:MouseEvent ):void
{
trace("salut");
}
//ecouteur enter_frame
stage.addEventListener ( Event.ENTER_FRAME, Main );
function Main ( pEvt:Event ):void
{
//variable temporaire pour la profondeur
var z:Number;
for(i=0;i<N;i++)
{
//rotation du i_eme clip sur x
this.getChildByName('ID'+i).x=Rx*Math.cos(angle+2*Math.PI*i/N)+stage.stageWidth/2;
//mise a jour de la taille du clip (60%->premier plan, 40%->arriere plan)
this.getChildByName('ID'+i).scaleX=0.6/2*(Math.sin(angle+2*Math.PI*i/N)+ 1)+0.4;
this.getChildByName('ID'+i).scaleY=getChildByName('ID'+i).scaleX;
//mise a jour de z (profondeur);
z=(N-1)*(Math.sin(angle+2*Math.PI*i/N)+1)/2;
this.setChildIndex(this.getChildByName('ID'+i), int(z));
}
//rotation commandée par la souris en y
//signe moins : rotation inversé
//Math.PI/2 = correction d'angle pour que l'icone pointée soit toujours au milieu
angle=(2*Math.PI)*(-stage.mouseY+3+64/2)/(stage.stageHeight-(3+64/2))+Math.PI/2;
} |
J'aimerais à ce code ajouter du dynamisme par la création de MovieClip dynamique et un load de l'image chaque option du menu.
Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
//Rayon de rotation (en pixels) autour de l'axe y
var Rx:Number=120;
//Nombre d'icones (pas plus que 10, quoique...)
var N:Number=10;
//angle de rotation des clips autour de l'axe z
var angle:Number=0;
//Attachement des icones
var Reference:Class;
for(var i:Number=0;i<N;i++)
{
this["MonClip"+i] = new MovieClip();
var imgMovieClip = this["MonClip"+i] ;
var myLoad = new Loader();
myLoad.load(new URLRequest("images"+i+".png"));
myLoad.contentLoaderInfo.addEventListener(Event.COMPLETE,handlerLoaderComplete);
Reference = Class (this["MonClip"+i]);
this.addChild ( DisplayObject (imgMovieClip) );
this.getChildAt(i).name='ID'+i;
this.getChildAt(i).y = (stage.stageHeight-2*3-64/2)*i/N+3+64/2;
this.getChildAt(i).x = Rx*Math.cos(2*Math.PI*i/N)+stage.stageWidth/2;
//taille initiale du ieme clip
this.getChildAt(i).scaleX=0.6/2*(Math.sin(2*Math.PI*i/N)+ 1)+0.4;
this.getChildAt(i).scaleY = this.getChildAt(i).scaleX;
this.getChildAt(i).addEventListener(MouseEvent.CLICK, OnClick);
}
function handlerLoaderComplete(evt:Event)
{
//on place le contenu de ton loader dans un movie clip
imgMovieClip.addChild(evt.target.content)
//on cree le bitmapData de la hauteur/largeur du clip (donc de l'image)
var myBitmapData:BitmapData = new BitmapData(imgMovieClip.width,imgMovieClip.height)
//on dessine le clip dans le bitmapData
myBitmapData.draw(imgMovieClip);
//on cree maintenant un bitmap dans lequel on place le bitmapData
var myBitmap = new Bitmap(myBitmapData);
myBitmap.smoothing = true;
}
//Fonction de click sur les icones
function OnClick ( pEvt:MouseEvent ):void
{
trace("salut");
}
//ecouteur enter_frame
stage.addEventListener ( Event.ENTER_FRAME, Main );
function Main ( pEvt:Event ):void
{
//variable temporaire pour la profondeur
var z:Number;
for(i=0;i<N;i++)
{
//rotation du i_eme clip sur x
this.getChildByName('ID'+i).x=Rx*Math.cos(angle+2*Math.PI*i/N)+stage.stageWidth/2;
//mise a jour de la taille du clip (60%->premier plan, 40%->arriere plan)
this.getChildByName('ID'+i).scaleX=0.6/2*(Math.sin(angle+2*Math.PI*i/N)+ 1)+0.4;
this.getChildByName('ID'+i).scaleY=getChildByName('ID'+i).scaleX;
//mise a jour de z (profondeur);
z=(N-1)*(Math.sin(angle+2*Math.PI*i/N)+1)/2;
this.setChildIndex(this.getChildByName('ID'+i), int(z));
}
angle=(2*Math.PI)*(-stage.mouseY+3+64/2)/(stage.stageHeight-(3+64/2))+Math.PI/2;
} |
Je vous avoue que je tourne en rond depuis une journée là-dessus donc j'espère que vous allez pouvoir m'aider. La dernière erreur en date est un problème de conversion MovieClip/Class.
Merci beaucoup de votre aide.