Les déplacements de notre robot d’exploration étant contraints, nous allons déployer un drone capable de voler au-dessus de la surface martienne et de se déplacer d’une tuile à une autre en ligne droite, dans un espace euclidien.
1) Créez une classe Drone
à l’image de la classe Robot
. L’image du drone se trouve déjà dans le dossier resources/images/
du projet.
2) Créez une classe SpriteDrone
à l’image de la classe SpriteRobot
.
3) Modifiez la classe Main
pour instancier un robot et un drone et les afficher à l’écran.
Les classes Robot
et Drone
sont très similaires. Elles partagent les mêmes attributs et les mêmes méthodes. Nous allons supprimer cette duplication de code grâce à l’héritage.
1) Créez une classe Vehicle
qui sera la classe mère de Robot
et Drone
. Nous supposerons que la méthode distance
d’un véhicule renvoie 0 et que la méthode getPathTo
renvoie null.
2) Modifiez les classes Robot
et Drone
pour qu’elles héritent de Vehicle
. Chacune va définir son constructeur, et redéfinir les méthodes distance
et getPathTo
qui sont spécifiques.
L’annotation @Override
devant une méthode indique que cette méthode est redéfinie. Cette annotation est optionnelle, mais permet de s’assurer qu’il s’agit bien d’une redéfinition et non pas d’une surcharge. Nous vous conseillons de l’utiliser systématiquement.
Le modificateur de visibilité protected
permet de limiter l’accès d’attributs aux sous-classes (classes enfants) qui héritent de la classe de base.
3) Vous pouvez constater que les classes SpriteRobot
et SpriteDrone
sont également très similaires. Créez une classe mère Sprite
et faites les modifications nécessaires.
Le code de la méthode start
dans la classe Main
devrait contenir quelque chose comme :
view.getPane().setOnMouseClicked(e -> {
Position target = view.getPosition(e);
if (robot.canMove(target)) {
spriteRobot.animateMove(target);
}
if (drone.canMove(target)) {
spriteDrone.animateMove(target);
}
});
Si nous devons gérer beaucoup de véhicules, le code va vite devenir ingérable. Une solution consiste à créer un tableau de véhicules.
1) Modifiez le code pour instancier un tableau de trois véhicules. Nous allons utiliser deux robots d’exploration (Curiosity et Opportunity) ainsi qu’un drone (Ingenuity)
2) Instanciez un tableau de trois sprites en faisant en sorte que le ième sprite corresponde au sprite du ième véhicule.
3) Simplifier le code dans le gestionnaire d’évènement du clic souris.
1) Ajoutez la ligne System.out.println("Move completed: " + this);
à la fin de la méthode move
de Vehicle
. Que constatez-vous?
2) Redéfinissez la méthode toString
pour que le message affiché ressemble à :
Move completed: Robot Curiosity : energy=460.0
Move completed: Drone Ingenuity : energy=100.0
Move completed: Robot Opportunity : energy=610.0
1) Définissez la méthode equals
dans la classe position pour pouvoir comparer deux positions entre elles.
2) Créez une classe de test PositionTest
.
3) Modifiez ensuite la méthode start
de la classe Main
pour vérifier que la destination est différente de la position actuelle d’un véhicule avant d’essayer de le déplacer. Le message Move completed ne devra s’afficher que lorsqu’un déplacement est réalisé.
1) Permettre un Ctrl+Clic
pour sélectionner un véhicule et un clic de souris normal pour déplacer tous les véhicules sélectionnés.
Vous pouvez utiliser boolean isCtrlClick = e.isControlDown();
pour savoir si la touche Ctrl est enfoncé lors d’un clic souris