<< découverte d'eclipse | EclipseIndex | Comment configurer Eclipse pour utiliser la bibliothèque graphstream >>


Attach:Eclipse_Logo.png Δ

1.  Introduction

On va ressortir un jeu des années 70, le bon vieux Snake. Le principe est simple le joueur contrôle le serpent, qui va devoir manger le plus de souris possible. À chaque fois que le serpent mange une souris, il grandit. Le serpent doit éviter les murs et son propre corps. Les souris apparaissent aléatoirement dans l'aire de jeu. Il est bien évidemment possible d'ajouter des contraintes et des améliorations, je laisse cela à votre imagination. Dans ce qui suit nous allons considérer que le serpent est un python et qu'il mange des pommes !

2.  Structuration

2.1  La fenêtre principale et la boucle d'exécution

On commence par créer la classe FenetreSerpent qui gérera la fenêtre principale, elle hérite naturellement de JFrame. On ajoute dans la fenêtre la partie graphique TerrainDeJeu qui est un JPanel dans lequel on dessinera le serpent.

package com.damien.jeux;

import java.awt.GridLayout;
import javax.swing.JFrame;
import com.damien.jeux.graphique.TerrainDeJeu;

public class FenetreSerpent extends JFrame {

        private static final long serialVersionUID = 1L;

        public FenetreSerpent() {
                setDefaultCloseOperation(EXIT_ON_CLOSE);
                setTitle("Nibble");
                setResizable(false);
                setLayout(new GridLayout(1, 1, 0, 0));
                add(new TerrainDeJeu());
                pack();
                setLocationRelativeTo(null); // On centre la fenêtre
                setVisible(true);
        }

        public static void main(String[] args) {
                new FenetreSerpent();
        }

}
package com.damien.jeux.graphique;

import java.awt.Dimension;
import javax.swing.JPanel;

public class TerrainDeJeu extends JPanel {
        private static final long serialVersionUID = 1L;

        public static final int LARGEUR = 800, HAUTEUR = 800;

        public TerrainDeJeu() {
                setPreferredSize(new Dimension(LARGEUR, HAUTEUR));
        }
}

Avant d'aller plus loin, il nous faut parler de thread. Pour les concepts principaux je vous renvoie à la littérature ou à votre cours, nous allons simplement aborder ceci dans le cadre de notre problème.

Il y a au moins 3+1 threads utilisés dans une application graphique basée sur swing :

  1. le thread initial qui lance le main() ;
  2. l'Event Dispatch Thread (EDT) qui initialise l'interface graphique et la gère. Il appelle également les écouteurs (listener).
  3. Les threads de traitement, ils sont lancés par des écouteurs lorsqu'un traitement long doit être effectué.
  4. Le garbage collector.

Il nous faut donc mettre notre fenêtre principale FenetreSerpent dans l'EDT. Java propose à cet effet la classe SwingUtilities qui offre plusieurs méthodes statiques :

  1. javax.swing.SwingUtilities.invokeLater(Runnable t) : la méthode exécute le thread en paramètre dans l'EDT et rend immédiatement la main au thread principal. Ce sera notre un objet FenetreSerpent threadé dans notre cas ;
  2. javax.swing.SwingUtilities.invokeAndWait(Runnable t) : la méthode exécute le thread en paramètre dans l'EDT et attend la fin de celui-ci pour rendre la main au thread principal.
package com.damien.jeux;

import java.awt.GridLayout;
import javax.swing.JFrame;
import com.damien.jeux.graphique.TerrainDeJeu;

public class FenetreSerpent extends JFrame {

        private static final long serialVersionUID = 1L;

        public FenetreSerpent() {
                setDefaultCloseOperation(EXIT_ON_CLOSE);
                setTitle("Nibble");
                setResizable(false);
                setLayout(new GridLayout(1, 1, 0, 0));
                add(new TerrainDeJeu());
                pack();
                setLocationRelativeTo(null); // On centre la fenêtre
                setVisible(true);
        }

        public static void main(String[] args) {
                javax.swing.SwingUtilities.invokeLater(new Runnable() {
                 public void run() {
                        new FenetreSerpent();            
                 }
              });
        }      
}