[ Demande d'aide AS3 ] Faire sauter et retomber un perso

Résolu
ptitvincent Messages postés 34 Date d'inscription mardi 30 juin 2009 Statut Membre Dernière intervention 1 novembre 2010 - 7 oct. 2010 à 15:58
ptitvincent Messages postés 34 Date d'inscription mardi 30 juin 2009 Statut Membre Dernière intervention 1 novembre 2010 - 11 oct. 2010 à 09:24
Bonjour,

Je suis en train de réaliser un jeu de plateforme en flash.

Sur Scene j'ai un clip nommé "foxAnim" et qui contient 3 clip d'animation posés sur 3 frames différentes.

Le clip est fix car c'est du pure scroll (il n'y a que le fond qui bouge)

J'ai aussi un clip correspondant au sol et qui s'appel "testee"

Pour le moment je suis sur l'interaction du personnage (contenu dans "foxanim") via les touches du clavier. Voici donc mon code commenté (pour ceux qui ne connaissent pas AS3) qui est placé sur un calque "actions" :


//J'initialise 2 ecouteurs, 1 pour ecouter les touches enfoncées et l'autre pour les touches relachées. Puis je lance les 
//fonctions correspondantes ("actions" et "stopin")
stage.addEventListener(KeyboardEvent.KEY_DOWN, actions);
stage.addEventListener(KeyboardEvent.KEY_UP, stopin);

//FONCTION ACTIONS
function actions(event:KeyboardEvent) {

if (event.keyCode==Keyboard.RIGHT) {//-----SI (FLECHE DE DROITE)
foxAnim.gotoAndStop(2);     // Lecture de la frame 2 de clip foxAnim(qui correspond à l'anim de course)

}

if (event.keyCode==Keyboard.UP) {    //-----SI (FLECHE DU HAUT)
foxAnim.gotoAndStop(3);      // Lecture de la frame 3...
if(foxAnim.y<=testee.x+99)   //SI (la position Y de foxAnim est inférieur au x de mon sol + 99px)
               {
foxAnim.y--;                //Retrait de valeur à la position Y de foxAnim (pour aller vers le haut sur y)

}
}

}

//FONCTION STOPIN
function stopin(event:KeyboardEvent) {
if (foxAnim.hitTestObject(testee)){  //SI (foxAnim touche testee)
foxAnim.gotoAndPlay(1);      //Lecture de la frame 1 de foxAnim(qui correspond à un état "d'attente" du personnage
}else{                                //SINON

foxAnim.y = foxAnim.y+5;      //Ajout de valeur à la position Y...

}

}



Mon soucis est que lorsqu'on relache la FLECHE DU HAUT du clavier, "foxAnim" ne "retombe" pas. Il faut faire plusieur pression sur une touche du clavier pour relancer la fonction jusqu'a ce que "foxAnim" ai touché "testee"

de plus, quand on appuis sur la FLECHE DU HAUT, foxAnim ne monte pas de suite mais a un petit temps d'attente.

Voila et merci d'avance à ceux qui pourront me donner un coup de pince.

Vince.

10 réponses

pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
7 oct. 2010 à 16:21
il faut surtout tester ton hitTest à toutes les phases de la descente, pas juste au relaché de la touche ...

Car ça voudrait dire que le joueur doit relacher la touche pile-poil au moment où le personnage est sensé toucher le sol.
3
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
7 oct. 2010 à 16:46
non, en la testant réellement à chaque frame, par exemple.

Peg'
3
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
7 oct. 2010 à 16:03
Bonjour,

La question est simple : pourquoi as-tu mis ton hitTest sur l'action de relâché de touche ?

Dans le cas présent, il faut qu'il y ait 2 conditions superposées pour que ton personnage revienne en attente : relâché de la touche+hitTest ...

Peg'
0
ptitvincent Messages postés 34 Date d'inscription mardi 30 juin 2009 Statut Membre Dernière intervention 1 novembre 2010
7 oct. 2010 à 16:17
Oui mais c'est bien le but. Il ne doit pas être en position d'attente si il est en l'air par exemple ou si il cours

j'ai mis le hitTest dans la fonction lancée par un relaché d'une touche pour ne lancer la chute qu'au moment ou on appuis plus sur le saut et qu'il ne touche pas le sol.

je viens de tester le hitTest en dehors de ma fonction, le perso ne redescend plus du tout :x.

Vince.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ptitvincent Messages postés 34 Date d'inscription mardi 30 juin 2009 Statut Membre Dernière intervention 1 novembre 2010
7 oct. 2010 à 16:41
oui mais comment scénariser ma descente ? en faisant une variable dont j'augmente la valeur ou la diminue ?

à demain (si dieu le veut)

Vince.
0
ptitvincent Messages postés 34 Date d'inscription mardi 30 juin 2009 Statut Membre Dernière intervention 1 novembre 2010
7 oct. 2010 à 17:47
oui par exemple

addEventListener(Event.ENTER_FRAME, maFonctionDeHitTest);


?

cependant à la fin de l'animation de mon saut, il y a un stop (pour pas qu'elle se repete) ca risque de poser probleme non ?

La je ne suis plus à l'école, mais je test ca dès demain et je reviens faire un feedback ici de ce que ca a donné.

vince.
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
7 oct. 2010 à 18:01
Alors une fois que le personnage à touché le sol, il suffit d'enlever le listener, tout simplement.

Peg'
0
ptitvincent Messages postés 34 Date d'inscription mardi 30 juin 2009 Statut Membre Dernière intervention 1 novembre 2010
8 oct. 2010 à 12:41
Ok donc.


var keyDUP:Boolean=false; //Creation d'un boolean en false que je vais seter true apres avoir appuyé sur UP

stage.addEventListener(KeyboardEvent.KEY_DOWN, actions);
stage.addEventListener(KeyboardEvent.KEY_UP, stopin);
stage.addEventListener(Event.ENTER_FRAME, maFonctionDeHitTest);


function actions(e:KeyboardEvent) {
//-----DROITE
if (e.keyCode==Keyboard.RIGHT) {
foxAnim.gotoAndStop(2);

}
//-----HAUT
if (e.keyCode==Keyboard.UP) {
foxAnim.gotoAndStop(3);
if (foxAnim.y<=testee.y+99) {
foxAnim.y--;
keyDUP=true;  //Voila je le met en true et je le passe en false si je relache
} else {
stopstopstop();
}
}

}

function stopin(e:KeyboardEvent) {
stopstopstop();
keyDUP=false;  // ICI je relache donc = false
}

function stopstopstop() {
if (foxAnim.hitTestObject(testee)) {
keyDUP=false; // ICI idem pour tous les cas de figures ou j'appuis pas sur up ou que mon saut est fini
foxAnim.gotoAndPlay(1);
} else {
keyDUP=false; //IDEM
foxAnim.y=foxAnim.y+5;

}

}

function maFonctionDeHitTest(e:Event) {
if (!foxAnim.hitTestObject(testee) && !keyDUP) { //Si je touche pas "testee" et que j'appuis pas ou que mon saut est fini

stopstopstop(); //je lis ou relis ma fonction de chute
}
}



Donc la c'est nikel il retombe bien et toutiquanti. Par contre il reste bloqué sur la derniere frame de mon anim de saut >,< il faut que j'avance un coup pour qu'il se remette un etat "d'attente" Et la ca doit venir du stop(); de la frame en question non ?
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
8 oct. 2010 à 15:48
une fois qu'il touche le sol, il suffit de lui dire de réafficher la bonne étape d'animation .. tout bêtement.

Peg'
0
ptitvincent Messages postés 34 Date d'inscription mardi 30 juin 2009 Statut Membre Dernière intervention 1 novembre 2010
11 oct. 2010 à 09:24
oui je suis bête.. Par contre j'ai du ajouter un removeListener quand il touche le sol et un add quand j'appuis sur up, sinon ca rejouai en boucle la premier image de la dites animation (donnant l'impression de n'afficher qu'une seule image)

J'ai un soucis aussi au niveau du "saut" ; quand on appuis sur UP, il ne saute pas tout de suite, il lit l'anim, mais ne saute qu'une demi seconde apres. (comme si on restait appuyé sur une lettre du clavier "oooooooooooooooooo" la premier s'ecris et pour la suite il faut attendre)
Et c'est asser embêtant en matiere de gameplay.
0
Rejoignez-nous