Interface Swing à partir d'un tableau 2D (jeu)

Interface Swing à partir d'un tableau 2D (jeu) - Java - Programmation

Marsh Posté le 31-05-2016 à 18:25:23    

Salut!
 
 
Dans le cadre de ma (courte) formation pro (java/php), nous avions réalisé un mini projet (aucune maitrise du combo Swing/listeners à "l'époque" ) où j'avais codé un petit jeu (affichage console) de labyrinthe, avec un tableau à 2 dimensions pour l'aire de jeu (et des caractères ascii pour l'affichage).
Un perso qui se déplace, avec des HP, des ennemis placés sur certaines cases, et des combats se jouant aux dés (avec un math.random).
 
 
C'est basique mais je trouve ça pas trop mal à mon niveau, et ça pourrait me servir pour mon dossier de soutenance d'exam (puis c'est fun :o).
J'aimerais reprendre ce projet avec mon niveau actuel pour le rendre plus graphique (+ éventuellement le relier à une BDD pour les high scores).
 
L'ancienne archi se basait sur un labyrinthe à base de tableau à 2 dimensions, assez simple pour calculer les coordonnées.
Je voudrais maintenant le retaper sous forme graphique, avec une JFrame contenant un JPanel en GridLayout.
Ma 1ère idée était de représenter les cases avec des labels (carré de 8x8=64) dans lesquels je mettais une Imageicon (représentant les ennemis + le perso).
 
 
Seul "souci", ma méthode semble fastidieuse: avec le tableau, la position du joueur était simple à lire et mettre à jour (coordonnées x et y en attributs de l'objet "joueur" ), là j'ai dû créer séparément 64 labels pour pouvoir les nommer (c1, c2, c3, ... , c64) et pour les interpreter il faudrait que je réalise un split sur le nom de la variable, donc identifier et convertir en String un nom de variable.
Ca semble simple à dire mais je sens que je vais droit dans un mur, et puis c'est pas élégant (64 labels private dans une classe de JFrame, autant de getters, c'est trop lourd pour être optimisé).
 
 
Verriez-vous une solution à ce souci? Autre méthode, ou moyen simple de récupérer le nom du JLabel sur lequel le perso tombe (ex: à partir du listener du JLabel c8 = new JLabel(); , récupérer un String "c8" ).
 
J'ai pensé à une solution basée sur la déduction (je sais d'où le joueur part et où il atterit selon la direction indiquée), mais même si je sais que son mouvement l'amène en case c12 (-> JLabel c12), je peux avoir un String "c12", mais il faudrait alors faire appel à une méthode setC12(), et là c'est mort :/
 
 
En esperant avoir été clair, merci pour votre aide :D
 
 
:jap:

Reply

Marsh Posté le 31-05-2016 à 18:25:23   

Reply

Marsh Posté le 01-06-2016 à 09:50:32    

Bon je ne sais pas si c'est faisable simplement en java.

 

Mais perso pour des jeux de case, je générais dynamiquement une image.
Et c'est celle que j'affichais sur le composant/panel.

 

Bref une matrice, avec pour chaque éléments des propriétés ou structure de propriétés pour décrire l'état de la case.
Et c'est à partir de cette matrice que tu génères dynamiquement une bitmap grâce à une classe qui se charge du rendu graphique.
Tu peux même rendre le truc encore plus intéressant en faisant en sorte que les graphismes soient skinable, bref dynamique, pas codé en dure.

 

Mais tes 64 label oublie, tu vas faire saigner les yeux de ton tuteur de stage.

Message cité 1 fois
Message édité par fredo3 le 01-06-2016 à 10:03:42
Reply

Marsh Posté le 01-06-2016 à 16:42:21    

Hello, je tombe par hasard ici et j'ai l'impression que tu ne raisonnes pas assez "objet"
 
Si j'ai bien compris ce que tu veux faire, une conception possible serait :
* 1 objet "case" : 64 instances
- 1 attribut de classe représentant l'image par défaut quand il n'y a pas de joueur
- 1 un attribut "joueur" pouvant être null si pas de joueur
* 1 objet "joueur"  
- 1 attribut définissant l'image de ce joueur
 
Aprés fais attention à ne pas mélanger les classes de type algo et les classes d'interface, c'est faisable, mais c'est pas propre.

Reply

Marsh Posté le 01-06-2016 à 21:54:07    

fredo3 a écrit :

Bon je ne sais pas si c'est faisable simplement en java.

 

Mais perso pour des jeux de case, je générais dynamiquement une image.
Et c'est celle que j'affichais sur le composant/panel.

 

Bref une matrice, avec pour chaque éléments des propriétés ou structure de propriétés pour décrire l'état de la case.
Et c'est à partir de cette matrice que tu génères dynamiquement une bitmap grâce à une classe qui se charge du rendu graphique.
Tu peux même rendre le truc encore plus intéressant en faisant en sorte que les graphismes soient skinable, bref dynamique, pas codé en dure.

 

Mais tes 64 label oublie, tu vas faire saigner les yeux de ton tuteur de stage.

 

Je comprends pas bien ton "générer dynamiquement une image"  [:tristou:4]

 
nipot a écrit :

Hello, je tombe par hasard ici et j'ai l'impression que tu ne raisonnes pas assez "objet"

 

Si j'ai bien compris ce que tu veux faire, une conception possible serait :
* 1 objet "case" : 64 instances
- 1 attribut de classe représentant l'image par défaut quand il n'y a pas de joueur
- 1 un attribut "joueur" pouvant être null si pas de joueur
* 1 objet "joueur"
- 1 attribut définissant l'image de ce joueur

 

Aprés fais attention à ne pas mélanger les classes de type algo et les classes d'interface, c'est faisable, mais c'est pas propre.

 

Pas de souci pour raisonner objet, mais même si je prends ton ex, avec imaginons une ArrayList contenant les 64 objets cases (des JLabel tant qu'à faire, vu que c'est avec ça que je remplis le GridLayout de ma JFrame), chouette, je peux facilement deviner que si le joueur part de la case 1 (coin bas gauche disons), donc indice 0 de mon arraylist, et veux aller à droite, je dois redessiner son perso en case 2 (indice 1), c'aurait été case 9 s'il voulait aller en haut (1+8 puisque grid de 8*8), etc.
Sauf que pour dessiner mon aire de jeu, j'ai dû boucler sur l'ArrayList du genre:

 

Arraylist maListe = new ArrayList();
for (int i = 0 : i <65 ; i++) {
maListe.add(new JLabel case);
}

 

for (JLabel case : maListe) {
panelGrid.add(case);
}

 

Ma JFrame contient donc un panelGrid (64 rows/64 columns) rempli de JLabel, je définis une ImageIcon pour le départ (1 pour le perso et quelques ennemis sur quelques cases au pif).

 

Mon objet joueur a un attribut position (int), valant 0 au départ et évoluant à chaque déplacement, ok.

 

A chaque fois que je déduis cet int "position" suite à un déplacement, je sais que je dois faire un add(ImageIcon) sur l'indice équivalent de mon ArrayList (qui est un attribut de ma JFrame).
Et j'enchaîne avec un refresh de ma JFrame en faisant un removeAll sur mon panelGrid et en relancant la boucle écrite plus haut  [:never let me down]

 

Je crois que ma solution est là?! :love: Une faille?

 


:jap:


Message édité par potemkin le 01-06-2016 à 21:55:30
Reply

Marsh Posté le 01-06-2016 à 22:14:03    

Avec des méthodes java tu peux dessiner des traits, rectangles, cercles, écrire du text,... voire coller le contenu de fichiers images, bref tu peux générer à partir de la matrice qui contient les infos sur l'état de chaque cellule, l'image finale qui sera affichée sur ton panel.
D'ailleurs tu ne t'es jamais demandé comment les objets visuels (editbox, combobox, list, label,...) étaient générés? Et bien c'est de cette façon.
 
Exemple:
https://youtu.be/no4m-TIX-rc

Reply

Marsh Posté le 01-06-2016 à 23:02:14    

Ah oui je vois :D
 
J'avoue que j'ai pas vraiment manipulé ces méthodes :/
 
De plus les déplacements seraient relativement chauds à gérer non?
 
Mon appli est déjà écrite, à part la vue à refaire, mon modèle et mes méthodes du controleur ont besoin de peu de retouches, j'aurais jamais assez de temps pour maitriser assez les paint (j'attaque mon stage lundi, pour du web pur, je pense pas avoir la tête à faire ça en à côté, sachant que j'ai déjà dû abandonner aux 2/3 l'apprentissage de Symfony, et qu'on a à peine effleuré le dev Android (heureusement relativement simple à assimiler du moins pour faire une appli basique à présenter au jury, chsoe que j'espère boucler entre demain et vendredi).
 
Ce petit jeu est un bonus et un objectif perso, la partie client lourd pouvant être validée avec un projet de plus grande ampleur déjà réalisé en groupe , là ça serait juste le petit + :jap:
 
Je sais pas ce que tu penses de mon post précédent (s'il est assez clair), la méthode te semble viable? Je coderai un test ce week-end.

Reply

Marsh Posté le 02-06-2016 à 18:51:47    

T'as pas un printscreen du jeu (les label), parce que je vois pas bien ce que c'est en fait.

Reply

Marsh Posté le 02-06-2016 à 19:36:40    

https://drive.google.com/file/d/0B3 [...] sp=sharing
 
Y'a une caps et le src si tu veux te moquer :o
 
La partie basse est gribouillée à l'arrache, c'est pour les contrôles/infos, je m'en occuperai en dernier c'est pas le plus dur :D

Reply

Marsh Posté le 02-06-2016 à 20:13:35    

Graphiquement ça a l'air bien :jap:

 

Concentre toi sur ton stage et le rapport de stage, si à la fin il te reste du temps, tu pourras toujours faire les modif nécessaires sur ce projet.
Parce que programmé de la sorte (des label, c'est pas fait pour cet usage), je ne suis pas sûr que ça t'avantage, ca va même faire saigner les yeux du jury je pense.


Message édité par fredo3 le 02-06-2016 à 20:43:48
Reply

Marsh Posté le 02-06-2016 à 21:04:56    

Yep j'me donne le week-end pour voir si j'arrive à conclure, sinon je laisse tomber :D
 
Et oui je suis d'accord pour les labels pas adaptés, mais j'ai pas trouvé d'autre idée (à ma portée) pour supporter des images :/
 
Merci pour ton aide en tout cas, je reposterai le résultat si je vais au bout :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed