Licence profesionnelle TAI
(Technologie des Applications Internet)
TD de Programmation Orientée Objet
n° 8
Introduction à l'héritage et Tableaux
Objectifs : il sagit de faire vos premiers pas avec lHéritage ainsi que dexpérimenter avec les tableaux en Java.
Sur le modèle de lapplication AppliVisages vue lors du TD n°1, il sagit de réaliser une application permettant danimer 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.
Une chenille est constituée dune tête suivie dune suite danneaux (figure 1).
- figure 1 : représentation dune chenille composée de 7 anneaux -
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) à lintérieur dune fenêtre sont à coordonnées entières. La taille dune fenêtre indique la taille de la zône daffichage, elle ne tient pas compte du cadre qui entoure celle-ci. |
figure 2 : Position initiale dune chenille dans une fenêtre de largeur xMax et hauteur yMax. |
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 dun angle tiré au hasard dans lintervalle [-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 dune chenille (en italique les éléments
de la chenille à linstant t,
en normal les éléments
de la chenille à linstant t+1)
Pour modéliser une chenille en langage JAVA on décide de définir trois classes dobjets :
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 safficher. 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 lanneau * @param yInit ordonnée du centre de lanneau * @param r rayon de lanneau */ public Anneau(int xInit, int yInit, int r)
/** * retourne abscisse du centre de lanneau * @return abscisse du centre de lanneau */ public int getX()
/** * retourne ordonnée du centre de lanneau * @return ordonnée du centre de lanneau */ public int getY()
/** positionne le centre de lanneau en un point donné * @param px abscisse du point * @param py ordonnée du point */ public void placerA(int px, int py)
/** * affiche lanneau en le matérialisant par un cercle noir * @param g objet de classe Graphics qui prend en charge la gestion * de laffichage 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 safficher et de seffacer. Les différences sont les suivantes :
La classe Tête enrichit la classe Anneau dun 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 dune 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 :
une méthode devierCap(double deltaC) qui permet de modifier le cap de la tête en lui ajoutant la déviation définie par le paramètre deltaC.
une méthode atteintBord(int xMax, int yMAX) qui retourne un booléen dont la valeur est vrai (true) si le centre de la tête est à une distance <= R de lun des bords de la fenêtre de taille xMax, yMax et faux (false) sinon.
une méthode deplacerSelonCap() qui modifie le centre de la tête en lui appliquant un déplacement de longueur R dans la direction définie par le cap. Pour cela, on calcule la nouvelle position du centre de la tête à laide de la formule suivante :
x = x + R * cos(cap) et y = y + R * sin(cap)
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 dune 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, lautre pour faire effectuer à la chenille un déplacement élémentaire selon lalgorithme donné au § 2.2.
Avant toute chose, créez une répertoire (td3 ou chenille, à votre choix) dans lequel vous vous placerez pour réaliser cette application.
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 danneaux varie au cours de leur existence (par exemple ajout dun anneau lorsque lun des bords est atteint, sauf dans le cas où il sagit 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 lapplication de sorte à ce que plusieurs chenilles despè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 quelles " mangent " une salade (cest à 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.