STIC Discussion:STIC I - exercice 7 (Stella)
Array et déclaration de variable -- Lucie.Marchon 25 janvier 2011 à 21:30 (CET)
Bonjour! Je fais une sorte de jeu dont la base sont les réglettes de cuisenaire. Il y a dix réglettes, et à toutes sont appliquées un certain nombre de fonctions, qui se ressemblent. Je pensais que je pourrais mettre cela en array et que ça simplifierait les choses. Avec l'array définie:
var reglettes:Array=new Array(Un,Deux,Trois,Quatre,Cinq,Six,Sept,Huit,Neuf,Dix);
qui sont les classes de chaque réglettes, ça marche quand je met reglettes[1] ou reglettes[4], jusqu'à 9, mais ça ne marche plus quand je mets i,
for(var i=0;i<10;i++)
{
/*quand on clique sur le bouton un cela appelle une fonction..*/
boutons[i].addEventListener(MouseEvent.CLICK, Creer);
/*...qui crée une réglette de taille 1, à peine un peu plus loin que le bouton lui-même, avec un fonction drag et drop incorporée*/
function Creer(event:MouseEvent):void
{
var un = new reglettes[i];
/*une nouvelle occurrence de l'objet "un" est créée sur la scène*/
addChild(un);
/*il se comporte comme un bouton*/
un.buttonMode=true;
/*Il apparaît à peine un peu en décalage du bouton*/
un.x=50;
un.y=50;
/*on lui attribue une fonction drag and drop pour qu'on puisse le déplacer partout sur le scène*/
/*drag quand clic*/
un.addEventListener(MouseEvent.MOUSE_DOWN, Drag);
/*drop quand on relâche*/
un.addEventListener(MouseEvent.MOUSE_UP, Drop);
function Drag(evt:MouseEvent):void
{
var object = evt.target;
object.startDrag();
}
function Drop(evt:MouseEvent):void
{
var object = evt.target;
object.stopDrag();
if (230 < un.y && un.y< 250)
{un.y=240;}
/*combine pour que la réglette se place correctement dans la case la plus proche même si on la lâche un tout petit peu à côté*/
for(var n=0;n<12;n++)
{
if (190+n*40 < un.x && un.x< 230+n*40)
{un.x=200+n*40;}
}
}
}
}
ça me met alors "Tentative d'instanciation sur un élément non constructeur". Je ne vois pas ce que i à de moins constructeur que 3! Comment je devrais faire pour mettre ça en array?
J'ai essayé de déclarer la variable également avec une donnée mise dans une array, qui pourrait varier avec le i, mais il ne veut pas de string.
(bouton[i] est aussi une array, mais ça a l'air de bien marcher, ce sont les nom d'instance de boutons qui sont sur la scène).
Re: Array et déclaration de variable -- Daniel K. Schneider 25 janvier 2011 à 09:45 (CET)
Faut pas mettre
new reglettes
Ceci crée une nouvelle classe, alors que reglettes n'a rien d'une classe. C'est juste une variable. Bien entendu i et reglettes doivent être connus, donc à un moment donnée crées avec une instruction var
var i .... var reglettes ... var un = reglettes[i];
Je vois d'autres problèmes qui peuvent surgir. Je ne déclarerai pas des fonctions dans des fonctions (on peut, mais faut savoir ce qu'on fait).
Re: Re: Array et déclaration de variable -- Lucie.Marchon 25 janvier 2011 à 10:53 (CET)
Dans reglettes[i], il y a les classes, telles que définies dans les propriétés des clips pour l'export actionscript. Je ne vois pas bien la différence entre faire
var un = new Un
ou même
var un = new reglettes[1]
et
var un = new reglettes[i]
car dans le tableau reglettes sont répertoriées les classes Un, Deux, Trois, Quatre, etc.(ce sont les différentes réglettes de taille un à dix et de couleurs différentes)
Mais bon, j'ai essayé de plusieurs manières et ce qu'il se passe maintenant, c'est qu'il y a le message suivant:
"Le paramètre child ne doit pas être nul"
Pourquoi je déclare la variable dans la classe? Je me suis battue la dernière fois avec mes champignons. Si je déclarais la variable hors de la classe, je ne pouvais générer qu'un champignon: quand je recliquais sur le bouton, le premier champignon disparaissait et un nouveau était créé. Je veux absolument pouvoir générer plusieurs reglettes, sinon l'exercice n'a pas de sens.
Pour être plus précise, mes questions sont les suivantes: Est-ce que l'on peut attribuer le contenu i d'une array à une variable?
Ex:
un = reglettes[i];
Est-ce que l'on peut utiliser la fonction AddChild() sur les valeur d'un tableau?
Ex:
AddChild(reglettes[i]);
Par exemple, cela marche très bien pour faire ce comporter les clips comme des bouton:
var boutons:Array=new Array(btn_un,btn_deux,btn_trois,btn_quatre,btn_cinq,btn_six,btn_sept,btn_huit,btn_neuf,btn_dix);
for(var i=0;i<10;i++)
{boutons[i].buttonMode=true;}
Et une dernière question: Est-ce qu'on peut déclarer une variable en y concaténant une chaîne de caractère?
Ex:
var regle+"i" = new Reglette;
Re: Re: Re: Array et déclaration de variable -- Lucie.Marchon 25 janvier 2011 à 12:09 (CET)
j'ai réussi tout facilement à faire une grille sur la base de plusieurs carrés..
var gridcase:Array=new Array;
for(i=0;i<10;i++)
{
var case_de_grid = new Case_de_Grid;
addChild(case_de_grid);
case_de_grid.x=200+40*i;
case_de_grid.y=240;
case_de_grid.name=case_de_grid+i;
gridcase.push(case_de_grid+i);
trace(gridcase);
}
Re: Re: Re: Re: Array et déclaration de variable -- Daniel K. Schneider 25 janvier 2011 à 12:43 (CET)
oui c'est le bon type de solution:
(1) Vous définissez un symbole Reglette exporté comme classe
(2) Ensuite vous en créez autant que vous voulez:
var liste_reglettes:Array;
for(var i=0;i<10;i++) { reglette = new Reglette (); // paramétrer la reglette reglette.buttonMode=true; reglette.x = .... reglette.addEventListener(MouseEvent.MOUSE_DOWN, Drag);
etc. // ajouter à la scène et dans le array addChild(reglette); list_reglettes.push (reglette); }
L'opération new ne marche qu'avec une classe et cela crée un instance (un objet) de cette classe. La ligne suivante n'a pas de sens:
var un = new Un;
puisque Un serait déjà un objet, pareil pour les autres variantes.
Vous pouvez déclarer une variable en y concaténant une chaîne de caractère, mais il faut se demander si c'est utile puisque vous avez déjà les objets dans le array ci-dessus. Faut tjrs éviter d'avoir trop de variables à manipuler.
Enfin si vous voulez vraiment, vous pouvez peut-etre faire cela je pense, mais c'est tordu:
var list_de_noms:Array=new Array("Un","Deux","Trois",Quatre,Cinq,Six,Sept,Huit,Neuf,Dix); for(var i=0;i<10;i++) { var liste_de_noms[i] = new Reglette ();
Si cela ne marche pas faut faire un array associatif pour indexer vos objets "reglettes". Mais essayez d'abord la solution simple ci-dessus (donc ne pas travailler avec des variables).
=Re: Re: Re: Re: Re: Array et déclaration de variable -- Lucie.Marchon 25 janvier 2011 à 15:12 (CET)=
Ça marche pas bien, je vais copier la fonction en changeant le i chaque fois, ça prend 5mn.
=Re: Re: Re: Re: Re: Re: Array et déclaration de variable -- Daniel K. Schneider 25 janvier 2011 à 16:36 (CET)=
euh si cela doit marcher sans aucun problème (donc pas de i's, pas de .name et pas de variables), enfin si vous trouvez autre chose un peu plus compliqué c'est pas grave :)
==Re: Re: Re: Re: Re: Re: Re: Array et déclaration de variable -- Lucie.Marchon 28 janvier 2011 à 18:20 (CET)==
J'ai voulu me simplifier la vie et faire beau en créant cette grille avec actionscript. Quand je l'utilise pour l'exercice 9, elle reste même quand on change de frame. J'ai essayé de mettre grille.visible=false; mais ça ne marche pas. A quoi tient ce problème?
===Re: Re: Re: Re: Re: Re: Re: Re: Array et déclaration de variable -- Daniel K. Schneider 28 janvier 2011 à 18:46 (CET)===
Si bien compris votre problème, il faut enlever les children .... donc si à un moment donné vous faites addChild(truc) il faut plus tard faire removeChild(truc)
Les rendre invisible marche aussi, mais il faut que ce soit un objet d'affichage ! Donc si la grille est un tableau qui contient la liste des objets, faut faire une boucle et chaqueobj.visible = false.
====Re: Re: Re: Re: Re: Re: Re: Re: Re: Array et déclaration de variable -- Lucie.Marchon 28 janvier 2011 à 19:49 (CET)====
C'est tout à fait ça, ça n'était pas tout facile, mais ça marche. Merci!