La classe Ovni et ses dérivées

Commençons par observer le résultat final. L'applet affiche un paysage sur lequel nous faisons apparaître de la neige ou de la pluie. La classe Ovni va représenter un élément susceptible de jouer le rôle de la neige ou de la pluie.

La classe abstraite Ovni

Analyse des besoins

Nous appellerons Objet Volant Non Identifié (Ovni) un objet susceptible de jouer le rôle d'un flocon de neige ou d'une goutte de pluie. Cet objet doit être capable de se dessiner et de bouger, il aura donc une méthode dessine et une méthode bouge. Ces deux méthodes ferons appel à plusieurs variables donnant la position de l'objet, la direction dans laquelle il se déplace et la vitesse avec laquelle il se déplace.

Le code source java

Entête

Nous devons commencer par annoncer l'utilisation du package java.awt (pour utiliser la classe Graphics). Puis nous déclarons les variables utilisées.

    import java.awt.*;
 
    public class Ovni {
     int x,y;           //position de l'objet
     double angle;      //direction de déplacement
     int vitesse;       //vitesse de déplacement

Constructeurs

Nous allons donner deux constructeurs à notre classe: un constructeur générique et un constructeur choisissant une position de départ au hasard dans un rectangle. Une fonction hasard nous fournira des nombres entiers au hasard dans des limites choisies.

     public Ovni() {
      x=0; y=0; vitesse=0; angle=0;
     }
 
     public Ovni(int larg, int haut) {
      this();
      x=hasard(larg);  //rester dans les limites horizontales
      y=hasard(haut);  //rester dans les limites verticales
      vitesse=hasard(4)+1;
     }
 
     public int hasard(int n) {
      return (int)(Math.floor(Math.random()*n));
     }

Méthodes

La méthode dessine est vide, nous ne connaissons pas encore la nature de l'objet volant.

     public void dessine(Graphics g) {
     }

La méthode bouge peut être écrite, elle consiste simplement à modifier les coordonnées x et y de l'objet en tenant compte des limites dans lesquelles il évolue.

     public void bouge(int larg, int haut) {
      //nouvelle position
      x=(int)(x*1.0+vitesse*Math.cos(angle));
      y=(int)(y*1.0+vitesse*Math.sin(angle));
      //en cas de sortie du cadre, on remet à 0
      if (x>larg) {
       x=0;
       y=hasard(haut);
      } 
      if (y>haut) {
       y=0;
       x=hasard(larg);
      } 
      if (x<0) {
       x=larg;
       y=hasard(haut);
      }
      if (y<0) {
       y=haut;
       x=hasard(larg);
      } 
     }

Conclusion

La classe Ovni est terminée. Il reste à lui donner différentes apparences dans des classes dérivées. Celles-ci auront simplement à gérer la méthode dessine.

La classe Flocon

La classe Flocon va donner un contenu concret à la classe Ovni en dessinant un flocon de neige. Elle utilisera une variable supplémentaire r qui représentera le rayon du flocon. La vitesse d'un flocon dépendra de son rayon. Sa direction sera pi/2 pour qu'il tombe verticalement.

Ceci nous donne le code suivant :

    import java.awt.*;
 
    public class Flocon extends Ovni {
 
     int r=0; 
     //constructeur
     public Flocon(int larg, int haut) {
      super(larg,haut);
      r=hasard(4)+1;
      vitesse=r;
      angle=Math.PI/2;  
     }
     //méthode de dessin
     public void dessine(Graphics g) {
      g.setColor(Color.white);
      g.fillOval(x,y,r,r);
     }
 
    }

La classe pluie

La classe Pluie va donner un nouveau contenu concret à la classe Ovni en dessinant une goutte de pluie. Elle utilisera une variable supplémentaire lg qui représentera la longueur du segment représentant cette goutte. La vitesse d'une goutte dépendra de sa longueur. Sa direction sera pi/2+pi/10 pour qu'elle tombe de façon oblique (à cause du vent).

Ceci nous donne le code suivant :

    import java.awt.*;
 
    public class Pluie extends Ovni {
 
     int lg=0;
 
     public Pluie(int larg, int haut) {
      super(larg,haut);
      lg=hasard(6)+6;
      vitesse=lg/2;
      angle=Math.PI/2+Math.PI/10;
     }
 
     public void dessine(Graphics g) {
      g.setColor(Color.lightGray);
      int x1=(int)(x*1.0+lg*Math.cos(angle));
      int y1=(int)(y*1.0+lg*Math.sin(angle));
      g.drawLine(x,y,x1,y1);
     }
 
    }

Suite...

Nous disposons de deux types d'objet dérivés de la classe Ovni qui ont toutes les capacités nécessaires pour être utilisés. Nous allons maintenant créer la classe Paysage qui contiendra des Ovnis et les fera bouger.



Retour au menu