Bonjour a tous !
J'vous présente vite fait la structure de mon interface...
Donc j'ai un JLayredPanel, contenant deux Panel
L'un de ces Panel représente le fond (on va l'appeler PanelFond)
Le second représente un personnage (on va l'appeler Personnage)
Personnage est en fait un ImagePanel avec dessiné dessus a son initialisation l'image du personnage
Donc en fait je dessine progressivement un chemin sur PanelFond (avec DrawLine)
En même temps que je dessine ce chemin, j'aimerai déplacer le personnage... J'utilise donc SetLocation sur mon panel pour déplacer celui ci.
Premier probleme: Mon personnage ne se déplace pas progressivement, il ne s'affiche qu'a sa position de départ, puis sa position d'arrivée (probleme de repaint ?)
Second probleme: Lors de l'utilisation de SetLocation sur le panel Personnage, tout ce qui est dessiné sur PanelFond est effacé... Est-ce normal ?
Voici mon ImagePanel (avec BG transparent) :
Ici le MyJLayredPane (modifié pour ajouté des attributs de classe) :
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 package logogui; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; import javax.swing.JPanel; class ImagePanel extends JPanel { private Image img; public ImagePanel(String img) { this(new ImageIcon(img).getImage()); } public ImagePanel(Image img) { this.img = img; Dimension size = new Dimension(70, 84); setBackground(new Color(0,0,0,255)); setPreferredSize(size); setMinimumSize(size); setMaximumSize(size); setSize(size); setLayout(null); } public void paintComponent(Graphics g) { g.drawImage(img, 0, 0, null); } }
Et la fonction qui dessine:
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 import java.awt.Color; import javax.swing.ImageIcon; import javax.swing.JLayeredPane; import javax.swing.JPanel; public class MyJLayeredPane extends JLayeredPane { private JPanel cheminPanel; private ImagePanel perso; private static double initx = 300; // position initiale private static double inity = 300; private static int persoHeight = 84; private static int persoWidth = 75; public MyJLayeredPane() { cheminPanel = new JPanel(); cheminPanel.setBounds(0,0,2000,2000); add(cheminPanel,new Integer(0)); perso = new ImagePanel(new ImageIcon("images\\perso.png").getImage()); perso.setSize(persoWidth, persoHeight); perso.setBounds(toInt(initx)-persoWidth/2,toInt(inity)-persoHeight/2,persoHeight,persoHeight); add(perso,new Integer(1)); } public void init() { cheminPanel = new JPanel(); cheminPanel.setBounds(0,0,2000,2000); add(cheminPanel,new Integer(0)); perso = new ImagePanel(new ImageIcon("images\\perso.png").getImage()); perso.setSize(persoWidth, persoHeight); perso.setBounds(toInt(initx)-persoWidth/2,toInt(inity)-persoHeight/2,persoHeight,persoHeight); add(perso,new Integer(1)); } public JPanel getCheminPanel() { return cheminPanel; } public ImagePanel getPerso() { return perso; } private static int toInt(double a) { return (int) Math.round(a); } }
Grosso modo, dans cette fonction, le personnage se déplace de 'r' pixels
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 public void move(int r) { for(int i = r; i > 0; i = i - 5) { double a, b ; if(i < 5) { a = posx + i * Math.cos(teta) ; b = posy - i * Math.sin(teta) ; } else { a = posx + 5 * Math.cos(teta) ; b = posy - 5 * Math.sin(teta) ; } int x1 = posx; int y1 = posy; int x2 = a; int y2 = b; perso.setLocation(x2-persoWidth/2,y2-persoHeight/2); g2d.drawLine(x1,y1,x2,y2); posx = a; posy = b; try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
Je le fais se déplacer de 5px par 5px
Donc on a bien le chemin qui se trace (g2d.DrawLine) avec g2d obtenu par getGRaphics() du panel FondPanel (aussi appelé CheminPanel)
J'ai donc les 5 pixels dessiné toutes les 100ms.
Par contre, le setLocation n'est effectué qu'a la fin de la boucle, et efface tout ce qui a été dessiné sur le FondPanel...
Aidez moiiii
Merci d'avance ^^
Partager