Controler les clips

Résolu
Signaler
Messages postés
16
Date d'inscription
mercredi 17 mars 2004
Statut
Membre
Dernière intervention
16 septembre 2005
-
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
-
Bonjour à tous,
Je débute sur Flash, et j'ai donc besoin de l'avis éclairé de plus expérimentés que moi...
Mon projet consiste à réaliser une animation de tennis à partir de données d'un fichier texte.
Ce txt comporte des variables telles que les positions successives des joueurs, de la balle (vitesse, hauteur, ...), et des coups joués.
Dans mon projet, chaque coup, tel un revers joué par le joueur de dos, correspond à un movie clip. J'ai donc autant de movie clips que de coups différents, multiplié par 2 (joueur de dos + joueur de face).
Je n'ai pas de problème pour charger les données du fichier texte. Le chargement se fait dans le calque supérieur, appelé "actions".
Comme je veux vérifier que les données sont chargées entièrement, je charge les données du txt dans l'image 1, je teste dans l'image 2. Si OK, je passe a la 3, sinon je reviens a la 1. Ca, ca marche bien.
Maintenant la question que je me pose, c'est où et comment controler mes différents clips, sachant que dans mon image 3, je constitue différents tableaux de variables, correspondant aux actions devant être réalisées par le joueur de face, le joueur de dos, et la balle.
Je ne sais pas où mettre mes instances de clips (sur 3 calques ? joueur_dos, joueur_face et balle ?) ni ou je dois controler ces clips. Une boucle de controle serait appropriée, du genre, tant que mon tableau a encore des données, joueur le clip correspondant, mais ce que je tente ne fonctionne pas.
Pourriez-vous m'éclairer s'il vous plait ?
Merci beaucoup.

29 réponses

Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
salut

deja pour le chargement txt, utilise LoadVars, se sera mieux que 2 frames pour charger et verifier les données

quand au reste, là comme ca j'ai un peu de mal a comrpendre ton principe

le mieux serait que tu mette en ligne ta source que l'on voit

ou au moins le bout de code correspondant, mais ss les obj graph c moins facile

++

Flash sans Limites
_Benjy
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
pemierement le loadVars

c'est normal que ca plante, loadvars est objet propre, et il ne charge pas les valeur sur root, mais dans lui mm

donc

txt = new LoadVars();

txt.onLoad = function(ok) {

if (ok) {

trace(this.Xdepart);

}

};

txt.load("import.txt");

marchera

je reagarde la suite de ton prob

++

Flash sans Limites
_Benjy
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
bon sans la source complette c'est du charabia ton truc, j'ai du mal a visualisé.

le mieux serait que tu pose le tout part là que je puisse voir.

3 petites infos toujours :



1/ setProperty est deprécier en MX ou MX2004, utilise plutot l'affectation directe (comme tu fait plus bas en plus)

genre :
setProperty("_root.a_s_d",_x,_root.Xdepart);

remplacé par :

_root.a_s_d._x = _root.Xdepart;



2/ ensuite, pour le onEnterFrame, c'est normal qu'il ne s'arrette pas,
si tu look dans l'aide de Flash, tu verra que onEnterFrame est une
fonction recurente, appelé tout les X seconde selon la vitesse de
defilement de ton anim

et cela mm s'il le clip n'est pas en lecture.

donc si tu veux pas surcharger le processeur, il faut la definir et la supprimer a la volée

onEnterFrame = maFonctionRecurente

et quand t'en a plus besoin

delete onEnterFrame



3/ pour la structure, moi j'aurai :

_root // ou tu charge tes donées

| -- clipJoueur1 (clip)

| -- pos1 (clip sur image1)

| -- pos2 (clip sur image2)

| -- ...

| -- clipJoueur2 (clip)

| -- pos1 (clip sur image1)


| -- pos2 (clip sur image2)


| -- ...

| -- balle (clip)

il te faut bien un tableau pour contenir tt les coups et deplacement

et une fonction qui parcour le tableau, non pas tt le temps, mais au fil des action

genre

indexAction = 0 // le jeu n'est pas lancer

mesActions = new Array(); // le tableau d'action, qui sera un tableau double entrées

var action1 = new Array(); // la premiere action

action1.joueur = 1;

action1.action = "goLeft";

action1.pos = {x:200,y:300};

mesActions.push(action1);

ar action2 = new Array(); // la seconde action


action2.joueur = 1;


action2.action = "frappeballe";


mesActions.push(action2);

function nextAction(){

action = mesActions[indexAction];

_root["joueur"+action.joueur].executer(action); // ou
executer est une fonction contenu dans joueur1, joueur2 et balle

action++;

}

la fonction executer dans joueur1, joueur2, et balle lancera un
onEnterFrame dans ce dernier, quand elle sera appellé, dans l'exemple
d'un déplacement, le onEnterFrame fera le deplacement, et quand il
atteindra la position final, il faut supprimer le onEnterFrame (qui
sert plus) et rapeller _root.nextAction(); pour effectuer la suite.



j'espere que tu capte mon explication

mais je pense que tu devrai te familiariser un peu plus avec AS2 av de
te lancer la dedans, car a voir ton code, c'est pas tout a fait gagné,
commence peut etre par des truc plus simple pour compendre les diff
principes et seulement apres fait un meltigpot du tout



++


Flash sans Limites
_Benjy
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
oki fallait le dire que t'es en flash 5 car en effet le LoadVars risque pas de marché fu qu'il n'existe pas en flash 5

je te conseille vivement de passé en mx voir mx2004 (version demo 30 j sur marcomedia)

pour la structure tu a bien compris c'est ca

et pas de prob pour autre problemes, le forum est là pour ca



ps : il serait sympa que tu acceptes mes reponses, c'est pour mes points CS

++

Flash sans Limites
_Benjy
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
Suis-je obligé de mettre une instance du MC joueur1 sur le calque Actions pour pouvoir le controler ?

>> pas forcement sur le calque action mais il doit etre present sur la scene pour pourvoir le controler

Peux-tu m'expliquer la partie concernant l'alimentation du tableau ?

>> y' qu'un seul tableau dans mon exemple : mesActions, car action1 est juste un élément de mesActions

>> ce sui donne :

mesActions[0]["joueur"] = "trlala"

mesActions[0]["pos"] = {posX,posY}

mesActions[0]["action"] = "goMachin"

mesActions[1]["joueur"] = "tsouintsouin"


mesActions[1]["pos"] = {posX,posY}


mesActions[1]["action"] = "goMachinAutre"

...

Ne serait-ce pas plutot indexAction++ dans la fonction NextAction ?

>> si autant pour moi c'est bien indexAction

Je ne comprends pas bien la syntaxe : _root["joueur"+action.joueur].executer(action);

>> c'est equivalent à _root.joueur1.executer(action);

sauf que joueurX est appelé
selon ou tu en es dans la boucle d'execution, pour eviter de faire un
test genre if (joueur == 1) _root.joueur1.executer ...

++

Flash sans Limites
_Benjy
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
ben met un stop dans clip1 sur l'image 1

Flash sans Limites
_Benjy
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
ben ta variable clipjoue est une chaine de caractere, non un nom de clip

donc pour l'appeler dans ton init_pos(), il faut que tu utilise la notation crochet :

this[clipjoue]._x = _root.txt.Xdepart;

Flash sans Limites
_Benjy
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
ben je pense pas t'avoir dis de faire un boucle pour lire tes anim les unes a la suite des autres

car un boucle (for) est executé en un coup (au mm instant T)

il faut que tu lance la premiere,

a la fin du scenar de la premiere tu met un truc du genre :

stop(); // ou gotoAndStop(1) pour revenir au debut

_parent.clipsuivant.play();

et ainsi de suite dans chaque clip

++


Flash sans Limites
_Benjy
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
alors deja je ne vois mm pas le 'action_suivante' rapellé dans le code, il devrait etrre en dessous de this[clipjoue].stop();

de plus action_suivante est sur _root et le onEnterFrame de control et dans le clip joueur1

donc pour appeler action_suivante faut pas oublier de remonter

if (fin_clip==true){

delete onEnterFrame;

this[clipjoue].stop();

_parent.action_suivante();

}

pour t'as seconde question, le petit rond est le centre de gravité de
ton anim (util uniquement lorsque tu le deforme avec l'outil de
transformation)

la crois quand a elle est le reel centre de ton clip (les possition _x _y utilisable en AS

++


Flash sans Limites
_Benjy
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
be ouaip il faudrait mieux que le second clip soit present quan dtu
l'appel, hors s'il est sur l'image 2 il ne l'est pas puisque tu est sur
image1

met tttes clip au mm endroit est affiche les, caches les avec _visible

++

Flash sans Limites
_Benjy
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
ca vient p'etre plutot de la methode que tu utlise pour le deplacer

si c un truc genre _x += 4, le décalage vient du +4, donc si pour quand
il va vers la gauche, tu as _x < initPosX alors ajoute _x = initPosX

si tu fais ca avec une objet TweenMotion, je sais pas d'ou ca peux venir normallement ca marche nikel

++

Flash sans Limites
_Benjy

ps : merci de penser a accepter la reponse si elle te convient
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
Salut

pour ton décalage, je vois
qu'une chose, ca dois etre le centre de gravité (les coord x, y sont
tjs le point en haut a gauche du clip)

pour l'autre truc, arrete l'anim, ben suffit de pas refaire appel a la fonction de mouvement ...

Flash sans Limites
_Benjy chez kOlapsis

merci de penser a accepter
Messages postés
1575
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
21 février 2011
2
Salut

autant pour moi ce n'est pas dans proprietes, tu peux uniqement le faire a la création du clip

donc autre solution

edite le clip

selection tt (CTRL+A)

dans le panneau proprietes en bas

met 0 à X et 0 à Y

ca devrai le faire

++

Flash sans Limites
_Benjy chez kOlapsis

merci de penser a accepter
Messages postés
16
Date d'inscription
mercredi 17 mars 2004
Statut
Membre
Dernière intervention
16 septembre 2005

Merci Benjy pour ta réponse.
Concernant le LoadVars, je ne l'ai pas utilisé pârce que ca ne fonctionne pas... Je l'ai mis dans mon calque Actions, qui est au-dessus de tous les autres, sur l'image 1 :

txt = new LoadVars();
txt.load("import.txt");
txt.onLoad = function(ok) {
if (ok) {
trace(_root.Xdepart);
}
};

La variable Xdepart (qui est celle de mon fichier texte) ne vaut rien.

C'est pourquoi je m'étais résolu à utiliser loadVariablesNum dans le clip de départ.

Pour le reste, je vais essayer d'etre plus clair. J'ai mis mon code actruel a la suite des explications.
Je veux réaliser une animation de tennis qui se joue toute seule, donc sans intervention utilisateur, si ce n'est un bouton JOUER au départ.
Tout l'échange de tennis est controlé par un fichier texte, lequel contient les variables. Elles peuvent être nombreuses, c'est pourquoi je dois m'assurer que la dernière variable est bien chargée avant que ne commence l'animation.
Mon idée est de créer 3 tableaux, reprenant ces variables. Le 1er tableau contient les données du joueur de dos, le 2eme les données du joueur de face, et le 3eme les données de la balle.
Par exemple pour le joueur de dos, on aurait un tableau qui contiendrait :
Séquence 1 => position X = 245
Séquence 1 => position Y = 123
Séquence 1 => action = course_gauche
Séquence 1 => arrivée X = 148
Séquence 1 => arrivée Y = 164
Séquence 2 => action = jouer_coup_droit
Séquence 3 => arrivée X = 224
Séquence 3 => arrivée Y = 131
...
Même genre de tableau pour le joueur de face.

Donc lorsque l'on est en séquence 1 (purement indicatif), il faut appeler le clip "course_gauche" pour le joueur de dos, et par exemple "course_droite" pour le joueur de face. Et cela en parallèle.
Et ainsi de suite jusqu'au dernier niveau de séquence, qui correspondra à la fin de l'échange. Suis-je plus clair ?

Actuellmeent, j'ai donc mis le chargement des données dans le 1er clip (bof, parce que le 1er clip à être joué peut etre différent a chaque fois), et j'ai mis l'instance du clip de course vers la gauche dans le calque Actions

Voici mon code actuel :

Calque Actions, Image 1

_root.finclip=false

// fonction pour déplacer le clip de course du joueur
function deplacement() {

if (_root.init eq "") {
setProperty("_root.a_s_d",_x,_root.Xdepart);
setProperty("_root.a_s_d",_y,_root.Ydepart);
_root.init="ok";
trace(_root.Xdepart);
trace(_root.Xarrivee);
trace(_root.Ydepart);
trace(_root.Yarrivee);
trace("INIT OK");
}

x=Math.abs(_root.Xdepart - _root.Xarrivee);
y=Math.abs(_root.Ydepart - _root.Yarrivee);

if(x > y){
xspeed=8;
yspeed=8*(y/x);
}
else{
yspeed=8;
xspeed=8*(x/y);
}

trace("Xspeed = " + xspeed);
trace("Yspeed = " + yspeed);

with(_root.a_s_d){
if(_x > (_root.Xarrivee) || _x < (_root.Xarrivee) ||_y > (_root.Yarrivee) || _y < (_root.Yarrivee)){

if(_x > _root.Xarrivee){
_x = _x - xspeed;
}else{
trace("_x = " + _x);
_x = _x + xspeed;
trace("_x = " + _x);
trace(xspeed);
}
if(_y >_root.Yarrivee){
_y = _y - yspeed;
}else{
trace("_y = " + _y);
_y = _y + yspeed;
trace("_y = " + _y);
}
}

}

if(((_root.a_s_d._x >= _root.Xarrivee) && (_root.Xarrivee)) || ((_root.a_s_d._y >=_root.Yarrivee) && (_root.Yarrivee))) {
setProperty("_root.a_s_d",_x,_root.Xarrivee);
setProperty("_root.a_s_d",_y,_root.Yarrivee);
trace("FIN DU DEPLACEMENT");
trace("_root.a_s_d._x = " + _root.a_s_d._x);
trace("_root.a_s_d._y = " + _root.a_s_d._y);
_root.finclip=true
}

}

Actions de l'instance du clip dans le calque Actions
onClipEvent(enterFrame){

Là, le clip s'arrete bien a s'etre déplacé, mais je constate que l'on continue a passer dans le EnterFrame alors que la tete de lecture est arretee...Bof
if (_root.finclip==true) {
_root.a_s_d.gotoAndStop(1);
//_root.a_s_d.stop();
trace("STOP de la lecture dans EnterFrame");
}
else {
if(_root.loaded=="1"){
_root.deplacement();
}
}

}

Actions du clip course vers la gauche
Image 1
if(startup eq "") {
startup="Run";
loadVariablesNum("import.txt",0);
trace("DONNEES CHARGEES");
}

Image 2
if(_root.loaded=="1"){
trace("DONNEES CHARGEES AVEC SUCCES");

gotoAndPlay(3)
}
else {
gotoAndPlay(1);
}

Image 8
gotoAndPlay (1);

Petite précision : mon clip se compose de 8 images (positionnées de image 1 à image 8) distinctes simulant un joueur en train de courir.

Suis-je bien parti dans l'organisation de mon projet ? Et si c'est le cas, comment et surtout où enchainer la lecture des clips ?

Merci de ton aide Benjy
Messages postés
16
Date d'inscription
mercredi 17 mars 2004
Statut
Membre
Dernière intervention
16 septembre 2005

Merci beaucoup Benjy pour cette explication.

Si je reprends point par point...

1/ le Loadvars ne fonctionne toujours pas dans mon projet, mais peut-être est-ce dû au fait que j'utilise Flash 5 ?
J'ai copié/collé le code que tu as mis, et il ne passe pas dans le onload...

2/ Si j'ai bien compris la structure que tu préconise, on a :
- un seul calque "Actions" sur la scène principale, dans lequel se fait les init et le chargement des tableaux. Ce calque ne contient aucune instance de clip.
- trois clips J1/J2/balle contenant chacun les différents clips de position et de frappe leur correspondant.

Pour le reste j'ai bien compris. Je vais effectivement essayer de me familiariser un peu plus avec AS mais il faut bien avouer que c'est plus motivant d'apprendre sur du concret...
En tous cas, merci beaucoup pour tes lumières, je me permettrai de te (re)-solliciter au besoin si ca ne te dérange pas.

Thierry
Messages postés
16
Date d'inscription
mercredi 17 mars 2004
Statut
Membre
Dernière intervention
16 septembre 2005

Désolé, j'ignorais le coup des points CS. Je t'en fait perdre 2 ou 3 sur ce coup la :-(
Je vais donc passer à MX, ca m'évitera de me demander pourquoi les instructions ne donnent rien !
Encore merci benjy, et surement à bientôt :-)

Thierry
Messages postés
16
Date d'inscription
mercredi 17 mars 2004
Statut
Membre
Dernière intervention
16 septembre 2005

Salut Benjy,

je reviens vers toi pour quelques conseils ou demandes de précisions par rapport aux précédents messages.

* déjà, je suis passé en Flash MX 2004, et le loadVars marche très bien.
* j'ai structuré mon projet comme suit :
Scene 1
calque actions (aucun symbole dessus)
=> loadvars
calque court (symbole court de tennis)
Définitions de Symboles
MC joueur1
calque joueur_dos
=> contient sur l'image 1 une instance de MC course_droite
=> contient sur l'image 2 une instance de MC course_gauche
=> contient sur l'image 3 une instance de MC course_arriere
MC course_droite
=> images de 1 à 8 simulant la course
=> en image 8 : gotoAndPlay(1)
MC course_gauche
=> images de 1 à 8 simulant la course
=> en image 8 : gotoAndPlay(1)
...

Suis-je obligé de mettre une instance du MC joueur1 sur le calque Actions pour pouvoir le controler ? Car si je ne le mets pas, il ne se lit jamais.

* Peux-tu m'expliquer la partie concernant l'alimentation du tableau ? je ne vois pas pourquoi tu utilises 2 tableaux pour en alimenter un 3ème. Ne peut-on pas l'alimenter directement ?

* Ne serait-ce pas plutot indexAction++ dans la fonction NextAction ?

* Je ne comprends pas bien la syntaxe :
_root["joueur"+action.joueur].executer(action);
surtout les crochets...

Merci Benjy
Messages postés
16
Date d'inscription
mercredi 17 mars 2004
Statut
Membre
Dernière intervention
16 septembre 2005

Merci Benjy pour ces explications
C'est plus clair pour moi.
J'arrive bien à faire déplacer mon clip AA qui se trouve sur l'image 1 du clip Joueur1 (lui-même en instance sur la scène). Par contre, dès que je rajoute un autre clip BB sur l'image 2 du clip Joueur1, ca ne fonctionne plus. J'ai l'impression qu'il boucle entre les 2, j'ai beau forcer un stop du BB dans la fonction, rien n'y fait.
Depuis le clip 1, j'arrive donc bien à controler AA, mais avec BB en image 2, plus de controle ! As-tu une idée du problème ?
Merci
Thierry
Messages postés
16
Date d'inscription
mercredi 17 mars 2004
Statut
Membre
Dernière intervention
16 septembre 2005

en fait le problème ne vient pas de là (j'avais bien mis stp() sur l'image 1. Je me suis très mal expliqué.

Le problème que je rencontre est que je stocke dans la scene principale le nom du clip à jouer dans une variable, et qu'il ne le reconnait pas comme un clip.

Dans la scene 1, j'ai :
_global.clipjoue="D_avant_service_droite"; // nom du MC
_root.joueur1.executer(); // joueur1 est le MC contenu ds la scene, et contenant le MC D_avant_service_droite

Dans le clip joueur1 (qui se trouve sur la scene, et qui comprend le MC D_avant_service_droite), j'ai :
function executer() {
trace("dans executer = " + clipjoue); // clipjoue est bien renseigné
init_pos();
onEnterFrame = function() {
deplacer();
trace("ds enterframe " + clipjoue); // clipjoue est bien renseigné
if (fin_clip==true){
delete onEnterFrame;
}
}
}

function init_pos(){
clipjoue._x=_root.txt.Xdepart; // Xdepart vaut -220
clipjoue._y=_root.txt.Ydepart;
trace("clipjoue = " + clipjoue); // clipjoue="D_avant_service_droite"
trace("X de clipjoue " + clipjoue._x); // undefined
}

Ma variable clipjoue reste bien renseignée par le nom du clip, mais quand je l'utilise avec les propriétés de MC, comme _x, il devient undefined.
As-tu une idée du problème ?
Merci
Thierry
Messages postés
16
Date d'inscription
mercredi 17 mars 2004
Statut
Membre
Dernière intervention
16 septembre 2005

Merci pour l'info Benjy ! Voila le genre de choses qu'on ne trouve pas dsans les tutoriaux. Du coup ca marche tres bien.
Par contre quelquechose m'étonne.
J'ai fait une boucle sur lma scene, comme tu l'avais préconisé au départ, pour jouer les clips les uns apres les autres.
Mais il n'attend pas qu'un clip soit fini pour jouer le suivant. Il me joue toujours le dernier. Comment lui dire d'attendre la fin du clip pour jouer le suivant ?
Merci
Thierry