STIC Discussion:STIC I - exercice 7 (Stella)

De EduTech Wiki
Aller à la navigation Aller à la recherche

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!

Erreur sur les propriétés drag and drop -- Vjollca Ahmeti 2 février 2011 à 14:28 (CET)

Bonjour,

J'ai essayé de faire un exercice similaire à celui proposé dans le cours et il m'affiche une erreur que je comprends pas ! Je comprends ce que ça dit mais je ne sais pas ce qu'il faut faire parce que je n'ai fait que recopier le code.

Re: Erreur sur les propriétés drag and drop -- Daniel K. Schneider 2 février 2011 à 15:02 (CET)

cochez déjà "permit debugging" dans les publish settings /Flash

ReferenceError: Error #1069: La propriété startDrag est introuvable sur flash.text.engine.TextLine et il n'existe pas de valeur par défaut. at addition_fla::MainTimeline/mouseDownHandler() addition_fla.MainTimeline::frame1:25]

Ensuite à la ligne 25 de votre code vous avez cela:

objet.startDrag();

Maintenant, y a 2 possibilités:

  1. soit objet ne correspond pas au bon objet
  2. soit l'objet n'implemente pas drag and drop ou problème similaire.

Dans votre cas, c'est la 2ème, donc on peut pas drag/drop un symbol qui contient un texte de type TLF (pas le temps de regarder pourquoi)

Solution:

  • Editer chaque symbole qui contient du text (double-clic)
  • Changer le texte en "Classic" dans le menu déroulant dans properties
  • Dessiner un rectangle et aligner les deux comme il faut....


Ensuite:

  • Vous devez également mettre les nombres (rectangles blanches "target") dans un autre layer. Simplement pour les mettre en arrière plan, sinon on ne peux pas dropper. Rappel: dans la timeline vous pouvez tirer les layers vers le bas/haut pour régler cela.