STIC Discussion:STIC I - exercice 4 (Stella)
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 ...
- Pour le drag and drop c'est relativement facile: Flash_tutoriel_drag_and_drop#D.C3.A9placer_et_d.C3.A9poser_un_objet_sur_un_autre_objet_.28drag_and_drop.29
(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 ?!?