Thread : problème incompréhensible
Bonjour.
Je me suis lancé dans la création d un petit casse brique.
Dans celui ci, j'utilise une classe extends Thread pour gerer les deplacement de la balle.
la voici :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
package model;
import sun.audio.AudioPlayer;
import main.Principale;
import music.Musicothèque;
public class Launch extends Thread {
private static int X;
private static int Y;
public static boolean stop;
public static String name;
public Launch()
{
//lancement de la balle par defaut :
X=2;
Y=-1;
stop=false;
}
public void run() {
Plateau.b.caught=false;
while(!stop) {
try {
Thread.sleep(2*Math.abs(X)+1,5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//collision plateau
if(Plateau.b.getCoordonnee().getX()<=0)
X=-X;
if(Plateau.b.getCoordonnee().getX()>=500-Plateau.b.getSize())
X=-X;
if(Plateau.b.getCoordonnee().getY()<=0)
Y=-Y;
if(Plateau.b.getCoordonnee().getY()>=610-Plateau.b.getSize()) //perdu !
Principale.lose();
//collision paddle (si la balle n est pas caught
if(!Plateau.b.caught)
{if(Plateau.b.getCoordonnee().getY()+Plateau.b.getSize()==Plateau.v.getCoordonnees().getY()&&Plateau.b.getCoordonnee().getX()+Plateau.b.getSize()>=Plateau.v.getCoordonnees().getX() &&Plateau.b.getCoordonnee().getX()-Plateau.b.getSize()<=Plateau.v.getCoordonnees().getX()+Plateau.v.getWidth() )
{Y=-Y; ;
Musicothèque.paddle();
if(Plateau.b.getCoordonnee().getX()>Plateau.v.getCoordonnees().getX()+Plateau.v.getWidth()/2)
{if(X==-1) X=1;else X=X+1;}
else
{ if(X==1) X=-1;else X=X-1;}
}
}
//collison brique:
for(int cpt=0;cpt<Plateau.Blist.size();cpt++)
{
int test=Plateau.Blist.get(cpt).touch();
if( test != -1)
{Principale.p.destruction(cpt);
Musicothèque.brick();
Plateau.pl.setScore(Plateau.pl.getScore()+5);
if (Plateau.Blist.size()==0){
Principale.p.setClear(true);
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//lancement du niveau suivant:
Principale.next();
}
if(test==0)
{
X=-X;
}
else Y=-Y;
}
}
System.out.println(name);
//deplacement
Plateau.b.setCoordonnee(new Coor(Plateau.b.getCoordonnee().getX()+X,Plateau.b.getCoordonnee().getY()+Y));
}
}
} |
Je ne sais pas si la montré dans son integralité sert à quelque chose...
Bref
lors du premier niveau je crée une nouvelle instance de Launch que je stock dans une variable static de la classe Plateau (contenant la globalité des element du jeu).
Je lance le Thread ainsi lors d un clique gauche:
Code:
1 2
| if(!Plateau.l.isAlive())
Plateau.l.start(); |
Tout fonctionne Parfaitement.
Quand le joueur perd une vie : je stoppe le thread et j en crée un autre qui devrait logiquement etre lancé avec le clique gauche de la meme maniere
Code:
1 2
| Plateau.l.stop=true;
Plateau.l=new Launch(); |
mais la survient l erreur ! ce nouveau thread se lance tout seul ! deplus, la variable Plateau.b.caught est à true, alors qu avant la boucle principale de la methode run, on la met à false .
J ai d'abord pensé que l ancien thread continué son execution ... car le code avant le while ne s execute pas, Mais pas du tout !!!
en ajoutant une variable name à la classe launch et en lui assignant des valeurs differentes pour differencier les thread lors de l execution, je m appercois que c est celui tout juste crée : Plateau.l=new Launch();
qui s est lancé ! alors qu a aucun moment je n utilise Plateau.l.start();
Voila voila, j ai essayé d expliquer mon problème le plus clairement possible.
Si vous lisez ces derniers mots j applaudis votre courage.
En attente d'une solution à ce casse tête.
Bien à vous et merci !