Problème avec isDown - Convertion AS2 -> AS3

cs_Parojo Messages postés 10 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 24 janvier 2010 - 23 janv. 2010 à 15:37
cs_Parojo Messages postés 10 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 24 janvier 2010 - 24 janv. 2010 à 13:42
Bonjour à tous,

Je suis sur le point d'apprendre à coder des jeux en AS3. Dans le cadre de cette instruction, je dois convertir un jeu (style Guitar Hero, en beaucoup plus simple) qui a été créé en ActionScript 2, de manière à ce qu'il soit entièrement en ActionScript 3.

Voici le code du jeu en AS2 :

// randRange(40, -200); renvoie un nombre entier aléatoire compris entre 40 et -200
function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomNum;
}
relache_haut = 0;
relache_bas = 0;
relache_gauche = 0;
relache_droite = 0;
decompteur_max = 9;
fleche_gauche._y fleche_bas._y fleche_haut._y = fleche_droite._y = 290;
fleche_gauche._x = 60;
fleche_bas._x = 120;
fleche_haut._x = 180;
fleche_droite._x = 240;
// On crée les flèches avec une coordonnées _y entre 40 et -200, soit au dessus de l'aire de jeu
fleche_gauche_move._y = randRange(40, -200);
fleche_bas_move._y = randRange(40, -200);
fleche_haut_move._y = randRange(40, -200);
fleche_droite_move._y = randRange(40, -200);
// on définit une vitesse de descente
vitesse = 3;
// on aligne les flèches qui descendent avec les flèches fixes en faisant correspondre les propriétés _x
fleche_gauche_move._x = fleche_gauche._x;
fleche_bas_move._x = fleche_bas._x;
fleche_haut_move._x = fleche_haut._x;
fleche_droite_move._x = fleche_droite._x;
score_total = 0;
grosse_marge = 30;
elimination = 0;
tape_haut = 0;
tape_bas = 0;
tape_gauche = 0;
tape_droite = 0;
onEnterFrame = function () {
/////////////////////////////////////
// ELMINATION
/////////////////////////////////////
if (elimination > 0) {
etoile_4._visible = false;
if (elimination > 1) {
etoile_3._visible = false;
if (elimination > 2) {
etoile_2._visible = false;
}
}
}
if (elimination > 3) {
trace("Fin du jeu : joueur éliminé");
gotoAndStop(2);
etoile_1._visible = false;
elimination = -100;
}
if (relache_haut > 0) {
relache_haut -= 1;
}
if (Key.isDown(Key.UP) && relache_haut == 0 && elimination >= 0) {
distance_haut = (fleche_haut_move._y) - (fleche_haut._y);
relache_haut = decompteur_max;
if (Math.abs(distance_haut) < grosse_marge) {
score_total += 100 * Math.round(grosse_marge - (Math.abs(fleche_haut_move._y - fleche_haut._y)));
} else if (elimination < 4) {
elimination += 1;
}
tape_haut = 1;
}
// Si la fleche a atteint le bas de l'ecran
// et si aucun appui sur la touche
if (fleche_haut_move._y > 350) {
fleche_haut_move._y = randRange(40, -200);
// Si pas d'appui dans la zone OK
if (tape_haut != 1) {
elimination += 1;
tape_haut = 0;
}
tape_haut = 0;
}
if (relache_droite > 0) {
relache_droite -= 1;
}
if (Key.isDown(Key.LEFT) && relache_gauche == 0 && elimination >= 0) {
distance_gauche = (fleche_gauche_move._y) - (fleche_gauche._y);
relache_gauche = decompteur_max;
if (Math.abs(distance_gauche) < grosse_marge) {
score_total += 100 * Math.round(grosse_marge - (Math.abs(fleche_gauche_move._y - fleche_gauche._y)));
} else if (elimination < 4) {
elimination += 1;
}
tape_gauche = 1;
}
// Si la fleche a atteint le bas de l'ecran
// et si aucun appui sur la touche
if (fleche_gauche_move._y > 350) {
fleche_gauche_move._y = randRange(40, -200);
// Si pas d'appui dans la zone OK
if (tape_gauche != 1) {
elimination += 1;
tape_gauche = 0;
}
tape_gauche = 0;
}
if (relache_gauche > 0) {
relache_gauche -= 1;
}
if (Key.isDown(Key.RIGHT) && relache_droite == 0 && elimination >= 0) {
distance_droite = (fleche_droite_move._y) - (fleche_droite._y);
relache_droite = decompteur_max;
if (Math.abs(distance_droite) < grosse_marge) {
score_total += 100 * Math.round(grosse_marge - (Math.abs(fleche_droite_move._y - fleche_droite._y)));
} else if (elimination < 4) {
elimination += 1;
}
tape_droite = 1;
}
// Si la fleche a atteint le bas de l'ecran
// et si aucun appui sur la touche
if (fleche_droite_move._y > 350) {
fleche_droite_move._y = randRange(40, -200);
// Si pas d'appui dans la zone OK
if (tape_droite != 1) {
elimination += 1;
tape_droite = 0;
}
tape_droite = 0;
}
if (relache_bas > 0) {
relache_bas -= 1;
}
if (Key.isDown(Key.DOWN) && relache_bas == 0 && elimination >= 0) {
distance_bas = (fleche_bas_move._y) - (fleche_bas._y);
relache_bas = decompteur_max;
if (Math.abs(distance_bas) < grosse_marge) {
score_total += 100 * Math.round(grosse_marge - (Math.abs(fleche_bas_move._y - fleche_bas._y)));
} else if (elimination < 4) {
elimination += 1;
}
tape_bas = 1;
}
// Si la fleche a atteint le bas de l'ecran
// et si aucun appui sur la touche
if (fleche_bas_move._y > 350) {
fleche_bas_move._y = randRange(40, -200);
// Si pas d'appui dans la zone OK
if (tape_bas != 1) {
elimination += 1;
tape_bas = 0;
}
tape_bas = 0;
}
// on fait bouger les flèches en incrémentant la propriété _y de chaque instance
fleche_haut_move._y += vitesse;
fleche_bas_move._y += vitesse;
fleche_droite_move._y += vitesse;
fleche_gauche_move._y += vitesse;
};


Manuellement, j'ai modifié ce que je pensais être à modifier, de manière à ce que le nouveau code soit celui-ci :

// randRange(40, -200); renvoie un nombre entier aléatoire compris entre 40 et -200
function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
return randomNum;
}
var relache_haut = 0;
var relache_bas = 0;
var relache_gauche = 0;
var relache_droite = 0;
var decompteur_max = 9;
var distance_haut;
var distance_gauche;
var distance_droite;
var distance_bas;
fleche_gauche.y fleche_bas.y fleche_haut.y = fleche_droite.y = 290;
fleche_gauche.x = 60;
fleche_bas.x = 120;
fleche_haut.x = 180;
fleche_droite.x = 240;
// On crée les flèches avec une coordonnées y entre 40 et -200, soit au dessus de l'aire de jeu
fleche_gauche_move.y = randRange(40, -200);
fleche_bas_move.y = randRange(40, -200);
fleche_haut_move.y = randRange(40, -200);
fleche_droite_move.y = randRange(40, -200);
// on définit une vitesse de descente
var vitesse = 6;
// on aligne les flèches qui descendent avec les flèches fixes en faisant correspondre les propriétés x
fleche_gauche_move.x = fleche_gauche.x;
fleche_bas_move.x = fleche_bas.x;
fleche_haut_move.x = fleche_haut.x;
fleche_droite_move.x = fleche_droite.x;
var score_total = 0;
var grosse_marge = 30;
var elimination = 0;
var tape_haut = 0;
var tape_bas = 0;
var tape_gauche = 0;
var tape_droite = 0;
addEventListener(Event.ENTER_FRAME,Elimination);
function Elimination(event:Event):void {
/////////////////////////////////////
// ELMINATION
/////////////////////////////////////
if (elimination > 0) {
etoile_4.visible = false;
if (elimination > 1) {
etoile_3.visible = false;
if (elimination > 2) {
etoile_2.visible = false;
}
}
}
if (elimination > 3) {
trace("Fin du jeu : joueur éliminé");
gotoAndStop(2);
etoile_1.visible = false;
elimination = -100;
}
if (relache_haut > 0) {
relache_haut -= 1;
}
if (Keyboard.isDown(Keyboard.UP) && relache_haut == 0 && elimination >= 0) {
distance_haut = (fleche_haut_move.y) - (fleche_haut.y);
relache_haut = decompteur_max;
if (Math.abs(distance_haut) < grosse_marge) {
score_total += 100 * Math.round(grosse_marge - (Math.abs(fleche_haut_move.y - fleche_haut.y)));
} else if (elimination < 4) {
elimination += 1;
}
tape_haut = 1;
}
// Si la fleche a atteint le bas de l'ecran
// et si aucun appui sur la touche
if (fleche_haut_move.y > 350) {
fleche_haut_move.y = randRange(40, -200);
// Si pas d'appui dans la zone OK
if (tape_haut != 1) {
elimination += 1;
tape_haut = 0;
}
tape_haut = 0;
}
if (relache_droite > 0) {
relache_droite -= 1;
}
if (Keyboard.isDown(Keyboard.LEFT) && relache_gauche == 0 && elimination >= 0) {
distance_gauche = (fleche_gauche_move.y) - (fleche_gauche.y);
relache_gauche = decompteur_max;
if (Math.abs(distance_gauche) < grosse_marge) {
score_total += 100 * Math.round(grosse_marge - (Math.abs(fleche_gauche_move.y - fleche_gauche.y)));
} else if (elimination < 4) {
elimination += 1;
}
tape_gauche = 1;
}
// Si la fleche a atteint le bas de l'ecran
// et si aucun appui sur la touche
if (fleche_gauche_move.y > 350) {
fleche_gauche_move.y = randRange(40, -200);
// Si pas d'appui dans la zone OK
if (tape_gauche != 1) {
elimination += 1;
tape_gauche = 0;
}
tape_gauche = 0;
}
if (relache_gauche > 0) {
relache_gauche -= 1;
}
if (Keyboard.isDown(Keyboard.RIGHT) && relache_droite == 0 && elimination >= 0) {
distance_droite = (fleche_droite_move.y) - (fleche_droite.y);
relache_droite = decompteur_max;
if (Math.abs(distance_droite) < grosse_marge) {
score_total += 100 * Math.round(grosse_marge - (Math.abs(fleche_droite_move.y - fleche_droite.y)));
} else if (elimination < 4) {
elimination += 1;
}
tape_droite = 1;
}
// Si la fleche a atteint le bas de l'ecran
// et si aucun appui sur la touche
if (fleche_droite_move.y > 350) {
fleche_droite_move.y = randRange(40, -200);
// Si pas d'appui dans la zone OK
if (tape_droite != 1) {
elimination += 1;
tape_droite = 0;
}
tape_droite = 0;
}
if (relache_bas > 0) {
relache_bas -= 1;
}
if (Keyboard.isDown(Keyboard.DOWN) && relache_bas == 0 && elimination >= 0) {
distance_bas = (fleche_bas_move.y) - (fleche_bas.y);
relache_bas = decompteur_max;
if (Math.abs(distance_bas) < grosse_marge) {
score_total += 100 * Math.round(grosse_marge - (Math.abs(fleche_bas_move.y - fleche_bas.y)));
} else if (elimination < 4) {
elimination += 1;
}
tape_bas = 1;
}
// Si la fleche a atteint le bas de l'ecran
// et si aucun appui sur la touche
if (fleche_bas_move.y > 350) {
fleche_bas_move.y = randRange(40, -200);
// Si pas d'appui dans la zone OK
if (tape_bas != 1) {
elimination += 1;
tape_bas = 0;
}
tape_bas = 0;
}
// on fait bouger les flèches en incrémentant la propriété y de chaque instance
fleche_haut_move.y += vitesse;
fleche_bas_move.y += vitesse;
fleche_droite_move.y += vitesse;
fleche_gauche_move.y += vitesse;
};


Hélas, un problème persiste : je n'arrive pas à utiliser la version AS3 des isDown. J'ai pourtant essayé les différentes explications du web à ce sujet (booléens etc.) et même des packages permettant de les utiliser, mais rien n'y fait.

Pouvez-vous m'éclairer sur la façon de s'y prendre ?
N'hésitez pas non plus à commenter toute autre modification que j'aie effectuée...

Merci d'avance pour toute réponse !

8 réponses

mzelleflash Messages postés 48 Date d'inscription mercredi 29 avril 2009 Statut Membre Dernière intervention 1 novembre 2011
23 janv. 2010 à 16:38
Salut!
Je n'ai pas lu tout ton code en détail (il faut dire qu'il y en a une bonne tartine!), mais tu devrais essayer de chercher du côté des écouteurs d'événements, du genre:

stage.addEventListener(KeyboardEvent.KEY_DOWN, mafonction);

cela détecte qu'une touche du clavier est pressée.

Ensuite, si par exemple tu veux une certaine action quand c'est la fleche droite qui est appuyée, tu fais quelque chose qui ressemble à ça:

function mafonction (evt:KeyboardEvent){
        if(Keyboard.RIGHT){
            ton action;
        }
}


Voilà, j'espère avoir pu t'aider

M'zelle Flash.
0
cs_Parojo Messages postés 10 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 24 janvier 2010
23 janv. 2010 à 18:15
Merci pour ton aide. En fait, comme il s'agit d'un genre de Guitar Hero, la détection des touches up, down, left and right devient très rapidement vrai ou faux. Si j'ajoute :

var Touche_Haut = 0;

function DetectionHaut (evt:KeyboardEvent){
if(Keyboard.UP){
Touche_Haut = 1;
}
}


Je suppose que Touche_Haut vaudra 1 pour toujours à partir du moment où l'utilisateur appuie sur la touche up au moins une fois ?
0
cs_Parojo Messages postés 10 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 24 janvier 2010
23 janv. 2010 à 19:48
Parfait, je viens finalement de répondre à ma propre question puisqu'il suffisait de remplacer les "Keyboard.isDown(Keyboard.RIGHT)" par "Keyboard.DOWN".

Merci beaucoup Mzelle Flash !

C'était moins compliqué que ce que j'avais lu partout mais sans ton aide je ne serais arrivé à rien :) .
0
mzelleflash Messages postés 48 Date d'inscription mercredi 29 avril 2009 Statut Membre Dernière intervention 1 novembre 2011
23 janv. 2010 à 19:57
Tu peux aussi mettre un écouteur d'événement lorsque la touche est relâchée, pour mettre Touche_Haut à 0.

stage.addEventListener(KeyboardEvent.KEY_UP, mafonction2);

function mafonction2(evt:KeyboardEvent){
         if(Keyboard.UP){
            Touche_Haut=0;
         }


Je te donne un petit exemple que je viens de coder et qui marche très bien pour que tu visualises mieux:
var txt:TextField= new TextField();
txt.text="AA";
txt.x=stage.stageWidth/2;
txt.y=stage.stageHeight/2;
addChild(txt);

stage.addEventListener(KeyboardEvent.KEY_DOWN, mafonction);
function mafonction (evt:KeyboardEvent){
        if(Keyboard.RIGHT){
            txt.text="BB";
        }
stage.removeEventListener(KeyboardEvent.KEY_UP, mafonction);
stage.addEventListener(KeyboardEvent.KEY_UP, mafonction2);
}


function mafonction2 (evt:KeyboardEvent){
        if(Keyboard.UP){
            txt.text="AA";
        }
stage.removeEventListener(KeyboardEvent.KEY_UP, mafonction2);
stage.addEventListener(KeyboardEvent.KEY_UP, mafonction);
}


Quand tu maintiens enfoncée la flèche directionnelle droite sur ton clavier, le texte affiché est BB, et si tu relâches la flèche, il revient à AA.

Voilà ^^
Bonne soirée,

M'zelle Flash.
0

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

Posez votre question
cs_Parojo Messages postés 10 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 24 janvier 2010
23 janv. 2010 à 20:17
Un autre problème : Les messages suivant empêchent mon flash de s'exécuter correctement, mais je ne comprends pas tout à fait la nature du problème :

WARNING: Text field variable names are not supported in ActionScript 3.0. The variable 'score_total' used for an unnamed text field will not be exported.
WARNING: Text field variable names are not supported in ActionScript 3.0. The variable 'score_total' used for an unnamed text field will not be exported.
WARNING: Actions on button or MovieClip instances are not supported in ActionScript 3.0. All scripts on object instances will be ignored.
Fin du jeu : joueur éliminé
0
mzelleflash Messages postés 48 Date d'inscription mercredi 29 avril 2009 Statut Membre Dernière intervention 1 novembre 2011
23 janv. 2010 à 20:39
Tu as un texte dont le nom de variable est "score_total", or l'AS3 ne gère plus cela.
Et apparemment tu as aussi un clip ou un bouton sur lequel tu as mis une "Action-Clip" ou une "Action-Bouton", ce qui n'existe plus non plus en AS3. Il faut tout mettre en "Action-Image".

Bonne chance avec ton adaptation

M'zelle Flash.
0
cs_Parojo Messages postés 10 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 24 janvier 2010
24 janv. 2010 à 00:16
Merci beaucoup pour ton aide, ça m'aide vraiment à bien comprendre les différences et les types d'adaptation entre AS2 et AS3 !

J'avoue que j'ai du mal à comprendre pourquoi l'AS3 ne gère plus le nom de la variable, et surtout comment il faut adapter cela... O_o

Pour les Action Button, j'étais certain d'en avoir essayé en AS3 :s . Quelle est la différence ? Merci d'avance, encore, pour vos (et surtout tes, Mzelle Flash) réponses !!
0
cs_Parojo Messages postés 10 Date d'inscription vendredi 24 mars 2006 Statut Membre Dernière intervention 24 janvier 2010
24 janv. 2010 à 13:42
J'ai posté la suite de ma conversion sur un autre sujet de manière à ce que le titre soit plus précis : ici.
0
Rejoignez-nous