cs_killians
Messages postés9Date d'inscriptionsamedi 5 juin 2004StatutMembreDernière intervention10 juin 2004
-
5 juin 2004 à 06:18
cs_killians
Messages postés9Date d'inscriptionsamedi 5 juin 2004StatutMembreDernière intervention10 juin 2004
-
10 juin 2004 à 02:25
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.
PROMETHEE111
Messages postés12Date d'inscriptionlundi 27 octobre 2003StatutMembreDernière intervention10 juin 2004 9 juin 2004 à 19:00
PROMETHEE
Bonjour, j'aimerai savoir qui contient qui : en effet, si le plateau contient les pièces, alors les pièces seront toujours au dessus du plateau. Je me doute que les cases du plateau sont contenues par celui-ci, mais je suppose que les pièces ne sont pas contenues par les cases, donc avec un algo on peut determiner quelles sont les cases recouvertes par une pièce, et les rendres transparentes.
Autre solution, Il y a peut être moyen de surcharger le panel contenant tout et sa méthode paint : via des clips, on doit pouvoir choisir les zones à repeindres et l'ordenancements (bien que cela ne soit pas sur...), au pire repeindre plusieurs fois les divers élements.
Peut tu nous dire qui possède qui ?
cs_killians
Messages postés9Date d'inscriptionsamedi 5 juin 2004StatutMembreDernière intervention10 juin 2004 9 juin 2004 à 23:07
voila une capture d'écran:
en fait les pièces sont en dehors du plateau . Le plateau et les pièces sont dans un même JPanel.
Les pièces sont crées en premier puis le plateau est créé dans la méthode main.
Si on n'effectue aucune rotation sur les pièces pas de pbm mais après rotation, si on déplace les pièces, elles passent derrière le plateau lorsqu'on veut les mettre sur le plateau.
PROMETHEE111
Messages postés12Date d'inscriptionlundi 27 octobre 2003StatutMembreDernière intervention10 juin 2004 10 juin 2004 à 00:50
PROMETHEE
voici un extrait de la doc java sur la classe JContainer :
A generic Abstract Window Toolkit(AWT) container object is a component that can contain other AWT components.
Components added to a container are tracked in a list. The order of the list will define the components' front-to-back stacking order within the container. If no index is specified when adding a component to a container, it will be added to the end of the list (and hence to the bottom of the stacking order).
Je pense que l'on peut en déduire que l'ordre dans lequel est peint la liste de composant contenue correpond à la liste gérer en interne par un vecteur :
0 pour front (devant), size()-1 pour back (derrière), ainsi, en supposant que pour tourner ta pièce tu la détruit et la reconstruit, il n'est pas étonnant que lorsque tu détruit et resonctruit un composant du conteneur, il se retrouve en dernier, donc derrière. Dans ce cas la solution est simple : prend l'indice du composant que tu souhaite détruire (la pièce), en sauvegardant cette indice lors de la construction, ou bien en faisant un getComponents et en comparant les élements du tableau jusqu'a ce que tu retrouve ta pièce, puis lorsque tu insère ta pièce tournée, tu la réinsère à cette indice, ou à l'indice 0 si tu te fiche de l'ordre d'affichage des pièces entre elles.
Pour inserer à un indice spécifique, c'est juste un JPanel.add(Component comp, int index).