cs_killians
Messages postés9Date d'inscriptionsamedi 5 juin 2004StatutMembreDernière intervention10 juin 2004
-
5 juin 2004 à 06:12
cs_killians
Messages postés9Date d'inscriptionsamedi 5 juin 2004StatutMembreDernière intervention10 juin 2004
-
9 juin 2004 à 23:13
Bonjour
Je suis en train de développer un jeu de stratégie en java pour un projet d'étude avec mon binôme.
Le but du jeu est de poser un maximum de pièces , de formes particulières, sur un plateau (une grille de 400 petits carres).Le jeu se joue à deux et chacun possède 42 pièces à placer, sachant qu'il y a des règles de placement. Les pièces sont composées de petits carrés qui vont se superposer à ceux du plateau après déplacement des pièces(ceci est nécessaire pour comptabiliser les scores des joueurs).
Pour coder ce jeu en java ( SWING) on a modélisé chaque petit carré par un JLabel. Chaque pièce est alors un JPanel qui contient un certain nombre de ces JLabels "collés" côte à côte. L'avantage est de pouvoir déplacer l'ensemble de la pièce avec la souris(on déplace le JPanel constituant la pièce).
Dans la même optique, on a modélisé le plateau par un JPanel qui contient 400 JLabels (petits carrés) "collés"côte à côte. (Oui l'idée est un peu originale....c'est ce que nous a dit notre tuteur).
C'est la que j'en viens à ma question.
On a remarqué que:
- si on crée d'abord les pièces puis le plateau , lorsque on déplace une pièce sur le plateau la pièce apparait sur le plateau
-si on déplace une pièce sur une pièce déja existante sur le plateau, la pièce déplacée va disparaitre derriere la piece présente sur le plateau.
-si on effectue une rotation sur la pièce que l'on veut poser sur le plateau et que l'on déplace la pièce obtenue sur le plateau, la pièce disparait derrière le plateau. A noter que la rotation porte uniquement sur la pièce : on obtient une nouvelle pièce qui possède les mêmes attributs que la précédente mais les petits carrés sont agencés d'une autre manière. En fait l'agencement des petits carrés de la pièces est géré par une matrice qui est interne au constructeur de pièces.
Conclusion: un JPanel créé avant d'autres JPanels sera toujours visible meme si on déplace un autre JPanel sur lui ou même si on le déplace sur un autre JPanel.
Nous avons essayé de trouver un algo pour modifier cette hiérarchie, mais ça ne marche pas et cela nous freine considérablement....
> N'y aurait-t'il pas une méthode existante dans Java qui modifie cette hiérarchie et permette un controle de la visibilité d'un JPanel par rapport à d'autres qui lui sont superposés?
Ainsi on pourrait voir les pièces rotationnées sur le plateau après déplacement plutot que de les voir disparaitre derriere le plateau. On est sur de les avoir derriere notre plateau: un algo nous le montre.
Si qqn a déja eu ce probleme, ce serait bien qu'il nous dise comment il a résoulu le probleme(une méthode Java existante? Un algo?)
Je ne peux pas fournir de code car environ 1500 lignes de code seraient un peu longue à lire....
Je peux juste dire que l'on a une classe PetitCarré qui étends JLabel, une classe pièce et une classe plateau qui étends JPanel, pour assembler des petits carrés, une classe graphique qui étends JFrame et implémente ActionListener et enfin une classe principale dans laquelle les pièces et le plateau sont créés et qui gère les événements de souris.
Enfin peut-être que notre conception du système est un peu trop originale et ne convient pas....Mais cela nous ferait du mal de tout se retapper surout que la fin du projet approche...
Voila si vous avez pu arriver jusque la je vous remercie de votre patience. Et j'espère que vous pourrez apporter une solution à notre problème.
gaelcal
Messages postés12Date d'inscriptionlundi 22 décembre 2003StatutMembreDernière intervention 2 mai 20061 7 juin 2004 à 12:47
Salut
Je voulais te demander si tu avais pensé à utilisé des graphics2D pour ton problèmes (associé à des Area on puet faire des systèmes simples et spéctaculaire)
PS 1500 lignes c'est pas tant que sa (le code de notre projet de fin d'année devait atteindre les 10000 lignes)
cs_killians
Messages postés9Date d'inscriptionsamedi 5 juin 2004StatutMembreDernière intervention10 juin 2004 7 juin 2004 à 20:17
Non on n'a pas utilisé de graphics2D...
Mais voila du code si qqn trouve commnet faire passer mes pièces sur le plateau après avoir les avoir tourner...
Le problème est que l'on ne puet plus revenir en arrière : problème de temps....
/** Aucune piece posée: carré gris. */
final static int RIEN = 0;
/** Constante de la couleur BLEU. */
final static int BLEU = 1;
/** Constante de la couleur JAUNE. */
final static int JAUNE = 2;
/** Constante de la couleur ROUGE. */
final static int ROUGE = 3;
/** Constante de la couleur VERT. */
final static int VERT = 4;
//Différents bouttons
final JButton play,stop,abandon,rotationn,rotationp,symh,symv;
//Une combo Box
final JComboBox menu3;
//Différents Label
final JLabel tps,brobot_tp_af,bjoueur_tp_af,pvert_af,prouge_af,pjaune_af,pbleu_af ;
final JLabel couleur;
//Différents panneaux
final JPanel pane1,pane2,pane4;
//Un timer pour compter
final Timer timer1 = new Timer(1000,new ActionCompte());
//Création du timer de clignotement
final Timer timer2 = new Timer(500,new ActionClignotement());
// Pièce récupérée lors d'un clic
Piece pieceSelect;
public F_Graphique(){
//Création de la fenêtre principale
setSize(900,900);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ImageIcon blokus = new ImageIcon ("blokus.gif");
setIconImage(blokus.getImage());
setTitle("Jeu Blokus");
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setLocation(dim.width/2 - getWidth()/2, dim.height/2 - getHeight()/2);
//Création du panneau père
JPanel mainpane=new JPanel();
mainpane.setLayout(null);
mainpane.setSize(600,550);
//Création du 1er panneau fils de mainpane
pane1=new JPanel();
pane1.setLayout(null);
pane1.setBorder (BorderFactory.createMatteBorder (5,5,5,2,Color.black));
pane1.setSize(450,500);
pane1.setBackground(Color.gray.brighter());
//Création d'un panneau pour ajouter
//les pièces et le plateau de jeu
JPanel pane11=new JPanel();
pane11.setSize(450,470);
pane11.setLayout(null);
pane11.setBorder (BorderFactory.createMatteBorder (5,5,2,2,Color.black));
pane11.setBackground(Color.gray);
jeu = new Blocus();
jeu.setSize(442,462);
jeu.setLocation(5,5);
jeu.setBackground(Color.gray.darker().darker().darker());
pane11.add(jeu);
//Mise en page de la Tool Bar
menu3 = new JComboBox ();
menu3.addItem("bleu/rouge");
menu3.addItem("jaune/vert");
menu3.setMaximumRowCount(2);
Icon Play = new ImageIcon ("play.gif");
play= new JButton(Play);
play.addActionListener(new ActionButton());
Icon Stop = new ImageIcon ("stop.gif");
stop= new JButton(Stop);
stop.setEnabled(false);
stop.addActionListener(new ActionButton());
Icon Abandon = new ImageIcon ("abandon.gif");
abandon= new JButton(Abandon);
abandon.setEnabled(false);
abandon.addActionListener(new ActionButton());
//Une deuxième barre d'outils
JToolBar menu1 = new JToolBar();
//menu1.setMargin(Espacements(50,100,50,50));
menu1.setFloatable(false);
menu1.setSize(150,25);
menu1.setLocation(250,470);
menu1.setBackground(Color.gray.brighter());
//Mise en page de la Tool Bar
Icon Rotationp = new ImageIcon ("rotationp.gif");
rotationp= new JButton(Rotationp);
//rotationp.setBounds(37,1,25,25);
rotationp.setEnabled(false);
rotationp.addActionListener(new ActionButton());
Icon Rotationn = new ImageIcon ("rotationn.gif");
rotationn= new JButton(Rotationn);
//rotationn.setBounds(62,1,25,25);
rotationn.setEnabled(false);
rotationn.addActionListener(new ActionButton());
Icon Symh = new ImageIcon ("symh.gif");
symh= new JButton(Symh);
//symh.setBounds(87,1,25,25);
symh.setEnabled(false);
symh.addActionListener(new ActionButton());
Icon Symv = new ImageIcon ("symv.gif");
symv= new JButton(Symv);
//symv.setBounds(112,1,25,25);
symv.setEnabled(false);
symv.addActionListener(new ActionButton());
//Champs du score du robot
buildConstraints(constraints, 0, 1, 1, 1, 80, 10);
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.EAST;
JLabel brobot_sc = new JLabel("Score :",JLabel.CENTER);
gridbag.setConstraints(brobot_sc, constraints);
pane2.add(brobot_sc);
//Affichage du score du robot
buildConstraints(constraints, 1, 1, 1, 1, 800, 0);
constraints.fill = GridBagConstraints.BOTH;
JLabel brobot_sc_af = new JLabel("000",JLabel.CENTER);
gridbag.setConstraints(brobot_sc_af, constraints);
pane2.add(brobot_sc_af);
//Champs du temps de jeu du robot
buildConstraints(constraints, 0, 2, 1, 1, 0, 10);
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.EAST;
JLabel brobot_tp = new JLabel("Temps de jeu :",JLabel.CENTER);
gridbag.setConstraints(brobot_tp, constraints);
pane2.add(brobot_tp);
//Affichage du temps
buildConstraints(constraints, 1, 2, 1, 1, 0, 0);
constraints.fill = GridBagConstraints.BOTH;
brobot_tp_af = new JLabel(Integer.toString(count),JLabel.CENTER);
gridbag.setConstraints(brobot_tp_af, constraints);
pane2.add(brobot_tp_af);
//Intitulé du joueur
buildConstraints(constraints, 0, 3, 2, 1, 0, 50);
constraints.fill = GridBagConstraints.HORIZONTAL;
JLabel bjoueur = new JLabel("JOUEUR",JLabel.CENTER);
bjoueur.setForeground(Color.red.darker().darker());
gridbag.setConstraints(bjoueur, constraints);
pane2.add(bjoueur);
//Champs du score du joueur
buildConstraints(constraints, 0, 4, 1, 1, 0, 10);
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.EAST;
JLabel bjoueur_sc = new JLabel("Score :",JLabel.CENTER);
gridbag.setConstraints(bjoueur_sc, constraints);
pane2.add(bjoueur_sc);
//Affichage du score du joueur
buildConstraints(constraints, 1, 4, 1, 1, 0, 0);
constraints.fill = GridBagConstraints.BOTH;
JLabel bjoueur_sc_af = new JLabel("000",JLabel.CENTER);
gridbag.setConstraints(bjoueur_sc_af, constraints);
pane2.add(bjoueur_sc_af);
//Champs du temps de jeu du joueur
buildConstraints(constraints, 0, 5, 1, 1, 100, 10);
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.EAST;
JLabel bjoueur_tp = new JLabel("Temps de jeu :",JLabel.CENTER);
gridbag.setConstraints(bjoueur_tp, constraints);
pane2.add(bjoueur_tp);
//Affichage du temps de jeu du joueur
buildConstraints(constraints, 1, 5, 1, 1, 100, 0);
constraints.fill = GridBagConstraints.BOTH;
bjoueur_tp_af = new JLabel(Integer.toString(count),JLabel.CENTER);
gridbag.setConstraints(bjoueur_tp_af, constraints);
pane2.add(bjoueur_tp_af);
//Création du 3ème panneau fils de mainpane
JPanel pane3=new JPanel();
pane3.setBorder (BorderFactory.createMatteBorder (1,1,2,5,Color.black));
pane3.setBounds(450,200,200,150);
pane3.setBackground(Color.gray.brighter());
GridBagLayout gridbag2 = new GridBagLayout();
GridBagConstraints constraints2 = new GridBagConstraints();
pane3.setLayout(gridbag2);
//Champs du score des pièces bleues
buildConstraints(constraints2, 0, 0, 1, 1, 70, 10);
constraints2.fill = GridBagConstraints.NONE;
constraints2.anchor = GridBagConstraints.EAST;
JLabel pbleu= new JLabel("Score bleu :");
pbleu.setForeground(Color.blue);
gridbag2.setConstraints(pbleu, constraints2);
pane3.add(pbleu);
//Affichage du score des pièces bleues
buildConstraints(constraints2, 1, 0, 1, 1, 400, 0);
constraints2.fill = GridBagConstraints.BOTH;
pbleu_af= new JLabel("000",JLabel.CENTER);
gridbag2.setConstraints(pbleu_af, constraints2);
pane3.add(pbleu_af);
//Champs du score des pièces vertes
buildConstraints(constraints2, 0, 6, 1, 1, 0, 10);
constraints2.fill = GridBagConstraints.NONE;
constraints2.anchor = GridBagConstraints.EAST;
JLabel pvert= new JLabel("Score vert :");
pvert.setForeground(Color.green.darker().darker());
gridbag2.setConstraints(pvert, constraints2);
pane3.add(pvert);
//Affichage du score des pièces vertes
buildConstraints(constraints2, 1, 6, 1, 1, 0, 0);
constraints2.fill = GridBagConstraints.BOTH;
pvert_af= new JLabel("0",JLabel.CENTER);
gridbag2.setConstraints(pvert_af, constraints2);
pane3.add(pvert_af);
//Création du 4ème panneau fils de mainpane
pane4=new JPanel();
pane4.setLayout(null);
pane4.setBorder (BorderFactory.createMatteBorder (1,1,5,5,Color.black));
pane4.setBounds(450,350,200,150);
pane4.setBackground(Color.gray.brighter());
//Mise en page du pane4
couleur=new JLabel("couleur à jouer",JLabel.CENTER);
couleur.setBackground (Color.gray.brighter());
couleur.setBounds(0,0,200,20);
couleur.setOpaque(true);
couleur.setBorder (BorderFactory.createMatteBorder (1,1,3,5,Color.black));
/* Ajout d'un score à l'une des couleurs */
public void addScore(int couleur, int score) {
switch (couleur) {
case VERT: pvert_af.setText(Integer.toString(Integer.parseInt(pvert_af.getText()) + score));
break;
case JAUNE: pjaune_af.setText(Integer.toString(Integer.parseInt(pjaune_af.getText()) + score));
break;
case ROUGE: prouge_af.setText(Integer.toString(Integer.parseInt(prouge_af.getText()) + score));
break;
case BLEU: pbleu_af.setText(Integer.toString(Integer.parseInt(pbleu_af.getText()) + score));
break;
}
}
//-------------Action des boutons---------------------------
class ActionButton implements ActionListener
{
public void actionPerformed (ActionEvent e)
{
if (e.getSource()==play)
{
play.setEnabled(false);stop.setEnabled(true);
abandon.setEnabled(true);menu3.setEnabled(false);
timer1.start();timer2.start();
JOptionPane.showMessageDialog(pane1,"La partie commence",
"Message de Blokus",JOptionPane.INFORMATION_MESSAGE);
}
if (e.getSource()==stop)
{
timer1.stop();timer2.stop();
JOptionPane.showMessageDialog(pane1,"La partie est terminée",
"Message de Blokus",JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(pane1,"temps de jeu : "
+Integer.toString(count)+ " secondes",
"Message de Blokus",JOptionPane.INFORMATION_MESSAGE);
abandon.setEnabled(false);stop.setEnabled(false);
count=0;
tps.setText(Integer.toString(count));
brobot_tp_af.setText(Integer.toString(count));
bjoueur_tp_af.setText(Integer.toString(count));
play.setEnabled(true);menu3.setEnabled(true);
//System.out.println(+count);
}
if (e.getSource()==abandon)
{
System.out.println ("abandon");
}
if (e.getSource()==rotationn)
{
System.out.println ("rotation de -90");
if ((pieceSelect!=null)&&(pieceSelect.deplacable==true)) {
pieceSelect.rotm90();
pieceSelect.dessinerPiece(pieceSelect.couleur,pieceSelect.x,pieceSelect.y,(JPanel)pieceSelect.getParent());
}
}
if(e.getSource()==rotationp)
{
System.out.println("rotation de +90");
if ((pieceSelect!=null)&&(pieceSelect.deplacable==true)) {
pieceSelect.rotp90();
pieceSelect.dessinerPiece(pieceSelect.couleur,pieceSelect.x,pieceSelect.y,(JPanel)pieceSelect.getParent());
}
}
/** Aucune piece posée: carré gris. */
final static int RIEN = 0;
/** Constante de la couleur BLEU. */
final static int BLEU = 1;
/** Constante de la couleur JAUNE. */
final static int JAUNE = 2;
/** Constante de la couleur ROUGE. */
final static int ROUGE = 3;
/** Constante de la couleur VERT. */
final static int VERT = 4;
/** Constante des abcisses. */
final static int X = 0 ;
/** Constante des ordonees. */
final static int Y = 1 ;
/** Couleur de la piece. */
protected int couleur;
/**
* Constructeur de la piece.
* -> Paramètre couleur à attribuer a la piece.
*/
public PetitCarre(int couleur) {
couleur = couleur;
}
/**
* Surcharge du constructeur de la piece.
* -> Affichage du petit carré à la position spécifiée
*/
public PetitCarre(int couleur,int x0,int y0) {
couleur = couleur; x x0; y y0;
public PetitCarre(boolean fond,int x0,int y0) { x x0; y y0;
if (fond==true) {
setBorder (BorderFactory.createBevelBorder (BevelBorder.RAISED,Color.white,Color.white));
int x,y;
protected boolean deplacable;
/** Aucune piece posée: carré gris. */
final static int RIEN = 0;
/** Constante de la couleur BLEU. */
final static int BLEU = 1;
/** Constante de la couleur JAUNE. */
final static int JAUNE = 2;
/** Constante de la couleur ROUGE. */
final static int ROUGE = 3;
/** Constante de la couleur VERT. */
final static int VERT = 4;
/** Constante des abcisses. */
final static int X = 0 ;
/** Constante des ordonees. */
final static int Y = 1 ;
/** Déclaration de la pièce comme tableau d'entiers indiquant la présence ou non de petitcarrés */
public int[][] matrice;
/** Type de la piece. */
protected int type;
/** Couleur de la piece. */
protected int couleur;
/* Nombre de petits carrés de la pièce */
public int Nb_pcarre;
/* Matrice intermédiaire pour les opérations de géométrie */
int[][] matdiag = new int[5][5];
static F_Graphique f;
/**
* Constructeur de la piece.
* -> Paramètre couleur à attribuer a la piece, position, type,
* fenêtre dans laquelle afficher, deplacable ou non, afficher ou non
*/
public Piece (int couleur0, int Nb_pcarre0, int type, int x0, int y0, boolean afficher, boolean deplacable1, JPanel fenetre) {
couleur = couleur0;
type = type; x x0; y y0;
deplacable = deplacable1;
Nb_pcarre=Nb_pcarre0;
matrice = new int[5][5] ; // Initialisation de la matrice représentant la pièce
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++)
matrice[i][j] = 0; // 0 pour absence de petit carré
}
for (int i = 0; i < 5; i++) { // Parcours de la matrice de la piece
for (int j = 0; j < 5; j++) {
if (matrice[i][j]==1) { add(new PetitCarre(couleur,13*i,13*j));}
} // dessin des petits carrés nécessaires
}