STIC Discussion:STIC I - exercice 4 (Stella)

De EduTech Wiki
Aller à la navigation Aller à la recherche

cliquer sur un objet invisible -- Lucie.Marchon 17 novembre 2010 à 12:00 (CET)

Bonjour Est-ce qu'une instance qui est déterminée non visible est cliquable?

Re: cliquer sur un objet invisible -- Jaboulay 17 novembre 2010 à 15:04 (CET)

Bonjour Lucie. Sois tu as un objet sur lequel tu assignes une transparence totale (Alpha = 0) et il est toujours clickable Sois tu appliques la propriété .visible = False et là il n'est pas clickable (par exemple button.visible = false;)

Re: Re: cliquer sur un objet invisible -- Lucie.Marchon 17 novembre 2010 à 20:08 (CET)

Nickel, merci!!

animation à l'intérieur d'un clip -- Vjollca Ahmeti 18 novembre 2010 à 15:06 (CET)

Au niveau de l'ActionScript 3.0, quand on veut appliquer un fonction à une animation, est-ce que ça change quelque chose si l'animation est à l'intérieur d'un clip ? Au niveau du code, est-ce qu'il faut indiquer où est l'animation ? Où est-ce que si on indique juste le nom de l'animation en question, la fonction retrouve l'animation qu'elle soit à l'intérieur du clip ou pas ?

Re: animation à l'intérieur d'un clip -- Daniel K. Schneider 19 novembre 2010 à 14:04 (CET)

"Appliquer une fonction à une animation" n'est pas très clair pour moi, enfin j'essaye de répondre:

Si la fonction de l'objet A est dans la timeline du clip A et l'objet B également inséré dans la timeline de l'object A, rien ne change. Donc travailler avec la timeline principale est exactement la même chose que travailler avec la timeline d'un clip.

objetB.play();

Sinon, si vous avez des clips dans des clips qui communiquent, il faut aider Flash. Si depuis une timeline (par exemple la maintimeline), vous voulez appeler une méthode d'un objet B qui se trouve sur la timeline d'un objet A, il faut utiliser:

A.B.fonction();

c.f. l'exemple des avions. Flash_CS4_-_Symboles_et_clips#Exemple_avion_avec_2-3_niveaux_d.27imbrication_de_symboles

Si vous voulez depuis un objet imbriqué dans une timeline, exécuter une méthode d'un objet B qui se trouve ailleurs, on peut utiliser:

MovieClip(root).B.play();

Enfin, globalement il faut plutot essayer d'éviter à ce que les objets se lancent à travers les hiérarchies. Cela les rend dépendants. En gros je conseille:

  • Utiliser un clip pour une application (donc ne jamais utiliser la maintime line pour cela
  • Dans ce clip, utiliser soit ActionScript soit la timeline pour coordonner l'éxécution de clips imbriqués.
  • Autrement dit: Il faut éviter des hiérarchies de clips compliqués et limiter toute dépendence entre clips à un strict minimum.

lancer plusieurs animations en même temps ou en différé -- Vjollca Ahmeti 18 novembre 2010 à 16:02 (CET)

Est-ce qu'on peut lancer plusieurs animations à la fois avec la même fonction (ex. en appuyant sur un bouton, on lance plusieurs animations à la fois) ? Et est-ce qu'on peut faire ça même si l'une des animations est sur la main timeline et l'autre à l'intérieur d'un clip ? C'est un peu ce qui a été fait avec l'exemple de l'avion, non ? Et est-ce qu'on peut lancer deux animations différentes mais en différé (ex. L'une d'abord et quand elle se termine, lancer la suivante) ? On devrait pouvoir faire ça, non ?

Re: lancer plusieurs animations en même temps ou en différé -- Daniel K. Schneider 19 novembre 2010 à 13:47 (CET)

oui on peut faire les trois choses

(1) Depuis une fonction on peut faire ce qu'on veut (donc faire exécuter 1000 choses si on a envie). donc oui pouvez en lancer autant que vous voulez. Note: Le concept de fonction n'a rien à voir avec le Flash/ActionScript. C'est une principe universel en informatique...

(2) une animation sur la maintime line plus une qui est dans un clip sur un autre layer peuvent tourner en même temps. Il suffit d'étendre le keyframe ou se trouve ce clip jusqu'à la fin de l'animation dans la maintimeline (F5 - insert frame).

(3) Pour lancer une animation en différé, il existe plusieurs strategies:

  • Simple (pas trop élégant) - bricoler avec la timeline: Créez un clip ou utiliser la maintimeline. Ensuite lancez simplement l'animation A dans un premier frame. Ensuite allonger le frame oũ se trouve le clip (par exemple clic sur F5 dans le frame 48 pour avoir 2 secondes). Ensuite stopper l'anim si nécessaire, puis lancer la suivante selon le même principe
  • Avec un timer (désolé je n'ai pas le temps de documenter)
  • Avec une fonction que le clip A appelle quand il à terminé. Donc dans le dernier frame de la timeline interne à l'animation A on peut appeler une fonction qui lance l'animation B, ou directement la lancer. Mais attention cela nécessite du code spécial. La timeline du clip A ne voit pas le clip B. Donc faut ce genre de code:
MovieClip(root).clipB.play();

ou encore:

MovieClip(root).fonction_dans_maintimline();
  • Plus élégant (mais plus difficile donc je n'ai pas cherché de solution): avec un event handler,

noms d'instances avec la fonction addChild -- Lucie.Marchon 18 novembre 2010 à 21:30 (CET)

Bonjour J'aimerais faire se rencontrer le robot et les champignons et je ne comprends pas comment faire. Voilà mon fichier:

Re: Re: noms d'instances avec la fonction addChild -- Daniel K. Schneider 19 novembre 2010 à 17:43 (CET)

Etant donné qu'il s'agit d'un problème qui demande un peu de temps, j'aimerai d'abord avoir 2-3 précisions avant de chercher une solution.

Notamment:

  • Voulez-vous que le robot se déplace lui-même pour aller manger les champignons ?
  • Ou gérer le fait que l'utilisateur soit bouge un champignon sur le robot soit déplace le robot avec les touche ?

J'ai déjà réparé votre script pour qu'il marche avec le dernier robot placé. Réparé:

  • la variable champignon doit être déclaré en dehors de la fonction ! (vous l'avez fait, mais ensuite déclaré une autre dans la fonction qui était pas la même ...)
  • l'expression logique à mon avis avait des problèmes de priorité (le ">" est plus important que le "-" je crois)
  • le if était dans clause "default" du script also qu'il doit s'éxécuter à chaque fois qu'un user fait bouger ....
// juste déclarer la variable
var champignon:Champignon;


function RobotBouge(evt:KeyboardEvent):void
{
	robot.flammes.visible = true;
	switch (evt.keyCode)
	{
		case Keyboard.RIGHT :
			robot.x +=  10;
			//trace("x=" + robot.x);
			break;
		case Keyboard.LEFT :
			robot.x -=  10;
			//trace("x=" +robot.x);
			break;
		case Keyboard.UP :
			robot.y -=  10;
			//trace("y=" +robot.y);
			break;
		case Keyboard.DOWN :
			robot.y +=  10;
			//trace("y=" +robot.y);
			break;
		default :
			robot.flammes.visible = false;
			break;
	}
	
	trace("champignon x,y=" + champignon.x, champignon.y, "robot x,y=", robot.x, robot.y);

	if (     (robot.x > (champignon.x - 10)) 
	      && (robot.x < (champignon.x + 10)) 
	      && (robot.y > (champignon.y - 10))
	      && (robot.y < (champignon.y + 10))
	   )
	{
		for (var i=0; i<20; i++)
		{
			champignon.width = champignon.width * 2;
			champignon.length = champignon.length * 2;
		}
		champignon.visible = false;

	}
}

Faudrait aussi calibrer les +5 ou + 10 etc. en fonction du point d'enregistrement... Mais en gros le champignon disparaît.

Votre aggrandissement (explosion) ne marchera pas car l'ordinateur calcule en micro-secondes ... Mettez plutot une animation dans la timeline du clip champignon avec un stop() dans le premier frame. Ensuite

champignon.play () // au lieu du "for"

Sinon utilisez tweenmax ou qc. du genre.

Re: Re: Re: noms d'instances avec la fonction addChild -- Lucie.Marchon 19 novembre 2010 à 23:13 (CET)

C'est bon, l'interaction fonctionne, le champignon disparaît dès que le robot lui arrive dessus, je vous remercie. Mon souci est que j'aimerais que cela s'applique à tous les champignons (et même si possible que la chose se passe que l'on drag le champignon sur le robot ou que le robot rejoigne le champignon). Mais lorsque je déclare le champignon à l'extérieur de la fonction qui crée le champignon en pressant sur le bouton, je ne peux faire qu'un champignon, qui se déplace chaque fois que je presse. J'aimerais créer plusieurs champignons et que le robot puisse agir dessus de manière différenciée. Je ne sais pas si champignon.name = "champignon"+n, avec une itération sur n aide à quelque chose.. Mais je veux tout d'abord comprendre comment faire pour créer plusieurs champignons tout en déclarant la variable à l'extérieur de la fonction... Et pourquoi je ne peux plus créer de champignon avec le bouton quand j'en ai détruit un...(j'ai résolu ce dernier problème avec un champignon.visible = true dans la fonction qui génère les champignons)

Re: Re: Re: Re: noms d'instances avec la fonction addChild -- Daniel K. Schneider 20 novembre 2010 à 12:27 (CET)

ok je vois. En bas une esquisse et des liens. Essayez, puis s'il faut plus d'aide, dites-moi ...

(donc pas lire/appliquer tous le tuto, la réponse est dans ce chapitre 4, faut juste remplacer les trace par un disparation des champis

Pour le robot qui se déplace: Vous avez encore une misconception en ce qui concerne les variables. Pas besoin pour accéder à un objet. Une des solutions est la suivante:

Dès que vous créez un champignion il faut le mettre dans un tableau et ensuite on utilise cela

Au début du fichier:

var panier:Array = new Array ();

Dans la fonction qui crée le champignion:

panier.push (champignion) ; // ajouter champi au tableau
// alternative: panier.push (new Champignion ());

Dans la fonction qui déplace le robot

for each (var champi in panier) {
    if (     (robot.x > (champi.x - 10)) 
	     && (robot.x < (champi.x + 10)) 
	     && (robot.y > (champi.y - 10))
	     && (robot.y < (champi.y + 10))
	     )
	{
	    for (var i=0; i<20; i++)
		{
		    champi.width = champi.width * 2;
		    champi.length = champi.length * 2;
		}
	    champi.visible = false;
	}
 }

Reste le problème des champignions invisibles. A priori faudrait les éliminer totalement, mais c'est pas urgent.

PS: "panier" ne se réfère pas à un objet ActionScript/Flash. c'est juste le nom de la variable que je donne au tableau ECMAScript. Donc le code marche tel quel modulo mes erreurs. Pas eu le temps de tester ...

Passage de paramètres dans une fonction -- Jaboulay 2 décembre 2010 à 15:25 (CET)

Daniel, j'ai pas mal finalisé l'exercice 4. Cependant, pour la beauté de la programmation, c'est pas le top. J'ai fait un puzzle de 4 pièces, et pour chacune j'ai créé une fonction pour détecter son emplacement. J'aurais aimé n'avoir qu'une seule fonction pour les 4 pièces, mais quand je met un paramètre dans le gestionnaire d'événement, il n'aime pas. Pourrais tu me guider? Le but serait d'être capable à terme de pouvoir générer aléatoirement des pièces ainsi que leurs emplacements respectifs.

Bref, j'aimerai avoir une fonction StopDragPiece qui recoive l'objet et les coordonnées qu'il est censé avoir comme destination pour tester s'il est à la bonne place.


Code exemple avec les pièces 1 et 2:

Piece1.addEventListener(MouseEvent.MOUSE_DOWN, startDraggingPiece1);

Piece1.addEventListener(MouseEvent.MOUSE_UP, stopDraggingPiece1);
Piece2.addEventListener(MouseEvent.MOUSE_DOWN, startDraggingPiece2);

Piece2.addEventListener(MouseEvent.MOUSE_UP, stopDraggingPiece2);

function startDraggingPiece1(event:MouseEvent) {
 
Piece1.startDrag();

}


function startDraggingPiece2(event:MouseEvent):void {
 Piece2.startDrag();
}

function stopDraggingPiece1(event:MouseEvent):void {
 
 if (Piece1.x <= -195 && Piece1.x >= -206 && Piece1.y <= -150 && Piece1.y >= -165)
 {
  Piece1.x = -201;
  Piece1.y = -157;
  Piece1.alpha = 1;
  Piece1.Tint = 100;
  SoundMarteau.play();
  NombrePiecesReparees = NombrePiecesReparees + 1 ;
  if (NombrePiecesReparees == 4){
    SoundApplause.play();
    InstanceCrabe.play();
    gotoAndStop(5);
  }
  Piece1.removeEventListener(MouseEvent.MOUSE_DOWN, startDraggingPiece1);
  Piece1.removeEventListener(MouseEvent.MOUSE_UP, stopDraggingPiece1);
 }
 Piece1.stopDrag();
}

function stopDraggingPiece2(event:MouseEvent):void {
 
 if (Piece2.x <= -84+10 && Piece2.x >= -202-10 && Piece2.y <= -202+10 && Piece2.y >= -202-10)
 {
  Piece2.x = -84;
  Piece2.y = -202;
  Piece2.alpha = 1;
  SoundMarteau.play();
  NombrePiecesReparees = NombrePiecesReparees + 1 ;
  if (NombrePiecesReparees == 4){
    SoundApplause.play();
    InstanceCrabe.play();
    gotoAndStop(5);
  }
  Piece2.removeEventListener(MouseEvent.MOUSE_DOWN, startDraggingPiece2);
  Piece2.removeEventListener(MouseEvent.MOUSE_UP, stopDraggingPiece2);
 }
 Piece2.stopDrag();
}

Re: Passage de paramètres dans une fonction -- Daniel K. Schneider 2 décembre 2010 à 16:52 (CET)

oui effectivement on ne peut pas passer un paramètre, puisque dans le code suivant:

Piece1.addEventListener(MouseEvent.MOUSE_DOWN, startDraggingPiece);

"startDragginPiece" est juste l'identificateur d'une fonction et qui va recevoir l'objet événement comme seul argument. Donc la clef c'est justement l'objet événement. Suffit de lui demander de l'info sur l'objet.

function stopDraggingPiece1(event:MouseEvent):void {
 // quel objet on a manipulé
 var piece = evt.target;
 .....
}

PS: désolé c'est un peu rapide, mais je suis malade et je me repose, me redemander si c'est pas assez ...

Problèmes de timing -- Vjollca Ahmeti 27 janvier 2011 à 18:40 (CET)

J'aimerais améliorer mon animation pour qu'elle fonctionne correctement !

J'ai plusieurs problèmes mais je ne comprend pas ce qui ne va pas dans mon code !

J'aimerais :

  • Qu'on ne voit pas la flamme au début de l'animation
  • Que toutes les animations soient arrêtées au début de l'animation (je croyais que la fonction stop au début du code suffisait)
  • Que l'animation de la flamme et de la jauge ne commencent qu'au moment où on appuie sur le bouton "cache"
  • Que le verre reste sur la bougie une fois qu'il a terminé sa course et pas qu'il revienne à sa place initiale

Est-ce que vous pouvez m'aiguiller ? Merci d'avance

Re: Problèmes de timing -- Daniel K. Schneider 27 janvier 2011 à 18:58 (CET)

En gros (pas testé):

(1)

bougie.flamme.visible=false;

(2)

bougie.stop();

(3)

bougie.play();

c'est donc pas la flamme qui play, mais bien le movie clip que vous avez appelé bougie.

(4) Soit mettre un stop tout à la fin, donc créer une nouvau layer et ensuite insérer un keyframe dans le frame 20

Soit remplacer l'animation cache sur la main timeline par un clip "cache", faire cache.play() , puis mettre un stop dans ce clip à la fin.

Re: Re: Problèmes de timing -- Vjollca Ahmeti 28 janvier 2011 à 18:30 (CET)

Et bien moi j'ai testé ces solutions que vous me proposer et c'est pire qu'avant !

(1) Ca me déplace mon verre, (je ne sais pas pourquoi), il me dis "Access of undefined property bougie" ! Les boutons ne marchent plus aussi.

(2) Pareil que 1 !

(3) Pareil que 1 et 2 !

(4) Ok, ça marche !

Pourquoi dans le reste du code, il trouve la propriété bougie, mais pas pour ces 3 lignes supplémentaires ?!?

Re: Re: Re: Problèmes de timing -- Daniel K. Schneider 28 janvier 2011 à 18:43 (CET)

ouais mais faut choisir les bons nom d'instance. Donc par exemple pour (1-3) c'est pas bougie, mais obj_bougie dans votre code. Donc il s'agit simplement de stopper/démarrer un clip et la syntaxe est:

 nom_du_clip.play()
 nom_du_clip.stop()
Re: Re: Re: Re: Problèmes de timing -- Vjollca Ahmeti 1 février 2011 à 10:47 (CET)

Oups ! Effectivement! Merci beaucoup. Ca marche maintenant. Et j'ai aussi corrigé pour l'objet jauge_o2 parce qu'il fallait que ce soit en même temps.

hiérarchisation boutons et nom problème ?--ct 28 novembre 2011 à 15:41 (CET) -- ct 28 novembre 2011 à 15:41 (CET) -- ct 28 novembre 2011 à 15:41 (CET)

Bonjour,

Je travaille sur l'exercice 4: il me semble que le code est correct mais le message suivant apparaît:

Line 1	1046: Type was not found or was not a compile-time constant: borange.

Or, la ligne 1 est celle du stop ();

Je pense donc avoir un problème de hiérarchisation ou de nom incorrect (classe ou propriété) ou ?????


Pouvez-vous jeter un oeil à mon travail? http://tecfaetu.unige.ch/etu-maltt/qwerty/theytac7/clipe2route.fla

Merci

Christine

Re: hiérarchisation boutons et nom problème ?--ct 28 novembre 2011 à 15:41 (CET) -- ct 28 novembre 2011 à 15:41 (CET) -- Daniel K. Schneider 28 novembre 2011 à 16:38 (CET)

Mystère total pour moi ! A mon avis un bug. Donc j'ai renommé les fonctions et cela marche, enfin pas vraiment car après j'ai trouvé 2 problèmes qui sont faciles à identifier:

  • Si vous lancez un clipB dans un clipA, il faut utiliser la syntaxe:
clipA.clipB.play();

Par exemple:

clipcircul2.fille.play();
  • Vous pouvez seulement play un clip qui a une timeline. Ni la fille, ni la voiture ont en ... Autrement dit, vous pouvez seulement arreter et démarrer le clip sur la scène (clipcricul2)

Voici un code à coller pour que le programme tourne déjà. A vous de continuer :

clipcircul2.stop();

b_rouge.addEventListener(MouseEvent.CLICK, f_rouge);
b_orange.addEventListener(MouseEvent.CLICK, f_orange);
b_vert.addEventListener(MouseEvent.CLICK, f_vert);


function f_rouge(ev) {
	trace(this.clipcircul2);
	clipcircul2.stop();
}

function f_orange(ev) {
	trace(this.clipcircul2);
	clipcircul2.stop();
/* Ces choses ne sont pas des clips, et on ne peut pas play, ensuite faudrait les appeler
    clipcircul2.fille.play();
	*/
	/*
	this.fille.play();
	this.voiture1.play();
	this.voiture2.stop();
	this.voiture3.stop();
	*/
}
function f_vert(ev) {
	trace(this.clipcircul2);
	clipcircul2.play();
}

clips,timeline,bouton, etc. -- MYB 7 décembre 2011 à 21:13 (CET) -- MYB 7 décembre 2011 à 21:13 (CET)

Bonjour,

Il y a plusieurs heures que je suis sur cette animation et je n'arrive pas à m'en sortir. J'ai des clips qui fonctionnent individuellement mais lorsque j'essaye de les mettre dans dans AS, il ne fonctionnement pas s'il n'ont pas de durée dans la timeline. Ensuite, j'ai des actions que je n'arrive pas à faire fonctionner. Par exemple, un bouton simple à côté d'une photo qui devrait déclencher une action (un clip réalisé en frame by frame) et qui ne le fait pas.

Bref, il y a plusieurs erreurs que je n'arrive pas à résoudre. Est-ce que quelqu'un peut m'aider et me dire où sont les erreurs et ce que je programme de manière erronée. Merci

Myriam

Re: clips,timeline,bouton, etc. -- MYB 7 décembre 2011 à 21:13 (CET) -- Daniel K. Schneider 8 décembre 2011 à 00:29 (CET)

Il y a trois types de problèmes

(1) Depuis le script principal dans le frame 1 vous faites référence à des objets qui ne sont pas dans le frame1. Pas possible et ActionScript va "sauter" avec une erreur. Je vous conseille vivement de changer les publish settings (menu file):

  • Cocher dans l'onglet Flash: Permit debugging. Cela va indiquer le frame et la ligne où Flash se plante en runtime (erreurs de type "Cannot access a property or method of a null object reference").
  • Donc le principe: Le code AS doit voir tous les objets qui sont sur la scène tout le temps. Donc vous regardez tous les layers du frame 1 de haut en bas et si un objet n'y est pas, vous devez changer votre code (par exemple le bouger dans le frame où l'objet apparaît)

Après il faut agir:

  • Bouger le code AS en question dans les scripts qui se trouvent dans les frames où il y a les boutons.
  • Exemple: Le code suivant devrait bouger du frame 1 dans le 50 (ensuite faut mettre l'hiver plus loin)
bt_itin_ete.addEventListener(MouseEvent.CLICK, clickHandler3);
function clickHandler3(event:MouseEvent):void {
  // gotoAndPlay(64); ...non
  gotoAndStop(64);
}

(2) Ensuite je vous conseille de ne pas utiliser goto and play, mais gotoAndStop() ! Car sinon vous ne verrez effectivement pas vos clips animés. Enfin vous les voyez, mais seulement pendant la durée des 4-5 frames (1/6 de seconde).

  • Vos animations sont effectiement dans des clips (ok)
  • Si vous voulez vous pouvez les laisser se lancer toutes seules (un gotoAndStop va régler votre problème je pense)
  • Sinon faire des boutons et les lancer avec
itin_ete.play(); 

depuis la fonction qui gère. Ne pas oublier d'insérer un itin_ete.stop() au début du script dans ce cas.

(3) Ne pas oublier d'insérer un stop(); à la fin de chacun de ces clips (donc dans le dernier frame des animations). Une animation de sentier doit à mon avis se jouer qu'une seule fois et pas à répétition.