Problème d'execution au sein d'un switch

shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013 - 12 juil. 2013 à 16:07
 4u4me4us - 15 août 2013 à 15:38
Bonjour,

Dans le cadre de la réalisation d'un tutoriel et code sur la création de jeux en HTML5, je suis actuellement en train de bloquer sur un truc relativement bête sur lequel je n'arrive pas a comprendre l'issue. J'aimerai avoir un oeil extérieur sur le problème parce que je n'avance pas...

Je m'explique: j'ai une routine qui s’exécute très régulièrement (une fois par frame) et qui entre autre utilise les interactions claviers pour faire des actions (mouvements du joueur, afficher un menu...) J'ai fait en sorte de traiter les touches appuyés avec keydown / keyup et les rajouter / enlever dans un tableau (ici gamer.vcode).

Je fais alors un switch dans une boucle for qui va, ceci pour chaque touche actuellement dans la pile, effectuer une action. Cependant (après vérification), même si la pile se remplit et se vide correctement on dirai que seule la première touche appuyée dans la pile est gérée et que le reste passe a la trappe -_-

Cas concret: déplacez le personnage et tout en faisant cela appuyez sur "D" pour avoir l'affichage des FPS (en haut a droite de l'écran), impossible alors qu'individuellement pas de soucis, dans l'autre sens en appuyant sur "D" puis les touches de mouvement, le mode débug s'affiche mais le personnage ne bouge pas...

Contenu de la routine complète:
function tick(){
// time before toggle debug
if(debugWaitTime > 0 && debugWaitTime != 10){
debugWaitTime--;
}else{
debugWaitTime = 10;
}

showCurrentFPS();
gamer.tick();
gamepad.tick();

// AI tick
for(i = 0; i < monstersList.length; i++){
var monster = monstersList[i];
monster.displayNodes();
monster.tick();
}

//keyboard event
for(i = 0; i < gamer.vcode.length; i++){
var vx = 0;
var vy = 0;
switch(gamer.vcode[i]){
case gamer.KEY_LEFT:
vx += gamer.velocity;
break;

case gamer.KEY_RIGHT:
vx -= gamer.velocity;
break;

case gamer.KEY_DOWN:
vy -= gamer.velocity;
break;

case gamer.KEY_UP:
vy += gamer.velocity;
break;

case gamer.KEY_D:
if(debugWaitTime == 10){ 
debugWaitTime--;
toggleDebug();
}
break;
}

// collisions & movement
var collision = 0;
var level = 0;
for(i = 0; i < stage.getNumChildren(); i++){
var obj = stage.getChildAt(i);

if(obj.name "ground" || obj.name "model"){
if(obj.canMove == false && gamer.x >= obj.x + vx && gamer.x <= obj.x + vx + obj.image.width && gamer.y + 8 >= obj.y  + vy && gamer.y <= obj.y + vy + obj.image.height){
collision++;
}
}			
if(obj.goToLevel !0 && obj.name "ground"){
if(gamer.x >= obj.x + vx && gamer.x <= obj.x + vx + obj.image.width && gamer.y + 8 >= obj.y  + vy && gamer.y <= obj.y + vy + obj.image.height){
level = obj.goToLevel;
}
}
}

// if no collision => player move / loading new level
if(collision == 0){
if(level != 0){
changeLevel(level);
}else{		
for(i = 0; i < stage.getNumChildren(); i++){
var obj = stage.getChildAt(i);
if(obj.name != "Player" && obj.name != "gamepad" && obj.name != "UI"){
obj.x += vx;
obj.y += vy;
}
}
}
}
stage.update();
}


Lien vers le code source complet (actuellement en cours de dev, quelques bugs sont encore présents):
http://www.codeyourweb.org/test/gameLeveling.zip

Exemple hébergé en ligne:
http://www.codeyourweb.org/test/gameLeveling

Merci d'avance a ceux qui auront le courage d'éplucher le code et de proposer une solution car les lignes commencent a s'accumuler sérieusement ^^.


Mon blog technique: [www.codeyourweb.org www.codeyourweb.org]
HTML5 / CSS3 / JS - Intégration des technologies du web a destination des nouvelles plateformes et nouveaux usages d'internet

2 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
Modifié par f0xi le 4/08/2013 à 03:51
pour la gestion du clavier il faut des IF


SI gauche ALORS x++
OU SI droite ALORS x--

SI haut ALORS y++
OU SI bas ALORS y--

SI espace ALORS jump()
OU SI ctrl ALORS crouch()


ce qui permet d'aller en diagonale ou de sauter ou s'accroupir pendant une direction.
avec un switch, seul la première action sera éxécutée et c'est comme ça qu'on se retrouve avec un hero qui semble n'avoir qu'un seul neurone dans le cortex moteur.


//keyboard event
var vx = 0;
var vy = 0;
var vl = gamer.velocity;

for(i = 0; i < gamer.vcode.length; i++){
  var cd = gamer.vcode[i];

  vx = cd==gamer.KEY_LEFT ? vx+vl : (cd==gamer.KEY_RIGHT ? vx-vl : vx);
  vy = cd==gamer.KEY_UP   ? vy+vl : (cd==gamer.KEY_DOWN  ? vy-vl : vl);

  if(cd==gamer.KEY_D){
    if(debugWaitTime == 10){
      debugWaitTime--;
      toggleDebug();
    }
  }
}


________________________________________________________
[ besoin de câbles audio, vidèo, informatique pas cher ?]
0
Je pense que le problème vient du fait que var vx = 0; var vy = 0; à chaque entrée dans la boucle for.

Donc, celons moi, tu presse sur la flèche gauche vx s'incrémente, mais dès que tu presse sur le d, vx va dans un premier temps s'incrémenté puis revenir à zéro.

Pour savoir si j'ai raison fais ceci, presse sur la flèche gauche tout devrais fonctionné.

Puis presse la touche d là problème.

Puis relâche la touche d sans relâcher la touche de gauche et là si j'ai raison le programme devrais reprendre comme ci de rien était.

Si t'elle est le cas il faudrait gérer la mise à zéro de vx ou vy avec un if ou autre.
0
Rejoignez-nous