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

ptitvincent 36 Messages postés mardi 30 juin 2009Date d'inscription 1 novembre 2010 Dernière intervention - 7 oct. 2010 à 15:58 - Dernière réponse : ptitvincent 36 Messages postés mardi 30 juin 2009Date d'inscription 1 novembre 2010 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
pegase31 6161 Messages postés dimanche 21 décembre 2003Date d'inscription 4 septembre 2013 Dernière intervention - 7 oct. 2010 à 16:21
3
Merci
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.

Merci pegase31 3

codes-sources a aidé 78 internautes ce mois-ci

Commenter la réponse de pegase31
Meilleure réponse
pegase31 6161 Messages postés dimanche 21 décembre 2003Date d'inscription 4 septembre 2013 Dernière intervention - 7 oct. 2010 à 16:46
3
Merci
non, en la testant réellement à chaque frame, par exemple.

Peg'

Merci pegase31 3

codes-sources a aidé 78 internautes ce mois-ci

Commenter la réponse de pegase31
pegase31 6161 Messages postés dimanche 21 décembre 2003Date d'inscription 4 septembre 2013 Dernière intervention - 7 oct. 2010 à 16:03
0
Merci
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'
Commenter la réponse de pegase31
ptitvincent 36 Messages postés mardi 30 juin 2009Date d'inscription 1 novembre 2010 Dernière intervention - 7 oct. 2010 à 16:17
0
Merci
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.
Commenter la réponse de ptitvincent
ptitvincent 36 Messages postés mardi 30 juin 2009Date d'inscription 1 novembre 2010 Dernière intervention - 7 oct. 2010 à 16:41
0
Merci
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.
Commenter la réponse de ptitvincent
ptitvincent 36 Messages postés mardi 30 juin 2009Date d'inscription 1 novembre 2010 Dernière intervention - 7 oct. 2010 à 17:47
0
Merci
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.
Commenter la réponse de ptitvincent
pegase31 6161 Messages postés dimanche 21 décembre 2003Date d'inscription 4 septembre 2013 Dernière intervention - 7 oct. 2010 à 18:01
0
Merci
Alors une fois que le personnage à touché le sol, il suffit d'enlever le listener, tout simplement.

Peg'
Commenter la réponse de pegase31
ptitvincent 36 Messages postés mardi 30 juin 2009Date d'inscription 1 novembre 2010 Dernière intervention - 8 oct. 2010 à 12:41
0
Merci
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 ?
Commenter la réponse de ptitvincent
pegase31 6161 Messages postés dimanche 21 décembre 2003Date d'inscription 4 septembre 2013 Dernière intervention - 8 oct. 2010 à 15:48
0
Merci
une fois qu'il touche le sol, il suffit de lui dire de réafficher la bonne étape d'animation .. tout bêtement.

Peg'
Commenter la réponse de pegase31
ptitvincent 36 Messages postés mardi 30 juin 2009Date d'inscription 1 novembre 2010 Dernière intervention - 11 oct. 2010 à 09:24
0
Merci
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.
Commenter la réponse de ptitvincent

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.