CI9 : Alien vs ananas
L'objectif de cet exercice est de vous faire manipuler des classes anonymes et de vous introduire la bibliothèque JavaFX qui permet de créer facilement des applications graphiques.
Durée des exercices obligatoires : 2h30mn en présentiel- Exercice 1 : obligatoire (facile, ∼10mn)
- Exercice 1 : obligatoire (facile, ∼45mn)
- Exercice 2 : obligatoire (facile, ∼30mn)
- Exercice 3 : obligatoire (moyen, ∼30mn)
- Exercice 4 : obligatoire (moyen, ∼45mn)
Dans cet exercice, nous concevons un jeu vidéo simple nommé Alien vs Pinapples : une armée d'ananas mutants attaque votre galaxie et vous jouez un alien en charge de sauver l'univers, yipa !
Préparation
Avant de pouvoir programmer votre jeu, vous devez préparer votre environnement de travail afin d'utiliser la bibliothèque graphique JavaFX. Cette activité devrait vous prendre environ 10 minutes si tout se passe bien. Dans la suite de l'exercice, on considère que vous utilisez eclipse. Si vous utilisez un autre environnement de développement, il faut vous référer à la documentation de votre environnement.
Identification de la procédure
Pour commencer, vous devez identifier votre version de Java. Pour cela, dans un terminal, lancez la commande java -version.
- Si votre version de Java est supérieur à 11 (sur Linux ou MacOS, sur votre machine personnelle ou en salle TP), faîtes la procédure "Java supérieur à 11". Normalement, en salle TP, vous devriez être dans ce cas.
- Sinon, c'est que vous avez une vielle version de Java. Dans ce cas :
- Si vous êtes sur MacOS, il n'y rien de spécial à faire
- Sinon, c'est que vous êtes sous Linux avec une vielle version de Java. Vous devez faire la procédure "Java strictement inférieur à 11".
Java supérieur à 11 (machine personnelle Linux ou MacOS, ou en salle TP)
Pour commencer, sachez que cette procédure est susceptible de ne pas fonctionner sur votre machine si vous avez une configuration originale. À cette question, on considère que vous pouvez être sous Linux ou MacOS, et que vous utilisez une version récente de Java (supérieure ou égale à 11).
Pour commencer, il faut installer Java FX. Vous avez deux solutions :
- Installation sur Debian ou Ubuntu en ligne de commande sur votre machine personnelle (pas en salle de TP) :
- Vous devez d'abord installer Java FX avec la commande :
sudo apt install libopenjfx-java
- Ensuite, il faut identifier où se trouvent les fichiers que vous avez installer avec :
Par exemple sur ubuntu, cette commande devrait vous indiquer que les fichiers sont en /usr/share/maven-repos/org/javafx-base/debian.sudo dpkg -L libopenjfx-java
- Vous devez d'abord installer Java FX avec la commande :
- Installation sur MacOS ou sur d'autres distribution de Linux ou en salle de TP : Il faut télécharger le SDK (et non le jmods) de JavaFX qui convient à votre système d'exploitation à partir de ce lien. Actuellement, que vous ayez un PC ou un Mac (M1 ou Intel), il faut utiliser la version x64. Une fois que vous avez téléchargé JavaFX, il faut l'extraire dans un répertoire de votre choix. À partir de cette étape, ne déplacez plus les fichiers extraits ailleurs dans votre système de fichier.
Ensuite, vous pouvez créer le projet Java alien dans eclipse. Une fois que c'est fait, allez dans le menu Project puis Properties. Dans Java build path, sélectionnez Libraries et cliquez sur Modulepath, ce qui devrait dégriser le bouton Add External Jars. Cliquez sur ce bouton et ajoutez tous les fichiers jar contenus dans le sous-répertoire lib de JavaFX (le sous répertoire lib du répertoire identifié par dpkg -L libopenjfx-java ou le sous-répertoire lib du répertoire dans lequel vous avez extrait l'archive).
Dans votre projet alien, créez une classe Alien dans le package tsp.alien. Pour le moment, laissez cette classe vide.
Vérifiez qu'il existe bien un fichier nommé module-info.java à la racine des sources de votre projet (c'est-à-dire dans le répertoire src de votre projet). Si ce n'est pas le cas, c'est que vous utilisez une vieille version de eclipse. Vous devez donc créer manuellement ce fichier.
Enfin, copiez-collez le contenu du fichier suivant dans votre module-info.java :
Java strictement inférieur à 11 (machine personnelle Linux)
Avec de nombreuses distributions Linux (typiquement Debian ou Ubuntu), les versions Java inférieures strictement à 11 ne fournissent pas la bibliothèque JavaFX. Pour cette raison, vous allez devoir installer une version complète de Java 8 qui contient cette bibliothèque. Pour cela, il vous suffit de lancer la commande suivante dans un terminal après avoir remplacé [login] par votre nom de connexion sur les machines de Telecom SudParis :
Suite à cette étape, vous devriez avoir un jdk 8 dans ce répertoire que nous noterons JVM_PATH dans la suite : ~/jdk1.8.0_13.
Dans eclipse, dans le menu File->New, sélectionnez Java Project. Avant de saisir le nom du projet, il faut cliquer sur le lien Configure JREs qui se trouve vers le milieu de la fenêtre.
Dans la fenêtre qui vient de s'ouvrir, cliquez sur le bouton Add. Sélectionnez Standard JVM, puis cliquez sur Next. Dans la zone de saisie JRE Home, copiez-collez le chemin JVM_PATH correspondant au répertoire dans lequel se trouve la version Java fournissant JavaFX (voir le début de la question). En salle de TP, il vous suffit de copier-coller le texte suivant /mci/inf/thomas_g/jfx/jdk1.8.0_131. Vous devriez voir tout un tas de lignes s'afficher dans la zone JRE System libraries. Cliquez alors sur Finish.
Dans la fenêtre dans laquelle vous venez de revenir indiquant les Installed JREs, sélectionnez jdk1.8.0_131 et cliquez sur ok.Dans la fenêtre de création de projets dans laquelle vous devriez être revenu, sélectionner Use default JRE (currently jdk1.8.0_131).
Enfin, donnez le nom alien à votre projet (zone de saisie Project Name) avant de cliquer sur Finish.
L'univers (∼45mn – facile – obligatoire)
![]() |
![]() |
![]() |
- créer un groupe avec le constructeur par défaut de la classe Group,
- créer une scène associée à ce groupe avec le constructeur de la classe Scene
- et enfin associer la scène à la fenêtre avec la méthode setScene de la classe Stage.
- utiliser Group.getChildren pour récupérer la liste des enfants du groupe,
- et List.add pour ajouter le canevas à cette liste.
- Utilisez le constructeur javafx.scene.image.Image(String, double, double, boolean, boolean) pour charger l'image. Le premier argument est le chemin vers l'image, c'est-à-dire space.jpg dans notre cas. Les deux arguments suivants sont la taille que nous souhaitons donner à notre image, c'est à dire la taille de la fenêtre dans notre cas. Les deux argument suivants doivent être positionnés à false : il ne faut pas préserver les ratios de l'image d'origine et il n'est pas nécessaire d'utiliser un algorithme de qualité pour mettre l'image à l'échelle.
- Utilisez javafx.scene.canvas.GraphicsContext.drawImage pour afficher l'image aux coordonnées (0, 0) dans le canevas.
Les lutins (∼30mn – facile – obligatoire)
- le nom de l'image associée au lutin (utilisez javafx.scene.image.Image(String, double, double, boolean, boolean) pour charger l'image dans le constructeur de Sprite),
- la largeur et la hauteur du lutin.
Les lutins volants (– 30mn – moyen – obligatoire)
- s'assure que l'ananas est toujours entièrement visible dans la fenêtre (attention, pensez que votre ananas à une largeur et une hauteur),
- s'occupe de faire rebondir l'ananas lorsqu'il atteint un des 4 bords de la fenêtre.
L'alien volant (∼45mn – moyen – obligatoire)
bonus, nécessite de lire le sous-cours sur les classes anonymes
- Si score est un champ de classe anonyme, on peut bien sûr y accéder en lecture/écriture à partir de la méthode de la classe anonyme.
- Si score est une variable de la méthode Alien.start, comme le classe anonyme est une classe interne de méthode, Java effectue une copie de score dans l'instance de la classe anonyme lorsque l'instance est créée. De façon à éviter que les scores de la méthode et de l'instance de la classe anonyme divergent, Java interdit tout accès en écriture au champ score à partir de la création de l'instance de la classe anonyme. Comme score est modifié dans la méthode handle de la classe anonyme (c'est-à-dire qu'on y accède en écriture dans la méthode handle), on ne peut pas définir score comme variable de la méthode start().
- Si score est un champ de la classe Alien, la classe anonyme y accède via son champ Alien.this, et ce champ peut bien être accédé en lecture/écriture.