Thierry92psg
Messages postés16Date d'inscriptionmercredi 17 mars 2004StatutMembreDernière intervention16 septembre 2005
-
22 août 2005 à 17:57
_benjy
Messages postés1575Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention21 février 2011
-
16 sept. 2005 à 17:35
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.
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
_benjy
Messages postés1575Date d'inscriptionvendredi 23 avril 2004StatutMembreDernière intervention21 février 20112 25 août 2005 à 21:14
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 ...
Thierry92psg
Messages postés16Date d'inscriptionmercredi 17 mars 2004StatutMembreDernière intervention16 septembre 2005 23 août 2005 à 12:50
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() {
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 ?
Thierry92psg
Messages postés16Date d'inscriptionmercredi 17 mars 2004StatutMembreDernière intervention16 septembre 2005 23 août 2005 à 17:07
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.
Thierry92psg
Messages postés16Date d'inscriptionmercredi 17 mars 2004StatutMembreDernière intervention16 septembre 2005 23 août 2005 à 17:35
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 :-)
Thierry92psg
Messages postés16Date d'inscriptionmercredi 17 mars 2004StatutMembreDernière intervention16 septembre 2005 25 août 2005 à 17:09
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...
Thierry92psg
Messages postés16Date d'inscriptionmercredi 17 mars 2004StatutMembreDernière intervention16 septembre 2005 26 août 2005 à 16:14
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
Thierry92psg
Messages postés16Date d'inscriptionmercredi 17 mars 2004StatutMembreDernière intervention16 septembre 2005 29 août 2005 à 09:54
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;
}
}
}
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
Thierry92psg
Messages postés16Date d'inscriptionmercredi 17 mars 2004StatutMembreDernière intervention16 septembre 2005 29 août 2005 à 17:45
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