Mise à jour d'une piece graphique sur un damier

NeT0n Messages postés 28 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 5 mai 2009 - 19 févr. 2006 à 14:25
NeT0n Messages postés 28 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 5 mai 2009 - 21 févr. 2006 à 11:26
Bonjour,

J'ai un problème que je n'arrive pas à résoudre et qui commence à m'énerver.
J'explique :
Je suis entrain de programmer avec un collegue un jeux d'échec (graphique) en java pour notre projet tutoré.
Nous avons deja créé une classe pour chaque piece qui permet de controler leurs mouvements, chacune de ces classes est une extension de la classe piece qui contient une fonction piece(x,y, texte, couleur) et une fonction testmouvement(piece p, x, y) et une fonction affiche pour l'affichage texte.
x et y les coordonnées et texte pour l'affichage console

Bref, le probleme est pour l'affichage graphique, j'ai une classe affichage qui permet l'affichage complet de tous les éléments (menu, echiquier, et piece) que je peux donc l'appeler dans la fonction main et donc créer l'affichage graphique complet. Cependant je ne vois pas comment mettre à jour l'affichage de chaque piece lors du déplacement, en texte ça passe tout seul mais en graphique... soit j'affiche plein de fenetre avec une seule piece à l'intérieur soit toues les pieces au meme endroit mais sans pouvoir les déplacer...enfin pour conclure c'est le bordel lol
J'ai regarder d'autre programme en java (des jeux d'echec, dames) mais je n'arrive toujours pas à voir comment ils font.

Merci de votre aide

~~NeT0n~~

10 réponses

tucobouch Messages postés 194 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 1 mai 2009 50
19 févr. 2006 à 18:35
Je peux regarder un poil si tu poste une partie de ton source, notamment ta classe d'affichage...
0
NeT0n Messages postés 28 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 5 mai 2009
19 févr. 2006 à 18:47
ok merci voici ma classe affichage :

public class Affichage extends JFrame {
// champs
private JLabel barreStatut;
private JMenuBar mnb;
private JLabel statut;
private int caseSel[];
final static int MARGE_GAUCHE = 0;
final static int MARGE_HAUT = 0;
String[] piecesb = {"defaut/tourb.gif","defaut/cavalierb.gif","defaut/foub.gif","defaut/roib.gif",
"defaut/reineb.gif","defaut/foub.gif","defaut/cavalierb.gif","defaut/tourb.gif","defaut/pionb.gif"};
String[] piecesn = {"defaut/tourn.gif","defaut/cavaliern.gif","defaut/foun.gif","defaut/roin.gif",
"defaut/reinen.gif","defaut/foun.gif","defaut/cavaliern.gif","defaut/tourn.gif","defaut/pionn.gif"};
String echiquier = "defaut.gif";
final static int CASE_T = 50;
/** Constante de largeur de l'echiquier */
final static int HORIZONTALE = 8;
/** Constante de hauteur de l'echiquier */
final static int VERTICALE = 8;
Graph cPanel = new Graph();

// constructeur
public Affichage () {
super("Jeux d'Echec en Java");
this.setLayout(new BorderLayout());
//gestion de la fermeture de fenetre
this.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent pEv) {
System.exit(0);
}
});
//menu
this.mnb = new JMenuBar();
setJMenuBar(mnb);
JMenu lMenu = new JMenu("Fichier");
lMenu.add(new JMenuItem("Nouvelle partie"));
JMenuItem Quitter = lMenu.add(new JMenuItem("Quitter"));
JMenu lMenu2 = new JMenu("Partie");
JMenuItem Connection = lMenu2.add(new JMenuItem("Rejoindre une partie"));
JMenuItem Servir = lMenu2.add(new JMenuItem("Servir une partie"));
JMenu lMenu3 = new JMenu("Aide");
JMenuItem Apropos = lMenu3.add(new JMenuItem("A propos..."));
(this.mnb).add(lMenu);
(this.mnb).add(lMenu2);
(this.mnb).add(lMenu3);
//ecouteur pour la fermeture de la fenetre
Quitter.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent pEv) {
System.exit(0);
}
});
//ecouteur pour l'ouverture du popup a propos
Apropos.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent pEv) {
new Apropos();
}
});
//ecouteur pour la connection
Connection.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent pEv) {
new Connection();
}
});
//ecouteur pour l'attente d'une connection
Servir.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent pEv) {
new ServirUnePartie(2005);
}
});
this.setSize(8 * CASE_T + 7, 8 * CASE_T + 69);
//ajout de la barre de status
this.barreStatut = new JLabel ("Mettre le nom du joueur qui doit jouer");
this.barreStatut.setBackground(Color.LIGHT_GRAY);
this.add(this.barreStatut, BorderLayout.SOUTH);
this.add(cPanel, BorderLayout.CENTER);

Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((screen.width - getSize().width)/2, (screen.height - getSize().height)/2);
setResizable(false);

Image img = Toolkit.getDefaultToolkit().getImage(piecesb[6]);
setIconImage (img);

// pointeur de la souris en forme de viseur
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
this.setVisible(true);
}
public class Graph extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
createEchiquier(g);

//placer les pieces noir
for (int y = 0; y < 8; y++) {
placerPiecen(g, y , y * CASE_T, 0);
}
for (int y = 0; y < 8; y++) {
placerPiecen(g, 8 , y * CASE_T, CASE_T);
}
//Placer les pieces blanche
for (int y = 0; y < 8; y++) {
placerPieceb(g, y , y * CASE_T, 7*CASE_T);
}
for (int y = 0; y < 8; y++) {
placerPieceb(g, 8 , y * CASE_T, 6*CASE_T);
}
}
//fonction pour afficher les pieces blanches
public void placerPieceb(Graphics g, int type, int x, int y){
Image img = Toolkit.getDefaultToolkit().getImage(piecesb [type]);
g.drawImage(img, x, y,this);
}
//fonction pour afficher les pieces noirs
public void placerPiecen(Graphics g, int type, int x, int y){
Image img = Toolkit.getDefaultToolkit().getImage(piecesn [type]);
g.drawImage(img, x, y,this);
}
/**
* Cree l'image de l'echiquier.
*/
public void createEchiquier (Graphics g) {
Image img = Toolkit.getDefaultToolkit().getImage(echiquier) ;
g.drawImage(img,0,0,this);
}
}
}

~~NeT0n~~
0
tucobouch Messages postés 194 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 1 mai 2009 50
20 févr. 2006 à 10:55
En regardant le code, je peux te faire ces remarques :

-dans createEchiquier :
tu recharge a chaque affichage le fichier d'image echiquier, c'est pas top pour les performances ! (imagine un jeu a 50 images par secondes qui doit recharger 50 fois par secondes le meme fichier...). je te conseille de crééer une variable qui contiendra une fois pour toute l'image.

-meme remarque pour placerPiecen,placerPieceb

-pour la dimension de ta fenetre, au lieu de faire setSize() dans Affichage, je te conseille de mettre dans le constructeur Graph (c'est ton panel qui contient l'affichage du dammier) sa dimension :
setMinimumSize(new Dimension(8 * CASE_T + 7, 8 * CASE_T))
setPreferredSize(new Dimension(8 * CASE_T + 7, 8 * CASE_T))

c'est plus propre, et quand tu ajoute le panel dans ta fenetre, tu fait a la fin:
pack();
setResizable(false);
pack() te permet de redimenssionner pile poil la JFrame a la bonne taille

-pour l'affichage dans Graph, je te conseille non pas d'overrider paintComponent() mais plutot la méthode paint() qui est plus propre a mon sens... :

au lieu de :
public void paintComponent(Graphics g)
{
super.paintComponent(g);
...
}

fait :

public void paint(Graphics g)

{

...

}

Quand tu dois rafraichir (lors d'un déplacement de piece par exemple) le dammier, appelle la fonction repaint() de Graphe qui lance la fonction paint() de ta classe Graph

-d'apres ce que je lit dans ton post au début, tu dit "
soit j'affiche plein de fenetre avec une seule piece à l'intérieur soit toues les pieces au meme endroit"
tu ne créé pas un JFrame a chaque réaffichage ?! chaque fois que ton echéquier change, du dois juste faire un repaint()

-bon c'est tout ce que je vois pour le moment
ya peut etre encore des trucs a redire lol. mais tu peux deja essayer ces pistes...
0
tucobouch Messages postés 194 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 1 mai 2009 50
20 févr. 2006 à 10:56
Oups! je maitrise pas encore l'éditeur de texte...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NeT0n Messages postés 28 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 5 mai 2009
20 févr. 2006 à 11:13
ok,

Je te remerci vraiment de ton aide, je vais modifier tout ça

~~NeT0n~~
0
NeT0n Messages postés 28 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 5 mai 2009
20 févr. 2006 à 13:17
Je vais t'embeter encore un peu
J'ai donc tout modifier maintenant mes pieces s'affichent bien dans la meme fenetre au bonnes coordonnées mais le problemes c'est que lorsque je veux déplacer par exemple pour le premier coup un pion, y'a pas de problème il va où il faut mais ensuite lorsque je veux déplacer une autre piece ça m'efface la premiere et m'affiche la seconde

~~NeT0n~~
0
tucobouch Messages postés 194 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 1 mai 2009 50
20 févr. 2006 à 16:32
lol
Si j'ai bien compris et que ta fonction d'affichage ressemble à l'ancienne, a l'affichage, tu réaffiche tous les pions ou seulement quand ils bougent ?

si tu les affichent uniquement qd ils bougent, comme dans ton paint(), tu réaffiche tout ton échequier, il écrase l'ancien dessin (donc les anciens pions).

2 solutions :
-soit tu retiens les positions de tous tes pions (un tableau de pion en gros) et te réaffiche tous tes pions un par un a chaque paint()
-soit au lieu d'afficher directement dans le graphics de la fenetre (le Graphics passé en parametre de paint() ) tu affiche toutes tes modifs dans le graphics de l'image de l'echequier puis enfin tu affiche l'image de l'echéquier dans ta fenetre
0
NeT0n Messages postés 28 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 5 mai 2009
20 févr. 2006 à 17:43
j'ai utiliser la technique du tableau :-) et ça marche bien :D

Merci ^_______^

~~NeT0n~~
0
tucobouch Messages postés 194 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 1 mai 2009 50
20 févr. 2006 à 18:20
De rien de rien... ça fera 100e lo

l
0
NeT0n Messages postés 28 Date d'inscription mardi 21 décembre 2004 Statut Membre Dernière intervention 5 mai 2009
21 févr. 2006 à 11:26
~~NeT0n~~
0
Rejoignez-nous