Licence profesionnelle TAI (Technologie des Applications Internet)
TD de Programmation Orientée Objet
n° 8
Introduction à l'héritage et Tableaux

par Philippe.Genoud@imag.fr.

Objectifs : il s’agit de faire vos premiers pas avec l’Héritage ainsi que d’expérimenter avec les tableaux en Java.

Animation d’une "chenille"

Sur le modèle de l’application AppliVisages vue lors du TD n°1, il s’agit de réaliser une application permettant d’animer une ou plusieurs "chenilles" se déplaçant dans une fenêtre sur l'écran, chaque chenille se déplaçant de manière aléatoire et "rebondissant" sur les bords de la fenêtre.

1. Représentation d’une chenille

Une chenille est constituée d’une tête suivie d’une suite d’anneaux (figure 1).

- figure 1 : représentation d’une chenille composée de 7 anneaux -

2 - Animation d’une chenille

2.1 Création d’une chenille

A l'instant initial, la chenille est parallèle à l'axe Ox, orientée vers la droite, et située au milieu de la fenêtre de dessin (figure 2).

le repère associé à une fenêtre de dessin a son origine dans le coin supérieur gauche de la fenêtre. Les points-écran (pixels) à l’intérieur d’une fenêtre sont à coordonnées entières. La taille d’une fenêtre indique la taille de la zône d’affichage, elle ne tient pas compte du cadre qui entoure celle-ci.

figure 2 : Position initiale d’une chenille dans une fenêtre de largeur xMax et hauteur yMax.

2.2 Avancée d’une chenille

A chaque étape de l'animation le déplacement de la chenille s'effectue de la manière suivante :

si la chenille est sur un bord de la fenêtre (c'est-à-dire si la distance du centre de la tête
     au bord de  la fenêtre est inférieure ou égale au rayon de la tête)    alors
               la chenille effectue une déviation de cap de +90°
sinon
               la chenille  effectue une déviation de cap d’un angle tiré au hasard 
              dans l’intervalle   [-30°    +30°]
finsi

les anneaux de la chenille se décalent d'une position :
   - l'anneau    n° i prend la position de l'anneau n° i-1 (i = N-1, N-2, ... ,1)
    - l'anneau    n° 0 prend la position de la tête
la tête se déplace d'une distance R selon la direction définie par le nouveau cap

 

figure 3 : Déplacement d’une chenille (en italique les éléments de la chenille à l’instant t,
en normal les éléments de la chenille à l’instant t+1)

 

3 Modélisation JAVA d’une Chenille

Pour modéliser une chenille en langage JAVA on décide de définir trois classes d’objets :

3.1 La classe Anneau

Un Anneau est un objet défini par trois attributs (les coordonnées x,y du centre du cercle le représentant et le rayon r de ce cercle) et capable de se placer à une position donnée, de s’afficher. La spécification du constructeur et des méthodes de la classe Anneau vous est donnée ci-dessous.

/**
* crée un Anneau en fixant sa position initiale et son rayon
* @param xInit abscisse du centre de l’anneau
* @param yInit ordonnée du centre de l’anneau
* @param r rayon de l’anneau
*/
public Anneau(int xInit, int yInit, int r) 
/**
* retourne abscisse du centre de l’anneau
* @return abscisse du centre de l’anneau
*/
public int getX() 
/**
* retourne ordonnée du centre de l’anneau
* @return ordonnée du centre de l’anneau
*/
public int getY() 
/** positionne le centre de l’anneau en un point donné
* @param px abscisse du point
* @param py ordonnée du point
*/
public void placerA(int px, int py)
/**
* affiche l’anneau en le matérialisant par un cercle noir
* @param g objet de classe Graphics qui prend en charge la gestion
* de l’affichage dans la fenêtre de dessin
*/
public void dessiner(Graphics g)

Pour dessiner un cercle on utilisera le méthode drawOvalde la classe java.awt.Graphics , méthode définie comme suit :

public abstract void drawOval(int x, int y, int width, int height)
Draws the outline of an oval. The result is a circle or ellipse that fits within the rectangle specified by the x, y, width, and height arguments. The oval covers an area that is width + 1 pixels wide and height + 1 pixels tall.

Parameters:
x - the x coordinate of the upper left corner of the oval to be drawn.
y - the y coordinate of the upper left corner of the oval to be drawn.
width - the width of the oval to be drawn.
height - the height of the oval to be drawn.

3.2 La classe Tête

La classe Tête est définie comme une sous-classe de la classe Anneau. En effet comme un anneau, une tête est définie par trois attributs (les coordonnées de son centre et son rayon) et est capable de se placer à une position donnée, de s’afficher et de s’effacer. Les différences sont les suivantes :

La classe Tête enrichit la classe Anneau d’un nouvel attribut : cap un réel (double) qui définit la direction de déplacement de la tête.

La position, le rayon et le cap initial d’une tête sont fixés à sa création (donnés en paramètre du constructeur).

La méthode dessiner est redéfinie de manière ne plus afficher un cercle (noir ou blanc) selon le cas mais un disque (cercle plein) (utiliser la méthode fillOval de java.awt.Graphics en lieu et place de drawOval).

De plus trois nouvelles méthodes sont ajoutées :

x’ = x + R * cos(cap) et y’ = y + R * sin(cap)

3.3 La classe Chenille

La classe Chenille définit quatre attributs pour une chenille (sa tête, la liste de ses anneaux stockée dans un tableau, la taille en x et en y de la fenêtre dans laquelle la chenille est dessinée). Elle possède un constructeur permettant à partir d’une taille de fenêtre donnée en paramètre de créer une chenille en position initiale (horizontale avec le centre de la tête placé au centre de la fenêtre). Elle possède également 2 méthodes publiques: une pour dessiner la chenille, l’autre pour faire effectuer à la chenille un déplacement élémentaire selon l’algorithme donné au § 2.2.

4. Travail à effectuer

Avant toute chose, créez une répertoire (td3 ou chenille, à votre choix) dans lequel vous vous placerez pour réaliser cette application.

  1. Ecrire le code des classes Anneau, Tete et Chenille.
  2. Modifier l’application AppliVisage1 de manière à ce que au lieu d’animer un VisageRond , celle-ci anime votre Chenille.
    1. Pour cela recopiez dans votre répertoire de travail les classes AppliVisage1.java et Dessin.java vues lors du Td n°1,
    2. Modifiez les en conséquence (Chenille remplace VisageRond).
  3. Une fois que votre application fonctionne avec une Chenille, modifiez la de manière à animer deux, voire trois, chenilles.

Pour ceux à qui il reste du temps ou qui veulent en faire plus :

a) Modifier l'application permettant d'animer plusieurs chenilles de manière à ce que le nombre de chenille puisse être fixé comme argument lors du lancement du programme (argument de la ligne de comandes).

indications :

b) Imaginez de nouveaux types de chenilles. Par exemple des chenilles colorées, des chenilles mutantes dont le nombre d’anneaux varie au cours de leur existence (par exemple ajout d’un anneau lorsque l’un des bords est atteint, sauf dans le cas où il s’agit du bord supérieur de la fenêtre, dans ce dernier cas la chenille perd un anneau).

Ecrire les classes représentant ce (ces) nouveau(x) type(s) de chenille et modifiez l’application de sorte à ce que plusieurs chenilles d’espèces différentes soient animées simultanément.

c) Déposez dans la zone de dessin des " salades " matérialisées par des disques verts. Programmez une nouvelle espèce de chenilles, les chenilles gourmandes, dont la taille (diamètre des anneaux) croit chaque fois qu’elles " mangent " une salade (c’est à dire chaque fois que la tête de la chenille passe sur une salade). Bien sûr, pour ne pas faire éclater les chenilles on prendra soin de retirer les salades au fur et à mesure que les chenilles les dévorent.

Modifiez les classes existantes et écrivez les nouvelles classes nécessaires pour cette application.