Bonjour,
je suis en train de créer un jeu de plateau et je souhaiterais mettre une musique de fond.
Le problème est que le jeu appelle plusieurs thread via un Moustener. A chaque clic mon pion bouge. Cette création répété de thread coupe systématiquement la musique entre le 5 et le 6 eme apel d'un thread.

Pensant que c'était un pb de thread j'ai fais un projet de test et pris un petit code qui me donne la liste des thread existant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
 public static void printThreads() {
		      Thread[] ta = new Thread[Thread.activeCount()];
		      int n = Thread.enumerate(ta);
		      for (int i=0; i<n; i++) {
		         System.out.println("Le thread "+ i + " est " + ta[i].getName());
		      } }
Le résultat après plantage de la musique et le même qu'avant:
Le thread 0 est AWT-Shutdown
Le thread 1 est AWT-Windows
Le thread 2 est AWT-EventQueue-0
Le thread 3 est Image Fetcher 3
Le thread 4 est Java Sound Event Dispatcher
Le thread 5 est Thread-4
Le thread 6 est DestroyJavaVM
Java Sound Event Dispatcher semble etre le thread qui gère le sons,or il est toujours là.

Voici une partie du code:
Le Main:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package Pandemie;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
 
import Joueur.Joueur;
import Ville.Ville;
public class Pandemie {
	public static List<Joueur> Joueurs;
        public static void main(String[] args){
        	Joueurs = new LinkedList<Joueur>();
        	Fenetre fen = new Fenetre();
        	Joueur Joueur=new Joueur("Atlanta",1,-30,-58);
        	Joueur.setPion(fen.initialise_pion(Joueur, new Ville("Atlanta",0,247,321,new String[]{"Washington","Miami","Chicago"} )));
        	Joueurs.add(Joueur);//Joueur 1
 
        	Thread zic = new ThreadMusique();
    		zic.run();
        }
}
La musique!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Pandemie;
 
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.URL;
 
public class ThreadMusique extends Thread{
	public void run(){
		URL url = Pandemie.class.getResource("Ghost_in_the_shell.wav");
		AudioClip ac = Applet.newAudioClip(url);
		ac.play();
		ac.loop();
	}
}
La fenêtre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
package Pandemie;
 
import java.awt.Dimension;
import java.awt.Toolkit;
 
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
import Joueur.Joueur;
import Ville.Ville;
 
public class Fenetre extends JFrame{
 
     public Fenetre(){
         this.setTitle("Pandemie");
         this.setLocationRelativeTo(null);
         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         this.setExtendedState(this.MAXIMIZED_BOTH);
         this.setUndecorated(true);
         this.setContentPane(new Map());
         this.setLayout(null);
         this.setVisible(true);
 
 
     }
     JLabel initialise_pion(Joueur j,Ville atlanta) {
 
 		JLabel label = new JLabel();
 		ImageIcon image = new ImageIcon(Toolkit.getDefaultToolkit().getImage("pion"+j.getCode_couleur()+".png"));
 		label.setPreferredSize(new Dimension(image.getIconWidth(), image.getIconHeight()));
 		label.setIcon(image);
 		add(label);
 		label.setBounds(atlanta.getPosition().x+j.getDecal_x(),atlanta.getPosition().y+j.getDecal_y(),50,80);
 		return label;
 	}
 
 
}
Pour finir, le mouvement du pion:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
package Joueur;
 
import java.awt.Point;
 
import javax.swing.JLabel;
 
 
import Pandemie.Pandemie;
import Ville.Ville;
 
public class Joueur {
	String position;//la position est une ville
    int decal_x;
    int decal_y;
    int code_couleur;
    JLabel pion;
    static int joueur_actuel=0;
 
	public Joueur(String position,int code_couleur,int decal_x,int decal_y) {
		this.position=position;
		this.decal_x=decal_x;
		this.decal_y=decal_y;
		this.code_couleur=code_couleur;
	}
    public JLabel getPion() {
		return pion;
	}
	public void setPion(JLabel pion) {
		this.pion = pion;
	}
	public String getPosition() {
		return position;
	}
	public void setPosition(String position) {
		this.position = position;
	}
	public int getDecal_x() {
		return decal_x;
	}
	public void setDecal_x(int decal_x) {
		this.decal_x = decal_x;
	}
	public int getDecal_y() {
		return decal_y;
	}
	public void setDecal_y(int decal_y) {
		this.decal_y = decal_y;
	}
	public int getCode_couleur() {
		return code_couleur;
	}
	public void setCode_couleur(int code_couleur) {
		this.code_couleur = code_couleur;
	}
 
	//
	// Fonction Graphique de joueur
	//
 
	public static void Deplacement_pions(Point Clic){
        Pandemie.Joueurs.get(Joueur.joueur_actuel).Deplacement_pion(Clic);
 
	}
	public void Deplacement_pion(Point Clic){
	 	int i=0;
	 	System.out.println("AAAAAAAA "+Clic);
	 	Thread t = new Thread(new Mouvement(10,10,this.pion));
        t.start();
 
	}
	class Mouvement implements Runnable{
	   	 int x;
	   	 int y;
	   	 JLabel label;
	       public Mouvement(int x, int y,JLabel label) {
	    	   this.x=x;
	    	   this.y=y;
	    	   this.label=label;
			}
			@Override
	       public void run() {
				int i=0;
			 	for( i = 0; i < 1; i++)
			    {
			 		System.out.println("new:"+x+i+y+i);
			 		i++;
			 		label.setLocation(new Point(x+i,y+i));
			 		label.setVisible(true);
			 		try {
			            Thread.sleep(10);
				    } catch (InterruptedException e) {
				        e.printStackTrace();
 
			        }
				}
		   }              
	   }  
}
Le projet de test fais simplement bouger mon pion de 100 en x et 100 en y. On peut noter qu'envoyer des thread qui ne font rien pose le même problème.

En résumé, tout fonctionne, mais la suite de thread finit par arrêter la musique sans aucune erreur affichée... -_-
Merci de votre aide!

edit: J'ai continué mes tests sur la journée, il semble vraiment que ce soit un pb de thread... Je pourrais aussi tenter d'autres méthodes pour jouer un sons, mais je n'ai pas trouvé d'autres exemples simple sur lesquels m'appuyer.Si vous avez des idées...