Boucle while fais crash le jeu

Fermé
alexp23 Messages postés 88 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 15 avril 2014 - 23 févr. 2014 à 18:10
alexp23 Messages postés 88 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 15 avril 2014 - 23 févr. 2014 à 19:05
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 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
23 févr. 2014 à 18:27
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 15 avril 2014 4
23 févr. 2014 à 18:36
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 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
Modifié par KX le 23/02/2014 à 18:47
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 15 avril 2014 4
Modifié par alexp23 le 23/02/2014 à 18:55
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 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
23 févr. 2014 à 18:58
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 15 avril 2014 4
23 févr. 2014 à 19:05
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