Objectif

Il vous est demandé de mettre en place quelques classes pour vous remettre en tête les grands principes de la programmation orientée objet : messages et collaboration entre objets, attributs et méthodes, constructeurs, héritage, etc.

Pour cela, vous travaillerez sur un jeu de balle au prisonnier.

Votre travail servira de base aux TPs suivants qui feront l'objet d'une note globale.
Le travail en binome est fortement conseillé.

Environnement

Pour développer en Java durant le TP, vous pouvez choisir d'utiliser :

  • Un environnement de développement intégré (comme Eclipse, Netbeans ou Intellij) qui permet de compiler, de générer un projet, de débugger et d'exécuter
  • N'importe quel éditeur de texte avec coloration syntaxique, et effectuer la compilation et l'exécution en ligne de commande (javac, java)

En cas de problème avec Linux, télécharger le le fichier jfxrt.jar. Et rajouter le dans votre CLASSPATH

Travail demandé

L'archive M1if01.zip contient les classes de base :

  • App : la classe principale, qui gère la création de l'application
  • Field : une classe gérant le terrain de jeu
  • Joueur : une classe gérant un joueur et ses diverses méthodes (avancer, tourner, ...)
  • Sprite : une classe gérant le rendu graphique et l'animation des joueurs, ou d'autres éléments graphiques

Décompressez l'archive dans un dossier sur votre compte. Explorez le code source. Compilez et lancez le programme principal balleauprisonnier.

Testez, utilisez les touches WASD ou les flêches directionnelles pour déplacer et faire pivoter les joueurs.

Consultez la documentation de Java 8 et de Javafx (la bibliothèque graphique utilisée).

Il est possible qu'Eclipse signale une erreur ou un warning de restriction d'access lors de l'utilisation de javafx. Ce problème peut être résolu en modifiant les propriétés du projet pour autoriser javafx. Vous remarquerez au passage que la solution la plus simple n'est pas la première sur stackoverflow : lisez les solutions alternatives avant de partir pour l'une ou l'autre.

Javafx est normalement intégré au Java Development Kit (JDK), depuis la version 8. Cependant sous Linux, il est possible qu'il faille ajouter javafx "à la main"

Amélioration du programme

Modifiez la classe Player ou Field pour :

  • que les touches de contrôle correspondent à un clavier AZERTY plutôt que QWERTY, i.e. ZQSD au lieu de WASD.
  • que la vitesse (la taille du pas) du Joueur soit variable (que cela deviennent une propriété du joueur spécifié à sa création).
  • que chaque joueur utilise une touche différente pour tirer (au lieu d'ESPACE pour les deux joueurs).

Voir la gestion des évènements clavier avec Javafx au besoin, et leur application dans un jeu ici (section Handling User Input),

Testez.

Ajouter quelques méthodes à Player et Field :

  • Créer deux listes de joueurs correspondants à deux équipes (au lieu d'une liste).
  • Utiliser l'héritage pour faire une distinction entre joueurs contrôlés par un humain et par l'ordinateur.
  • Pour l'instant les joueurs controlés par l'ordinateur restent statiques.
  • Faire en sorte qu'une partie oppose 3 joueurs (1 humain, 2 ordinateurs) de chaque côté.

Testez.

Tirs

Nous allons maintenant faire un sorte qu'un tir déclenche un lancer de projectile qui traverse le terrain, et atterisse dans le camp adverse, sur un adversaire ou non.

  • Créer une classe projectile, créée lors d'un tir, avec une vitesse et une direction.
  • Associer une représentation graphique à cette classe (ajouter l'image ball.png dans le dossier assets).
  • S'assurer que le projectile se déplace bien lors de la boucle principale du jeu.

Réfléchissez maintenant aux dépendances entre vos classe, et à la visibilité (public, private, final, protected) de vos variables et méthodes de classe.

Collisions

Dans un premier temps, c'est le terrain (Field) qui connait à la fois les joueurs et le(s) projectile(s). Faire en sorte que :

  • le projectile s'arrête dans le camps opposé, soit en tombant au sol, soit en touchant un joueur.
  • le projectile teste s'il rencontre un joueur adverse. Pour cela 1. créer une méthode testant si deux rectangles se chevauchent ; 2. rajouter une méthode permettant de facilement récupérer les coordonnées de la bounding box (du rectangle englobant) des projectiles et des joueurs ; 3. À chaque déplacement du projectile tester s'il rencontre un joueur adverse.
  • le joueur adverse disparaisse du jeu s'il est touché. Pour cela rajouter un attribut à la classe Player.

Testez avec les joueurs contrôlés par les utilisateurs.

Un peu d'intelligence

Rajouter un peu de stratégie en permettant aux joueurs contrôlés par l'ordinateur de :

  • se déplacer d'abord de manière aléatoire ;
  • se déplacer dans la direction opposée au tir ;
  • de tirer vers l'endroit avec le plus de joueurs.

Prendre de l'avance

Il est fortement recommandé de réaliser cette partie pendant la semaine et le week-end qui vient, si vous n'avez pas eu le temps de la faire pendant le TP.

Le code actuel mélange données, logique et interface. Commencez à restructurer le projet pour séparer la logique générale de l'application, de l'affichage du jeu, des données, et de la logique de jeu (les stratégies de tir et de déplacement).

Pensez à comment le programme pourrait être généralisé, pour facilement transformer les joueurs en autre chose, changer le mode d'affichage (par exemple bouger les personnages comme sur un platformer, avec une vue de profil), ajouter de nouvelles stratégies de tir.