STIC Discussion:STIC I - exercice 6 (Stella)

De EduTech Wiki
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:

Re: Re: Timer et removechild -- Saoussane Rrhioua 1 décembre 2011 à 01:04 (CET)

Bonsoir,

En voulant poser une question sur le Timer, je découvre que j'ai eu à peu près la même idée que jboulay zut!!! mais c'est un peu différent:

l'idée de mon animation est qu'en cliquant sur une grotte des poissons de tailles différentes sortent de celle-ci, une fois ils atteignent le nombre de 10 un requin apparaît pour dévorer 7-8 poissons (l'équilibre naturelle). donc je fais disparaitre les poissons de la façon suivante:

while (fishCounter>2) 
{
			this.removeChildAt(2); // le nombre 2 est pour ne pas effacer le background et la grotte!!
			fishCounter -=1;
}

Puis j'aimerai faire disparaître le requin après un laps de temps car il n'y a pas assez de nourriture.

J'ai essayé le Timer mais ça ne fonctionne pas, je crois que son rôle est de permettre d’exécuter une action d'une façon répétitive mais pas de faire une pause!!!

Est qu'il y a une fonction pause???

Merci d'avance,

Re: Re: Re: Timer et removechild -- Daniel K. Schneider 1 décembre 2011 à 20:54 (CET)

Ouais il y a. Comme je suis à l'étranger sur une petit ordi sans Flash je ne peux pas faire un exemple

Donc faut regarder la manuel:

  • Vous pouvez régler le délai entre les "ticks" en ms
  • Il y a une méthode stop(). Ne me souviens pas de l'avoir utilisé, donc faut peut-être chercher dans un forum Flash pour un exemple. Comme presque tous les jeux ont du time-based, cela doit se trouver:)

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Timer.html

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)inpanier;
	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.....

Re: -- Daniel K. Schneider 10 décembre 2010 à 10:20 (CET)

Il faudrait me dire plus concrètement ce que vous voulez faire et mettre un exemple complet en ligne avec les dessins et tout le ActionScript.

En attendant:

  • Il faut bien distinguer entre ce qu'on appelle le scene graph (tous les objets affichés sur la scène que Flash représente avec une structure arborescente) et des variables que vous créez vous-même pour gérer l'information.
  • panier est simplement une variable qui contient une liste et l'opération panier.push(champignon) marche très bien puisque cela ajoute un champignon dans cette liste. Maintenant une telle liste n'a strictement rien à voir avec l'affichage. C'est juste une liste de champignons que vous avez crée. Ceci dit, je ne vois pas encore à quoi cela sert.
  • Le code de Gael qui interroge le scene graph ne vous sert pas à grand chose ici (sauf si vous voulez faire plus compliqué et éliminer la gestion de champignons avec une liste). A mon avis la seule chose que vous devez comprendre du scene graph, c'est comment ajouter et comment enlever un objet.
addChild(objet);
removeChild(obj);
  • Je ne comprends pas pouquoi vous voulez nommer un champignon. Analogie: Dans une recette de cuisine quand vous coupez un panier (liste) de champignons, y a pas besoin de les nommer. Suffit de prendre le premier, le deuxième, etc ....

Au départ il faut commencer avec un code simple qui crée et place juste les champignons.

var panier = new Array ();

button_1.addEventListener(MouseEvent.CLICK, AjouterChampi);
function AjouterChampi(event:MouseEvent):void
{

	var champignon = new Champignon  ;
	// ajouter dans le panier .... mais pour quelle raison ?
	panier.push(champignon);
	
	champignon.x = 800 * Math.random();
	if (champignon.x < 90)
	{
		champignon.y = 450 * Math.random();
	}
	else
	{
		champignon.y = 520 * Math.random();
	}
	
	champignon.buttonMode = true;
	addChild(champignon)
	champignon.play();

/* Ensuite on peut par exemple définir des event handler functions pour gérer les manips 
     champignon.addEventListener(MouseEvent.MOUSE_CLICK, tuer);

*/
}

function tuer (ev) {
  // currentTarget est un propriété de l'objet Event et qui donne l'objet sur lequel on cliqué
  removeChild (ev.currentTarget);
}

Consignes pour exercice 6 -- Loic.boujol 10 décembre 2011 à 19:03 (CET)

Bonjour, J'espère ne pas passer mon message trop tard. On verra. Qu'entendez-vous par "l'application Flash doit comprendre au moins une utilisation d'un clip exporté (donc par exemple une balle de canon ou un bateau)"? Merci d'avance pour la précision. Meilleures salutations et à vendredi! :-) Loïc

Re: Consignes pour exercice 6 -- Daniel K. Schneider 11 décembre 2011 à 01:50 (CET)

Export for ActionScript

Donc il faut créer des instances du clip avec ActionScript .....