STIC Discussion:STIC I - exercice 6 (Stella)

De EduTech Wiki
Version datée du 9 décembre 2010 à 23:50 par Lucie.Marchon (discussion | contributions) (→‎-- ~~~~ : nouvelle section)
Aller à la navigation Aller à la recherche

Librairie? -- Aline Meyer 2 décembre 2010 à 18:36 (CET)

Bonsoir, Ce message car je suis coincée depuis plusieurs heures sur mon exercice 6, dont vous trouverez le fichier fla à l'adresse suivante : http://tecfaetu.unige.ch/etu-maltt/pixel/meyeral5/stic-1/ex6/ J'aimerais dans un premier temps réussir à réaliser une animation similaire à celle du canon2 ; en cliquant sur la ruche, les abeilles volent. J'ai donc créé mes clips, ma scène et mes layers. J'aimerais maintenant utiliser la librairie AS externe, que j'ai défini comme expliqué dans le tutoriel "Utilisation de librairies". J'ai maintenant copié votre code AS3, pour m'entraîner ; puis le changerai un peu dans un second temps. Toutefois, lorsque j'exécute, rien ne marche ; pourriez-vous y jeter un oeil et voir où ça croche? Est-ce dans la définition du chemin de la librairie, ou dans mon code lui-même? Je n'y vois plus clair! Merci beaucoup d'avance. Aline

Re: Librairie? -- Daniel K. Schneider 2 décembre 2010 à 22:51 (CET)

Désolé j'ai un gros rhume et suis naze, donc j'ai juste pris le temps pour trouver l'endroit qui coince. Faut enlever le texte ("Clique sur ....). La ruche, l'abeille et actionscript va très bien sans.

.... mais aucune idée ce qui coince avec le texte.... essayez d'en mettre un autre, neuf. A la limite, utilisez un text "Classic" donc pas TLF. Si vous n'arrivez pas me dire de nouveau.

PS: Bien entendu, AS doit trouver la librairie greensock.swc (chez vous dans F:\qq_part) mais en tout cas chez moi cela tourne si je change le chemin.

Re: Re: Librairie? -- Aline Meyer 3 décembre 2010 à 16:19 (CET)

Merci beaucoup! Etrange. J'ai créé un nouveau frame "texte" et y ai copié mon texte "Clique sur...", et maintenant ça fonctionne. Super. Bon rétablissement et bon week-end!

Timer et removechild -- Jaboulay 8 décembre 2010 à 11:14 (CET)

Voilà, je bloque : dans mon exercice je crée des poissons. Ces poissons sont des childs. Mais je veux que chaque poisson disparaisse après quelques secondes. Je n'arrive pas à gérer les childs...

ObjetAcliquer.addEventListener(MouseEvent.MOUSE_DOWN, createpoisson);


function createpoisson(event:MouseEvent):void
{
 
 poisson  = new Poisson ();
 stage.addChild( poisson);
 var timer:Timer = new Timer(4000, 1);

 timer.addEventListener(TimerEvent.TIMER, removeFish);
 timer.start();
}

function removeFish(event:TimerEvent):void {
  stage.removeChild(poisson);
}


Re: Timer et removechild -- Daniel K. Schneider 9 décembre 2010 à 16:57 (CET)

Ouais, en regardant les messages d'erreur on voit que la variable poisson n'a pas été définie. Puis faut en plus la définir au niveau global pour que la 2ème fonction la voit. Donc voili le code (testé):

ClickThing.addEventListener(MouseEvent.MOUSE_DOWN, createpoisson);

var poisson;

function createpoisson(event:MouseEvent):void
{

	poisson  = new Poisson ();
	poisson.x = 200;
	poisson.y = 200;
	stage.addChild( poisson);
	
	var timer:Timer = new Timer(4000,1);
        timer.addEventListener(TimerEvent.TIMER, removeFish);
	timer.start();
}

function removeFish(event:TimerEvent):void
{
	stage.removeChild(poisson);
}


Ceci dit, ce code n'est pas très bon, puisque cela n'enlève que le dernier poisson, et va se planter une fois qu'on a ajouté un 2ème poisson. Donc, il faudrait reécrire la fonction removeFish, par ex. en utilisant le code proposé dans le thread suivant. Moi j'ai une solution aussi:

ClickThing.addEventListener(MouseEvent.MOUSE_DOWN, createpoisson);

var poissons:Array = new Array ();

function createpoisson(event:MouseEvent):void
{

	var poisson  = new Poisson ();
	poisson.x = 200 + Math.random() * 200;
	poisson.y = 200 + Math.random() * 100;
	// ajouter le poisson dans le tableau poissons (à la fin)
	poissons.push (poisson);
	// ajouter sur la scène
	stage.addChild( poisson);
	
	var timer:Timer = new Timer(4000,1);
    timer.addEventListener(TimerEvent.TIMER, removeFish);
	timer.start();
}

function removeFish(event:TimerEvent):void
{
	//on prend le premier poisson du tableau et on l'enleve du stage
	stage.removeChild(poissons.shift()); 
}

Voir le code complet ici:

Gestion de Children nominativement -- Jaboulay 8 décembre 2010 à 15:59 (CET)

Voici une petite explication pour savoir créer des children adressables nominalement, puis les manipuler et enfin les détruire: L'exemple ci dessous permet de créer 3 sprites enfants et de détruire celui qui s'appelle "MonSprite2" à l'aide d'une fonction générique extrêmement pratique.

var MonSprite:Sprite;

this.addChild(MonSprite);
MonSprite.Name = "MonSprite1"

this.addChild(MonSprite);
MonSprite.Name = "MonSprite2"

this.addChild(MonSprite);
MonSprite.Name = "MonSprite3"

Voici une petite fonction, pour effacer un enfant dont on passe le nom:

removeChildWithRef("MonSprite2",this);

ceci est identique à

i=2;
removeChildWithRef("MonSprite"+i,this);


et finalement la fonction générique:

function removeChildWithRef(spriteName:String, parentObj:*)
{
 var t:DisplayObject = parentObj.getChildByName(spriteName);
 parentObj.removeChild(t);
 }

Bref, le secret réside dans l'utilisation de la propriété getChildByName(spriteName)

Re: Gestion de Children nominativement -- Daniel K. Schneider 9 décembre 2010 à 17:02 (CET)

oui c'est une bonne idée de laisser Flash gérer les noms. Selon la situation il existe deux autres

  • Gérer soi-même les objets dans un tableau (c.f. ma réponse à la question précédante)
  • Demander à la stage de lister tous les objets, puis les tuer selon d'autres critères que leur nom ... au hasard par exemple ;)

Ceci dit: Attention, ce type de code n'est pas indiqué lorsqu'il s'agit de tuer un objet sur lequel l'utilisateur clique. Dans le dernier cas, il suffit de demander au Event sur quel objet l'utilisateur a cliqué....

-- Lucie.Marchon 9 décembre 2010 à 23:50 (CET)

Je n'arriva pas à créer plusieurs champignons avec la même fonction. Ça marchait quand je déclarais la variable dans la fonction, mais on ne pouvais pas les réutiliser en dehors de la fonction. J'ai essayé avec une array, mais je dois mal m'y prendre, il n'y a toujours qu'un champignon qui est créé à la fois. Ce que j'aimerais, c'est que plusieurs champignons puissent être créés par le bouton, et qu'il réagissent tous au contact avec le robot. J'ai le code suivant:

button_1.addEventListener(MouseEvent.CLICK, AjouterChampi);
function AjouterChampi(event:MouseEvent):void {	i=i+1; var champignon = new Champignon;
addChild (champignon) in panier;
this.champignon.name=champignon+i;
trace(panier); 	TweenLite.to(champignon, 1, {autoAlpha:1}); 
champignon.visible = true; 
n+=1; 
champignon.x = 800 * Math.random(); 
if(champignon.x < 90) 	{champignon.y = 450  * Math.random()} 	else  	{champignon.y = 520  * Math.random();} 	 	trace("n="+n); 
robot.name = "robot"+n; 
panier.push(champignon); 
trace(robot.name); 
champignon.buttonMode = true; 
champignon.play(); }

panier est une array. J'ai mis this.champignon.name un peu au pif en regardant les questions/réponses de Gaël, mais de toute façon ça ne change rien. Je ne comprends pas le fonctionnement de l'array. Quand je la trace, ça me met quelque chose comme ça: [object Champignon],[object Champignon],[object Champignon],[object Champignon],[object Champignon] Avec chaque fois que je clique sur le bouton un [object Champignon] de plus. Mais je ne vois pas de champignon en plus sur l'écran. Je ne comprends pas où sont et comment récupérer ces objets qui sont dans l'array. Et il n'est pas possible de les nommer ou quoi?

JE ne suis pas sûre d'arriver à concrétiser mon affaire un jour.....