Comment cliquer sur des clips générés par actionscript
Bonjour,
Voici mon problème.
Par exemple :
je crée un tableau de cases de la façon suivante :
mescases=new Array(100);
for (i=0;i<100;i++) { mescases[i]=new UneCase(sesparametres,"case"+i+"_mc",this,profondeur) }
UneCase étant une classe dynamic extends MovieClip munie de plein de fonctions.
Je voudrais qu'une fonction se déclanche morsque je clique sur la case (par exemple la fonction changeCouleur définie dans le fichier de classe).
Pour l'instant la seule technique que j'ai trouvée c'est d'écrire dans le fichie .fla quelque chose du genre :
case0_mc.onPress=function() { mescases[0].changeCouleur();}
case1_mc.onPress=function() { mescases[0].changeCouleur();}
…
quand il n'y a que 10 objets, passe encore, mais au delà c'est dur à gérer.
J'ai essayé de mettre un onPress dans le fichier de construction de la classe UneCase mais sans effet intéressant.
D'avance merci à qui pourrait m'aider !
;)
Deux exemples de ce qui ne fonctionne pas
Avec une droite :
Objectif : une droite se dessine à l'écran, en cliquant dessus il faudrait qu'elle change de couleur.
Le texte de la classe :
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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
//////////////////
/* UneDroite.as */
//////////////////
dynamic class UneDroite extends MovieClip
{
public var parametres:Array;
public var coefficient:Number;
public var ordonneeorigine:Number;
public var abscisseconstante:Number;
public var nom:String;
public var estverticale:Boolean;
public var echelle:Number;
private var conteneur_mc:MovieClip;
private var couleur:Number;
private var expression:String;
private var lescouleurs:Array;
private var numero_couleur:Number;
public var dimensions:Array;
public function UneDroite(param:Array,cible:MovieClip,dimens:Array,nm:String,profondeur:Number,pas:Number)
{
lescouleurs=new Array(0xFF0000,0x00FF00,0x0000FF,0xFF00FF,0xFF9900,0x00FFFF,0x660000,0x003300);
numero_couleur=0;
nom=nm;
// équation de droite de type ax+by+c=0
parametres=new Array(3);
parametres=param;
setExpression();
// dimensions de la fenêtre
dimensions=new Array(2);
dimensions=dimens;
// définit le pas de la grille
echelle=pas;
setCouleur(lescouleurs[numero_couleur]);
conteneur_mc=cible.createEmptyMovieClip(nom,profondeur);
conteneur_mc.clear();
dessine();
conteneur_mc.onPress=function()
{
trace("coucou");
if (numero_couleur<7) numero_couleur++;
else numero_couleur=1;
setCouleur(lescouleurs[numero_couleur]);
}
}
public function dessine()
{
conteneur_mc.lineStyle(1,couleur);
if (parametres[1]==0)
{
estverticale=true;
abscisseconstante=-parametres[2]/parametres[0];
conteneur_mc.moveTo(echelle*abscisseconstante,-echelle*dimensions[1]/2);
conteneur_mc.lineTo(echelle*abscisseconstante,echelle*dimensions[1]/2);
}
else
{
estverticale=false;
coefficient=-parametres[0]/parametres[1];
ordonneeorigine=-parametres[2]/parametres[1];
if (coefficient==0)
{
conteneur_mc.moveTo(-echelle*dimensions[0]/2,-echelle*ordonneeorigine);
conteneur_mc.lineTo(echelle*dimensions[0]/2,-echelle*ordonneeorigine);
}
else
{
if (Math.abs(-coefficient*dimensions[0]/2+ordonneeorigine)<=dimensions[1]/2)
conteneur_mc.moveTo(-echelle*dimensions[0]/2,echelle*coefficient*dimensions[0]/2-echelle*ordonneeorigine);
else conteneur_mc.moveTo(echelle*(-dimensions[1]/2-ordonneeorigine)/coefficient,echelle*dimensions[1]/2);
if (Math.abs(coefficient*dimensions[0]/2+ordonneeorigine)<=dimensions[1]/2)
conteneur_mc.lineTo(echelle*dimensions[0]/2,-echelle*coefficient*dimensions[0]/2-echelle*ordonneeorigine);
else conteneur_mc.lineTo(echelle*(dimensions[1]/2-ordonneeorigine)/coefficient,-echelle*dimensions[1]/2);
}
}
}
public function setCouleur(col:Number)
{
trace("coucouc");
couleur=col;
dessine();
}
public function setPos(pos:Array)
{
conteneur_mc._x=pos[0];
conteneur_mc._y=pos[1];
}
public function setExpression()
{
expression="";
switch (parametres[0])
{
case 0 : break;
case 1 : expression+="x";break;
case -1 : expression+="-x";break;
default : expression=expression+parametres[0]+"x";break;
}
if ((parametres[0]!=0)&&(parametres[1]>0)) expression+="+";
//trace(parametres[1]);
switch (parametres[1])
{
case 0 : break;
case 1 : expression+="y";break;
case -1 : expression+="-y";break;
default : expression=expression+parametres[1]+"y";break;
}
if (parametres[2]>0) expression+="+";
if (parametres[2]!=0) expression+=parametres[2];
expression+="=0";
}
public function getExpression():String
{
return expression;
}
} |
remarque : j'ai rajouté des trace pour voir ce qui se passe … la fonction de changement de couleur ne s'actionne qu'à la construction de la droite même si l'action de la souris est bien détectée. J'ai rajouté des _root dans le onPress et rien n'y fait.
Deuxième exemple :
Objectif : Un objet prédessiné (une case ou autre) doit se déplacer sous l'action de la souris.
Texte de la classe :
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
|
////////////////
/* UnObjet.as */
////////////////
dynamic class UnObjet extends MovieClip
{
public var conteneur_mc:MovieClip;
private var type_objet:String;
public var place:Array;
public var bouge:Boolean=false;
public function UnObjet(sontype:String,sapos:Array,cible:MovieClip,nom:String,profondeur:Number)
{
type_objet=sontype;
conteneur_mc=cible.attachMovie(sontype,nom,profondeur);
setPos(sapos);
conteneur_mc.onPress=function()
{
if (!_root.bouge) _root.bouge=true;
else _root.bouge=false;
trace(_root.bouge);
}
conteneur_mc.onMouseMove=function()
{
if (_root.bouge)
{
sapos=new Array(_xmouse,_ymouse);
_root.setPos(sapos);
}
}
}
public function setPos(sapos)
{
conteneur_mc._x=sapos[0];
conteneur_mc._y=sapos[1];
}
public function getPos():Array
{
place=new Array(2);
place[0]=conteneur_mc._x;
place[1]=conteneur_mc._y;
//trace(place[0]+" avec "+place[1]);
return place;
}
// pour tourner
public function tourne(angle:Number):Void
{
conteneur_mc._rotation+=angle;
}
public function changeImage()
{
if (conteneur_mc._currentframe==1) conteneur_mc.nextFrame();
else conteneur_mc.prevFrame();
}
public function getImage()
{
return conteneur_mc._currentframe;
}
} |
Remarque : la variable bouge change bien de valeur mais l'objet ne bouge pas …
Remarque finale : je ne suis pas très douée en flash non plus … :(