Bonjour a tous et merci de votre attention !
La situation :
Dans le carde d'un petit jeu, une frame est suceptible de contenir 4 panel :
-Celui d'un mini jeu a la spaceinvaders..
-Celui des ressources du personnage...
-Celui d'un marché ou acheter des munition etc..
-Celui d'une sorte de carte ou l'on choisi une planete pour s'y rendre.
Tous ces panel sont liés par un Joueur qui contient les differentes ressources (munitions, vie, energie etc...)
Chacun des panneau implements Runnable et lance un petit thread qui se charge de le repaint();
J'utilise deux methodes qui permettent de mettre ces thread en pause, pour ensuite les relancer.
Le probleme est :
Si je lance le jeu en commencant directement par le minijeu (le spaceinvaders) la fenetre s'affiche très bien, pas de soucis. On peut jouer au jeu, la frame s'affiche le panneau se repaint, aucun soucis. A la fin du jeu on accede a la planete désirée (pour l'instant uniquement marchande) puis quand on la quitte on peut choisir une nouvelle planete pour relancer le minijeu. Et là probleme : le jeu ne s'affiche pas, la frame semble etre toujours présente mais est toue grise, pas de jeu. Cependant si on attend le jeu se termine et on retourne au marché et ainsi de suite... mais le jeu ne s'affiche plus.
Si je lance le jeu en commencant par le marché ou la séléction de la planete le jeu ne s'affiche pas mieux...
Je met mes source dispos pour que vous puissiez mieux vous en rendre compte : ici
Je met ici des bouts de codes qui pourraient être suceptible d'en être la cause :
Le constructeur de la frame :
Le code qui controle les thread de repaint(), ils sont identiques pour chaque panels :
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 public class HFrame extends JFrame implements Runnable{ private static final long serialVersionUID = 1L; private HRessourcesPanel panelR; private HPanelSystemMap panelS; private HPanelMarchand panelM; private MPanel panelV; private boolean suspendu; private Thread t; private JLabel j1,j2,j3,j4; public HFrame (HRessourcesPanel panelR, HPanelSystemMap panelS, HPanelMarchand panelM, MPanel panelV){ //Assertion indispensables assert (panelR!=null && panelS != null && panelM !=null):"L'un des panneau est nul lors de la frabication de la fenetre"; //Parametres de la frame this.setTitle("MiniJeu"); this.setResizable(false); this.setUndecorated(true); Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); this.setSize((int)screenSize.getWidth(), (int)screenSize.getHeight()); this.setExtendedState(JFrame.MAXIMIZED_BOTH); this.setLayout(new GridBagLayout()); this.t=new Thread(this); t.start(); suspendu=false; //Creation des sous panneaux; this.panelM=panelM; this.panelR=panelR; this.panelS=panelS; this.panelV=panelV; //Creation des label combleur de vide j1 = new JLabel(); j1.setBackground(Color.RED); j2 = new JLabel(); j1.setBackground(Color.BLUE); j3 = new JLabel(); j1.setBackground(Color.GREEN); j4 = new JLabel(); j1.setBackground(Color.YELLOW); }
Ici le code qui me permet de vider la frame et d'arreter les thread de repaint()
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 //Repainter public synchronized void startRepaint(){ suspendu=false; notify(); } public void stopRepaint(){ suspendu=true; } public void run () { try { while (true){ this.repaint(); Thread.sleep(20); synchronized(this){ while(suspendu){ wait(); } } } } catch (InterruptedException e) { System.out.println(e); } } }
Et ici les mathodes qui permettent de passer d'une pahse a une autre (minijeu a marché etc...) en montrant tel ou tel panel :
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 public void stopAllRepaint() { this.panelM.stopRepaint(); this.panelS.stopRepaint(); this.panelR.stopRepaint(); this.panelV.stopRepaint(); } private void removeComp() { this.remove(panelM); this.remove(panelS); this.remove(panelR); this.remove(panelV); this.remove(j1); this.remove(j2); this.remove(j3); this.remove(j4); }
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 public void showVoyage (){ this.stopAllRepaint(); this.removeComp(); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.gridx=0; c.gridy=0; c.gridwidth=1; c.gridheight=1; c.weightx=1; c.weighty=1; this.getContentPane().add(panelV); this.setVisible(true); } public void showSystemMap(){ this.stopAllRepaint(); this.removeComp(); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; int[] x = {0,1,1,2,3,1}; int[] y = {0,0,1,1,1,2}; int[] width = {1,3,1,1,1,3}; int[] height = {3,1,1,1,1,1}; int[] px = {110,690,320,250,320,690}; int[] py = {600,175,250,260,250,175}; Component[] tab = {panelR, j1,j2,panelS,j3,j4}; for (int i=0;i<6;i++){ c.gridx=x[i]; c.gridy=y[i]; c.gridwidth=width[i]; c.gridheight=height[i]; c.weightx=px[i]; c.weighty=py[i]; this.getContentPane().add(tab[i], c); } this.panelS.startRepaint(); this.panelR.startRepaint(); this.setVisible(true); } public void showMagasin(){ this.stopAllRepaint(); this.removeComp(); GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; int x[] = {0,1}; int y[] = {0,0}; int larg[]= {1,1}; int haut[]= {1,1}; int px[] = {1,8}; int py[] = {1,1}; c.gridx=x[0]; c.gridy=y[0]; c.gridwidth=larg[0]; c.gridheight=haut[0]; c.weightx=px[0]; c.weighty=py[0]; this.getContentPane().add(this.panelR, c); c.gridx=x[1]; c.gridy=y[1]; c.gridwidth=larg[1]; c.gridheight=haut[1]; c.weightx=px[1]; c.weighty=py[1]; this.getContentPane().add(this.panelM, c); this.panelM.startRepaint(); this.panelR.startRepaint(); this.setVisible(true); }
Partager