[java] contact entre bouton pour un jeu mario

Bonjour, je fait actuellement un jeu de mario et je bug sur les déplacements. mon mario est un bouton (ainsi que tous les autres objets) et j'arrive a le déplacer correctement avec les flèches mais lorsque je crée des blocs (aussi des boutons crées a l'aide d'un tableau) et que je veux qu'il s'arrête s'il arrive a leur contact il commence a faire des sauts a travers mon écran... est-ce-que quelqu'un peut m'aider?
voila le bout de code qui plante (le programme complet fait 30 pages donc je vais pas le mettre en entier)


case KeyEvent.VK_LEFT:
		
for (i=0; i<bloc.length; i++)	
if ((marioX + w >= bX[i])    
   //bX[i] et marioX sont des coordonnées et w  et h les tailles du bouton mario

&!(marioX > bX[i] + wB)
&(marioY + h >= bY[i])
&!(marioY > bY[i] + hB))	
break;

else {						
if (marioX<1) //pour savoir s'il touche le bord gauche de l'écran
break;

else {

mario.setLocation(p.x-5, p.y);   //ce code-ci fonctionne très bien s'il est tout seul
marioX = mario.getX();
contact();
p = mario.getLocation();
marioDroite = false;
}

break;
								


1 réponse

  1. Modérateur
    On ne fait pas des conjonctions booléennes avec & mais avec &&
    De plus tes négations sont inutiles si tu échanges le sens de tes inégalités.

    if ((marioX + w >= bX[i]) && (marioX <= bX[i] + wB)
     && (marioY + h >= bY[i]) && (marioY <= bY[i] + hB))
        break;
    0
    1. ça ne change rien il continue a faire des sauts qu'il n'est pas sensé faire (si tu veux je peux t'envoyer mon programme par mail pour que tu voie de toi meme)
      0
    2. Modérateur
      Avec aussi peu d'information, il y avait peu de chance que ça corrige tout, mais il y a un autre problème que je n'avais pas vu tout à l'heure à cause de ton indentation inexistante, c'est l'imbrication de tes switch/for/if et l'utilisation de tes break... car il y a le break de la boucle for, et le break du switch.

      De plus, quand tu fais ce break, est-ce que c'est parce que tu as une erreur ?
      Parce que dans ce cas ce ne sont pas des ET qu'il te faut, mais des OU...

      case KeyEvent.VK_LEFT:
      
      for (i=0; i<bloc.length; i++)
      {
          if (marioX<1 || (marioX + w >= bX[i]) || (marioX <= bX[i] + wB) || (marioY + h >= bY[i]) || (marioY <= bY[i] + hB))
          {
              break; // le break du for
          }
          else
          {
              mario.setLocation(p.x-5, p.y);
              marioX = mario.getX();
              contact();
              p = mario.getLocation();
              marioDroite = false;
          }
      }
      
      break; // le break du switch
      0
    3. non je break si le bouton de mario entre en contact avec l'autre de maniere a ce qu'il ne se déplace plus. Comment est-ce-que je fais pour que le premier break soit aussi pour le switch?
      0
    4. Modérateur
      Ici ça ne sert pas à grand chose de faire un break direct du switch, car le break du for va te faire arriver sur ligne où il y a le break du switch, donc ça va revenir au même.

      Mais pour info, on peut mettre des étiquettes aux for, while et switch :

      s: switch(n)
         {
             case 1:
      f:         for (int i=0; i<5; i++)
                 {
                      break;    // par défaut, break du for
                      break f;  // break de "f", le for
                      break s;  // break de "s", le switch
                 }
         }
      0
    5. je peux t'envoyer mon programme comme ça tu peux tester toi meme?
      ça serait cool
      parceque la ça a rien changé
      0