j'ai débuter à répondre à quelqu'un qui avait des problème sur c'était quoi un thread, donc après avoir écris, j'ai décider de faire un tutorial avec ma réponse pour que ça soit plus facile à trouver au autre persone qui se pose des questions
le nom français d'un thread, c'est un procédure. Donc, c'est du code qui s'exécute en même temps que le restant du code.
par exemple, mon jeux de shooting (qui en utilise, donc si tu veux un exemple, va le voir)
j'ai un tableau avec des personnages qui cours et des astériode qui se déplace. chaque personnage et chaque astéroide sont des thread différents. comme ça, en même temps qu,il déplace un personnage, il calcul un autre personnage.
si tu voudrais pas utiliser les thread, ça serait extrêment lent, puisque chaque déplacement de personnage serait un après l'autre.
la façon la plus simple de créer un thread, c'est d'implementer Runnabled (tu peut extend thread, sauf que java supporte un seul extend, donc si tu fais extend jlabel, pour déplacer un label, ben tu peux pas, puisque tu te ramasse avec 2 extends). Donc implement Runnabled. Ensuite tu fais ton constructeur. Puis tu dois faire une méthode run. le run ça sera le code qui s'exécutera en même en temps que le restant du code. Tu peut créer ta variable et quand tu voudra démarrarer le thread, tu devra lui faire un start();
tant et aussi longtemps que tu sort pas du run, tu vas bouclé (rajouter un sleep pour pas que ça aille trop vite). Moi, ce que je fais, je prend le temps en mili-seconde au début de la boucle, je fais 100% des calcul, puis je fait mon sleep - (le temps en mili-seconde + le temps en mili-seconde du début de la boucle) Comme ça, même si le code s'effectue plus lentement que prévu, il attendra tout simplement moins longtemps rendu au sleep et visuellement tu verras aucune différence
Voici une class de mon projet jeux de shooting qui utilise un thread pour déplacer un JLabel. Attention, c,est seulement une class, donc elle marche pas si elle a pas le restant du projet.
Source / Exemple :
import java.awt.event.MouseEvent;
import javax.swing.JLabel;
/************************************************************
- <p>Title: EarthWorm Jim</p> *
- <p>Description: TP3 pour le cour de Java Graphique</p> *
- <p>Copyright: Copyright (c) 2003</p> *
- @author Maxime Savard *
- @version 1.0 *
/************************************************************
- Nom de la Classe : Déplacement *
- Description : déplace des labels *
- extends : JLabel *
- implements : MémoireTemp et Runnable *
- utilise : voir Personnage ou asteroid *
public abstract class Déplacement
extends JLabel
implements Runnable, MémoireTemp {
InterfaceJeu frame;
private int yd, yf, xd, xf; //valeur méthématique X et Y
private double equation; //pente
private double c; //C de la pente
private boolean mort = false; //s'il est mort
private double Vitesse; //sa vitesse
private boolean finDansEcran = false; //s'il fini dans l'écran
//sa distance de déplacement
private int distanceLongueur;
private int distanceHauteur;
private int sizeTempHeight;
private int sizeTempWidth;
//sa direction
public boolean droite;
public boolean haut;
//savoir s'il est fini
public boolean fin = false;
public boolean gagner = false;
public Déplacement() {}
public void DéplacementInit() {
MathEquation(); //son équiation mathématique
MathVitesse(); //sa vitesse
setImage(); //son image
this.addMouseListener(new this_mouseAdapter(this));
this.setBounds(xd, yd, this.getIcon().getIconWidth(),
this.getIcon().getIconHeight());
}
public void run() {
long time;
int y;
boolean sortirEcran = false;
while (!fin) {
time = System.currentTimeMillis(); //connaitre le temps présent
if (fini()) { //si c'est fini
victoire(); //afficher sa victoire
this.setVisible(false); //terminer
this.setIcon(null);
fin = true;
}
else if (mort) { //s'il est mort
Mort(); //afficher sa mort
this.setVisible(false); //terminer
this.setIcon(null);
fin = true;
}
else {
déplacer(time); //déplacer
}
}
}
/****************************************************************************
- nom : this_mouseClicked
- commentaire : image cliquer
- recoi : la sourie
- renvoi : rien
void this_mouseClicked(MouseEvent e) {
mort = true;
}
/****************************************************************************
- nom : fini
- commentaire : savoir si c'est fini
- recoi : rien
- renvoi : victoire ou non de l'objet
private boolean fini() {
boolean bDroite = false;
boolean bHaut = false;
gagner = frame.getFini();
if (!gagner) { //si un personnage a gagner
if (droite) { //s'il va a droite
if (xd >= xf) { //si a fini
bDroite = true;
}
} //a gauche
else {
if (xd <= xf) { //s'il a fini
bDroite = true;
}
}
if (haut) { // en haut
if (yd <= yf) { //s'il a fini
bHaut = true;
}
}
else { //en bas
if (yd >= yf) { //s'il a fini
bHaut = true;
}
}
}
//si horizontale et verticale est fini ou si un autre personnage a fini
return bDroite && bHaut || gagner;
}
/****************************************************************************
- nom : déplacer
- commentaire : déaplcer l'objet
- recoi : temp
- renvoi : rien
private void déplacer(long time) {
//si la distance est plus grand horizontale
if (distanceLongueur > Mémoire.JFrameLargeur / 2) {
if (droite) {//s'il va a droite
xd += getDéplacement();
}
else { //a gauche
xd -= getDéplacement();
}
yd = (int) (equation * xd + c); //faire la formule math
try { //attendre le temps détermier - le temps des calculs
Thread.currentThread().sleep( (long) Vitesse -
(System.currentTimeMillis() - time));
}
catch (Exception e) {}
//déplacer
this.setLocation(xd, yd);
}//si la distance horizontale est plus petit que la moitié de la fenêtre
else {
if (haut) {//s'il va vers le haut
yd -= getDéplacement();
}
else {//vers le bas
yd += getDéplacement();
}
//formule math
xd = (int) ( (yd - c) / equation);
try { //attendre le temps détermier - le temps des calculs
Thread.currentThread().sleep( (long) Vitesse -
(System.currentTimeMillis() - time));
}
catch (Exception e) {}
//déplacer
this.setLocation(xd, yd);
}
}
/****************************************************************************
- nom : MathVitesse
- commentaire : déterminer la vitesse de déplacement
- recoi : rien
- renvoi : rien
private void MathVitesse() {
//vitesse aléatoire
double vitesseAléatoire = (Math.random() * Mémoire.PartieVariationVitesse *
2) - Mémoire.PartieVariationVitesse;
//si la distance est plus grand horizontale
if (distanceLongueur > Mémoire.JFrameLargeur / 2) {
Vitesse *= (double) Mémoire.JFrameLargeur / (double) distanceLongueur;
}
else {//si la distance est petite grand horizontale
Vitesse *= (double) Mémoire.JFrameHauteur / (double) distanceHauteur;
}
//ajouter la valeur aléatoire
Vitesse += (double) (vitesseAléatoire / 100) * (double) Vitesse;
//modifier la vitesse dépendant du niveau
Vitesse -= frame.getNiveau() * 2;
}
/****************************************************************************
- nom : MathEquation
- commentaire : déterminer la formmule Mathématique
- recoi : rien
- renvoi : rien
private void MathEquation() {
int debut = (int) (Math.random() * 4); //trouver l'endroi de départ
int fin;
switch (debut) { //part à gauche
case 0:
xd = 0 - Mémoire.PartieDistanceBuffer;
yd = (int) ( (Math.random() *
(Mémoire.JFrameHauteur - (Mémoire.PartiePasApparition * 2))) +
Mémoire.PartiePasApparition);
break;
case 1: //part en haut
yd = 0 - Mémoire.PartieDistanceBuffer;
xd = (int) ( (Math.random() *
(Mémoire.JFrameLargeur - (Mémoire.PartiePasApparition * 2))) +
Mémoire.PartiePasApparition);
break;
case 2: //part à droite
xd = Mémoire.JFrameHauteur + Mémoire.PartieDistanceBuffer;
yd = (int) ( (Math.random() *
(Mémoire.JFrameHauteur - (Mémoire.PartiePasApparition * 2))) +
Mémoire.PartiePasApparition);
break;
case 3: //part en bas
yd = Mémoire.JFrameLargeur + Mémoire.PartieDistanceBuffer;
xd = (int) ( (Math.random() *
(Mémoire.JFrameLargeur - (Mémoire.PartiePasApparition * 2))) +
Mémoire.PartiePasApparition);
break;
}
fin = (int) (Math.random() * 3); //trouver l'endroi de la fin
//pour pas que le départ se situe au même endroit que le départ
if (fin >= debut) {
++fin;
}
switch (fin) {
case 0: //a gauche
if (finDansEcran) {
xf = Mémoire.PartieDistanceFin;
}
else {
xf = 0 - (Mémoire.PartieDistanceFin + sizeTempWidth);
}
yf = (int) ( (Math.random() *
(Mémoire.JFrameHauteur - (Mémoire.PartiePasApparition * 2))) +
Mémoire.PartiePasApparition);
break;
case 1: //en haut
if (finDansEcran) {
yf = Mémoire.PartieDistanceFin;
}
else {
yf = 0 - (Mémoire.PartieDistanceFin + sizeTempHeight);
}
xf = (int) ( (Math.random() *
(Mémoire.JFrameLargeur - (Mémoire.PartiePasApparition * 2))) +
Mémoire.PartiePasApparition);
break;
case 2: //a droite
if (finDansEcran) {
xf = Mémoire.JFrameLargeur -
(Mémoire.PartieDistanceFin + sizeTempWidth);
}
else {
xf = Mémoire.JFrameLargeur + Mémoire.PartieDistanceFin +
sizeTempWidth;
}
yf = (int) ( (Math.random() *
(Mémoire.JFrameHauteur - (Mémoire.PartiePasApparition * 2))) +
Mémoire.PartiePasApparition);
break;
case 3: //en bas
if (finDansEcran) {
yf = Mémoire.JFrameHauteur -
(Mémoire.PartieDistanceFin + sizeTempWidth);
}
else {
yf = Mémoire.JFrameHauteur + Mémoire.PartieDistanceFin +
sizeTempWidth;
}
xf = (int) ( (Math.random() *
(Mémoire.JFrameLargeur - (Mémoire.PartiePasApparition * 2))) +
Mémoire.PartiePasApparition);
break;
}
//valeur temporaire
double temp = yf - yd;
double temp2 = xf - xd;
//savoir s'il vas à droite
if (temp2 <= 0) {
droite = false;
}
else {
droite = true;
}
//savoir s'il vas vers le haut
if (temp <= 0) {
haut = true;
}
else {
haut = false;
}
//trouver son équation
equation = temp / temp2;
//trouver son C
c = yd - (equation * xd);
//trouver les distances
distanceLongueur = Math.abs(xf - xd);
distanceHauteur = Math.abs(yf - yd);
}
/****************************************************************************
- nom : gagner
- commentaire : objet a gagner
- recoi : rien
- renvoi : rien
public void gagner() {
gagner = true;
}
/****************************************************************************
- nom : setVitesse
- commentaire : modifier la vitesse de départ
- recoi : vitesse
- renvoi : rien
public void setVitesse(double Vitesse) {
this.Vitesse = Vitesse;
}
/****************************************************************************
- nom : setsizeTempHeight
- commentaire : hauteur de l'image
- recoi : la hauteur
- renvoi : rien
public void setsizeTempHeight(int sizeTempHeight) {
this.sizeTempHeight = sizeTempHeight;
}
/****************************************************************************
- nom : setsizeTempWith
- commentaire : largeur de l'image
- recoi : largeur
- renvoi : rien
public void setsizeTempWidth(int sizeTempWidth) {
this.sizeTempWidth = sizeTempWidth;
}
/****************************************************************************
- nom : setfinDansEcran
- commentaire : modifier s,il fini dans l'écran
- recoi : finDansEcran
- renvoi : rien
public void setfinDansEcran(boolean finDansEcran) {
this.finDansEcran = finDansEcran;
}
//class abstrac, voir asteroid ou personnage
public abstract void setImage();
public abstract void victoire();
public abstract void Mort();
public abstract int getDéplacement();
}
class this_mouseAdapter
extends java.awt.event.MouseAdapter {
Déplacement adaptee;
this_mouseAdapter(Déplacement adaptee) {
this.adaptee = adaptee;
}
public void mouseReleased(MouseEvent e) {
adaptee.this_mouseClicked(e);
}
}
Conclusion :
pour plus de renseignement, télécharger mon projet jeux de shooting
faut posséder winrar opur pouvoir le décompresser, puisqu'avec le son, c'était trop gros pour le site, j'ai du splitter en 3 morceaux
Partie 1
http://www.javafr.com/article.aspx?Val=277
Partie 2
http://www.javafr.com/article.aspx?Val=276
Partie 3
http://www.javafr.com/article.aspx?Val=275
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.