DESS IDC
Introduction à la programmation orientée objet
Le langage JAVA

TP de programmation : Visages (1) (auteur Pierre Habraken)
Notions de base de la programmation par objets







Dernière modification : 10  février 1999, Philippe Genoud
 

L'objectif de ce TP est de mettre en oeuvre les techniques et les concepts élémentaires relatifs à la programmation orientée objet. Le travail demandé consiste à construire un programme d'animation d'objets graphiques.


1. Travail demandé

1.1. Cahier des charges

On se propose de réaliser un programme d'animation d'objets graphiques simples. Le programme doit afficher des objets représentant chacun un visage stylisé composé à partir de formes géometriques élémentaires telles que segments, cercles, etc., puis animer ces visages (déplacements, changements d'expression, ...).

Compte tenu du peu de temps disponible, le logiciel se limitera à l'affichage et à la manipulation de deux visages de même type (classe). Il devra toutefois pouvoir être facilement étendu pour prendre en compte un nombre plus important de visages de types différents. Ceci suppose donc une spécification et une conception soignées des composants dont il sera constitué.

1.2. Utilisation de classes prédéfinies

On dispose de types d'objets prédéfinis sous la forme de classes Java compilées et exécutables. Dans un premier temps (exercices 1 et 2),  le programme  utilisera la classe prédéfinie Visage à partir de laquelle sera créé un exemplaire unique qu'il s'agira d'afficher et d'animer à l'écran selon des trajectoires rectilignes.
Lorsque l'animation d'un visage unique fonctionnera comme souhaité, le programme sera modifié afin de prendre en compte l'animation simultanée de deux visages différents, selon des trajectoires elles-mêmes différentes (exercice 3).
L'affichage des visages à l'écran a lieu dans une fenêtre graphique. Cette fenêtre est gérée sous la forme d'un objet de type Dessin.
Les principes de base concernant la création et l'utilisation des objets sont rappelés en fin de sujet dans la section Classes et objets : rappels.

1.3. La classe Visage

Le type Visage est caractérisé par les propriétés et les opérations représentées sur le schéma ci-dessous.
La propriété dessin permet de relier chaque objet Visage au Dessin dans lequel il est affiché.

1.4. La classe Dessin

Les objets graphiques sont tracés dans une fenêtre graphique au moment voulu et de façon automatique. Cette fenêtre est un objet créé à partir de la classe Dessin qui vous est fournie. L'objet de type Dessin que vous créerez dans votre programme prendra en charge tout ce qui concerne l'affichage à l'écran de vos objets graphiques.

L'origine des coordonnées dans le "dessin", c'est à dire dans la fenêtre d'affichage, est située en haut et à gauche de la fenêtre. Les abcisses croissantes vont vers la droite, les ordonnées croissantes allant vers le bas de la fenêtre.

2. Déroulement du TP

Avant de commencer le travail demandé, créez un répertoire tpvisages1 dans lequel vous recopierez les fichiers suivants : (Pour récupérer ces fichiers : clic bouton droit sur le lien)

2.1. Exercice n°1

Il consiste à faire se déplacer un visage dans le dessin selon les deux directions opposées : Nord-Ouest -> Sud-Est et Sud-Est -> Nord-Ouest, toutes deux orientées à 45° par rapport aux axes principaux du dessin et confondues avec la deuxième bissectrice du plan.
 
Le fichier ExTpVisages1.classcontient le code compilé d'une classe réalisant cet exercice. Pour voir le résultat attendu de votre programme vous pouvez recopier ce fichier sur votre répertoire de travail (clic bouton droit sur le lien) et lancer son exécution depuis une fenêtre de commandes (Commandes MS-DOS ou Cygwin B20). Pour exécuter cette classe, la machine virtuelle a besoin des des classes Dessin, Visage définies dans le fichier TpVisages.jar. On utilisera donc la commande :
java -classpath ".;c:/TEMP/tpvisages1/TpVisages.jar" ExTpvisages1
c:/TEMP/tpvisages1 est le répertoire où a été installé le fichier TpVisages.jar
L'arrêt du programme est obtenu par émission du signal KILL (séquence de touches ^C) dans la fenêtre de commandes à partir de laquelle l'exécution a été lancée.

Les actions essentielles que doit exécuter le programme sont :

Les déplacements du visage doivent s'adapter correctement aux modifications éventuelles des dimensions de la fenêtre d'affichage effectuées par l'utilisateur du programme.
Après avoir défini un algorithme répondant à l'énoncé de cet exercice, insérez le code de votre programme dans le fichier squelette AppliVisages1.java.

Pour compiler puis exécuter la classe AppliVisages1.java avec le JDE depuis NTEmacs il est nécessaire  d'indiquer dans les options de la ligne de commandes de javac et java un classpath indiquant le chemin d'accès au fichier TpVisages.jar contenant les classes Dessin et Visage nécessaires à votre application. Pour plus de détails sur les opérations à effectuer suivez ce lien :  configuration du jde pour le tp visages 1.

Lorsque ce premier exercice est terminé, vous pouvez passer à l'exercice suivant.

2.2. Exercice n°2

Ce deuxième exercice va consister à donner au visage qui se déplace dans la fenêtre graphique une trajectoire moins répétitive, plus "aléatoire",  selon les quatre directions Nord-Ouest -> Sud-Est, Sud-Ouest -> Nord-Est, Sud-Est -> Nord-Ouest et Nord-Est -> Sud-Ouest  :
 
Le fichier ExTpVisages2.classcontient le code compilé d'une classe réalisant cet exercice. Vous pouvez recopier ce fichier sur votre répertoire de travail (clic bouton droit sur le lien) et lancer son exécution depuis une fenêtre de commandes (Commandes MS-DOS ou Cygwin B20) par la commande :
java -classpath ".;c:/TEMP/tpvisages1/TpVisages.jar" ExTpvisages2
c:/TEMP/tpvisages1 est le répertoire où a été installé le fichier TpVisages.jar
L'arrêt du programme est obtenu par émission du signal KILL (séquence de touches ^C) dans la fenêtre de commandes à partir de laquelle l'exécution a été lancée.

La direction du déplacement sera modifiée à chaque rencontre du visage avec un bord.
Outre son déplacement, le visage sera animé d'un changement d'expression à chaque changement de direction.
Pour réaliser cet exercice, recopiez le programme précédent dans un nouveau fichier appelé AppliVisages2.java  puis modifiez le contenu du fichier AppliVisages2.java jusqu'à obtenir le résultat demandé.

2.3. Exercice n°3

Dans ce troisième exercice, il faut parvenir à animer simultanément plusieurs visages, deux au moins :
 
Le fichier ExTpVisages3.classcontient le code compilé d'une classe réalisant cet exercice. Vous pouvez recopier ce fichier sur votre répertoire de travail (clic bouton droit sur le lien) et lancer son exécution depuis une fenêtre de commandes (Commandes MS-DOS ou Cygwin B20) par la commande :
java -classpath ".;c:/TEMP/tpvisages1/TpVisages.jar" ExTpvisages3
c:/TEMP/tpvisages1 est le répertoire où a été installé le fichier TpVisages.jar
L'arrêt du programme est obtenu par émission du signal KILL (séquence de touches ^C) dans la fenêtre de commandes à partir de laquelle l'exécution a été lancée.

Recopiez le programme de l'exercice 2 dans un nouveau fichier appelé AppliVisages3.java  puis appliquez les modifications nécessaires au contenu du fichier AppliVisages3.java.

Quelle modification de la structure du programme ou des classes fournies peut-on suggérer pour éviter ici certaines duplications de code inutiles et gênantes pour la maintenance du programme ?

3. Classes et objets : rappels

3.1. Création des objets

Les objets d'un même type manipulés par une application logicielle sont des exemplaires "fabriqués" à partir d'un modèle unique, modèle représenté par une classe.
Tous les objets sont utilisés et manipulés au moyen des méthodes de la classe dont ils sont un exemplaire.

La création d'un objet est obtenue au moyen de l'opérateur new appliqué à la classe dont on veut fabriquer un exemplaire. Exemple :

La partie droite de l'expression d'affectation : new Client(nom, adresse) est une sous-expression dont l'évaluation provoque :
  1. la création d'un objet de la classe Client,
  2. L'initialisation de cet objet au moyen des valeurs désignées par nom et adresse passées en paramètres.
  3. Le renvoi du nom interne du nouvel objet créé, résultat de l'évaluation.
Après l'évaluation de l'affectation proprement dite, la variable unClient contient le nom interne (la référence) du nouvel objet.

L'initialisation de l'objet est effectuée par le code d'une méthode spéciale appelée constructeur. Cette méthode est définie dans la classe concernée et porte toujours le nom de cette classe, ici Client.
Les paramètres formels déclarés pour cette méthode spéciale doivent permettre d'initialiser correctement les caractéristiques (propriétés) de chaque nouvel objet créé.

Plusieurs constructeurs peuvent exister pour une même classe : chacun d'eux permet dans ce cas d'initialiser d'une façon différente les valeurs des propriétés de l'objet créé. Chaque constructeur d'une classe donnée possède donc une liste d'arguments différente de celle des autres constructeurs de la même classe. En revanche, tous les constructeurs d'une classe donnée portent un même nom : celui de la classe.

3.2. Utilisation des objets

Une fois créé, un objet peut être utilisé par un programme (ou par un autre objet). L'utilisation d'un objet peut répondre selon le cas à différents besoins : Important : quel que soit le cas, l'utilisation ou la manipulation d'un objet se fait au moyen des opérations ou méthodes qui ont été définies pour cet objet dans la classe (le modèle) dont il est issu.