Boucle while fais crash le jeu

alexp23 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   -  
alexp23 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, Je poste (encore) un post car j'ai un soucis: Je customise le jeu mario sokoban en java qui est fais dans pas mal de tuto. Je rencontre un soucis dans la méthode Move() de mario, normalement mario se déplace 34px par 34px et je veux qu'il bouge pixel par pixels grâce à une boucle et erreur, la fenêtre crash : (méthode juste pour la direction "bas")
public void Move(){
		if (MarioDir == "bas"){
			while (true){
			this.y += 1;
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {e.printStackTrace();}
			}
		}

Le code me parait plutôt bien pourtant ...

ps: quand j'enlève la boucle, il se déplace bien à 1 px à chaque fois que appuis sur "bas";

Merci de m'aider.


A voir également:

2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
MarioDir == "bas" 

Il ne faut pas comparer deux objets avec == mais avec la méthode equals.

Remarque, une fois que le bouton bas aura été détecté une fois, avec ta boucle while (true) Mario descendra toujours sans s'arrêter, même si le bouton bas est relâché, je pense que c'est une erreur.

public void Move()
{
    if (MarioDir.equals("bas"))
    {
        this.y += 1;
        
        try 
        {
            Thread.sleep(100);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}
0
alexp23 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   4
 
Merci mais le code que tu m'as donner donne le même résultat que :
             if (MarioDir == "bas"){
			this.x += 1;
		}

Sauf qu'il à 100 millis de décalage, ce code aussi le fais crash :
if (MarioDir == "bas"){
			while ((MarioDir == "bas")){
			this.y += 1;
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {e.printStackTrace();}
			}
		}

et même, il bouge même pas, il crash directe ...
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Déjà, arrête avec =="bas" c'est faux !
Le résultat peut être true dans un unique cas très particulier, mais en général l'égalité donnera false, quand bien même la valeur serait "bas" ... donc utilises .equals("bas")
0
alexp23 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   4
 
ok, je veux bien utilisé equals() mais le résultat est le même ... Dans tout les cas ce code fais complètement crash la fenêtré :
if (MarioDir.equals("bas")){
   while (MarioDir.equals("bas")){
   this.y += 1;
   try {
    Thread.sleep(100);
   } catch (InterruptedException e) {e.printStackTrace();}
   }
  }
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Il faudrait voir comment cette méthode s'insert dans le reste du code, mais j'ai l'impression que c'est du séquentiel, c'est à dire que tant que cela boucle, avec notamment le temps de pause, le reste du programme ne fait rien. Or normalement il faudrait gérer plusieurs threads de manière à ce que la fenêtre puisse au moins se rafraîchir régulièrement, or si ton programme est fait comme je le pense, la fenêtre ne pourra pas être redessinée avant la fin de tous les traitements et ça freeze. Mais ce n'est avec un petit morceau de code que je pourrais t'aider, c'est toute la gestion d'action qu'il faut revoir.
0
alexp23 Messages postés 88 Date d'inscription   Statut Membre Dernière intervention   4
 
D'accord merci, ça semble logique : je vais essayer de voir tout ça par moi même à tête reposé. Tout le code fais environ 1000 lignes, je vais t'épargner ça :)
Merci pour ton aide.
ps : Je dois fermer la fenêtre avec l'invité de commande tellement que ça frizze ...
0