Bonjour tout le monde,
Voici mon premier post sur ce forum.
Je profite d'une année de vacance pour m'essayer à la programmation d'un petit jeu vidéo.
Ayant tendance a faire des posts a rallonge, je l'ai séparé en deux parties :
- Le contexte
- Le problème
J'invite donc les personnes ne voulant pas consacrer trop de temps a passer directement à la partie 2.
###############################################
################### LE CONTEXTE ##################
###############################################
J'ai choisi l'API Swing pour la gestion des menus.
J'ai créé un JLayeredPane avec plusieurs niveaux :
- niveau 0 : Le jeu proprement dit
- niveau 1 : La barre de raccourci vers les différents menus
- niveau 2+ : Les menus affichés
( Pour l'instant, le niveau 0 se limite à un vide intersidéral ! )
Je me suis concentre sur les niveaux 1 + :
Lors du chargement de mon jeu, je charge la barre de menu associe a l'écran principal.
Pour cela, j'utilise une classe ToolbarController :
Le ToolbarController se branche sur le JLayeredPane de ma frame principale et s'occupe de gérer les couches 1+;
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 public class ToolbarController implements ActionListener { JLayeredPane pane; [...] //Constructeur public ToolbarController( JLayeredPane pane ) { this.pane = pane; init(); } //Rajout d'un menu a la toolbar public void addSheet( SheetController controller ) [...] //Listener sur les boutons de la toolbar public void actionPerformed(ActionEvent evt) [...] //Affiche ou cache un menu lors du click sur l'icon. Les 'Sheet' sont affiches dan les niveaux 2+ public void toggleSheet( String sheetName ) [...] //Methode appelée par toggleSheet pour positionner le panel private void setSheet( SheetPanel sheet ) [...] }
Lors du chargement de l'écran principal, la méthode addSheet est appelée.
Le SheetController dispose des informations suivantes :
- L'icone associée au menu
- Un SheetPanel qui contient le menu affichable
addSheet crée un bouton dans le niveau permettant d'afficher / cacher le SheetPanel et stocke le SheetPanel dans une map :
Lors de l'appuie sur le bouton nouvellement créé, le ToolbarController déclenche la méthode toggleSheet qui s'occupe d'ajouter ou supprimer le SheetPanel dans le LayeredPane :
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 public void addSheet( SheetController controller ) { String paneName = controller.getPanel().getName(); JButton button = new JButton(); DataManager.setButtonIcons(button, controller.getPanel().getIcon() ); button.setVerticalAlignment(JLabel.CENTER); button.setHorizontalAlignment(JLabel.CENTER); button.setBounds( TOOLBARELT_SPACE, TOOLBARELT_SPACE + toolBarIndex * ( 2 * TOOLBARELT_SPACE + TOOLBARELT_HEIGHT), TOOLBARELT_WIDTH, TOOLBARELT_HEIGHT); //button.setMnemonic(KeyEvent.VK_D); button.setActionCommand( paneName ); button.addActionListener(this); iconMap.put( paneName , button ); controllerMap.put( paneName, controller); pane.add( button, TOOLBAR_INDEX); toolBarIndex++; }
Cette méthode fait appel a setSheet qui se charge de positionner le panel dans le JLayeredPane :
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 public void toggleSheet( String sheetName ) { //Precaution if( ! iconMap.containsKey( sheetName ) ) return; if( ! controllerMap.containsKey( sheetName ) ) return; JButton button = iconMap.get( sheetName ); SheetPanel sheet = controllerMap.get( sheetName ).getPanel(); //Check if the sheet is already displayed if( displayedSheets.indexOf( sheet ) != -1 ) //Pane already opened --> we hide it { button.setSelected( false ); pane.remove( sheet ); displayedSheets.remove( sheet ); } else // Pane not open --> We display it { button.setSelected( true ); setSheet( sheet ); displayedSheets.add( sheet ); currentIndex++; } //Update display pane.validate(); }
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 private void setSheet( SheetPanel sheet ) { // Center the element int sheetWidth = sheet.getWidth(); int sheetHeight = sheet.getHeight(); int widthReserved = TOOLBARELT_WIDTH + 2 * TOOLBARELT_SPACE; int windowWidth = ViewManager.getWindowsWidth(); int windowHeight = ViewManager.getWindowsHeight(); int x = widthReserved + ( windowWidth - sheetWidth ) / 2; int y = ( windowHeight - sheetHeight ) / 2; sheet.setBounds(x, y, sheetWidth, sheetHeight); pane.add( sheet, currentIndex ); sheet.repaint(); sheet.validate(); }
###############################################
################### LE PROBLEME ##################
###############################################
Mon problème est le suivant :
L'ajout des boutons dans la barre de raccourci fonctionne.
Par contre, lors du clic sur un de ses boutons, le boulot ne se fait qu'à moitié :
- Le panel s'ajoute bien a mon LayeredPane
- Son contenu s'affiche mal : Il faut que je passe ma souris au dessus des différents boutons pour que ces derniers s'affichent
Petit exemple en image en pièces jointes.
###############################################
################### REMARQUES ###################
###############################################
Je ne sais pas si Swing est la solution la plus adaptée pour mon projet.
Le projet en question se lancera dans une frame externe et utilisera un peu de Java3 pour le jeu proprement dit.
Je suis tout ouïe si vous avez des suggestions.
Merci d'avance pour toute l'aide que vous pourrez m'apporter.
Partager