package personnages; import java.awt.Color; import java.awt.Graphics; import java.awt.Component; import java.awt.Rectangle; /** Modelise un chien dans une application graphique */ public class Chien extends Personnage { private static final int PAS_DROITE1=11; private static final int PAS_DROITE2=12; private static final int PAS_GAUCHE1=13; private static final int PAS_GAUCHE2=14; /** appelle le constructeur sans parametre de sa super-classe.*/ public Chien() { super(); } /** constructeur de la classe @param zone composant graphique dans lequel le chien devra s'afficher. @param x abscisse d'un point central du chien. @param y ordonnee d'un point central du chien. @param taille : la hauteur du chien en pourcentage de la hauteur du composant. Cette taille est limitee a 100. @param couleur la couleur du chien. */ public Chien(Component zone, int x, int y,int taille, Color couleur, boolean cyclique) { super(zone,x,y,taille,couleur, cyclique); } /** dessine le chien en fonction des parametres. et en particulier de sa silhouette. Le chien dispose de deux silhouettes qu'il alterne lorsqu'il marche vers la droite et deux pour la gauche. Il dispose aussi d'une silhouete de position de repos, d'une silhouette ou il dit bonjour vers la droite (il tend la main) et d'une silhouette ou il dit bonjour vers la gauche. Le personnage dispose enfin de deux silhouettes identiques correspondant aux valeurs SAUTG et SAUTD de la variable silhouette. */ public void dessinerP(Graphics g) { float bT=donnebaseTaille(); int bT2 = (int)(2 * bT); int bT3 = (int)(3 * bT); int bT4 = (int)(4 * bT); int bT5 = (int)(5 * bT); int bT6 = (int)(6 * bT); int bT7 = (int)(7 * bT); int bT8 = (int)(8 * bT); int bT9 = (int)(9 * bT); int bT10 = (int)(10 * bT); int bT11 = (int)(11 * bT); int bT14 = (int)(14 * bT); int bT15 = (int)(15 * bT); int bT17 = (int)(17 * bT); int bT19 = (int)(19 * bT); int bT20 = (int)(20 * bT); int bT22 = (int)(22 * bT); int bT23 = (int)(23 * bT); g.setColor(getCouleur()); switch(silhouette) { case REPOS : g.drawLine(x, y, x + bT2 , y + bT2); g.drawLine(x, y, x , y - bT5); g.drawOval(x - bT3 ,y - bT11, bT6, bT6); g.drawLine(x, y, x - bT2, y + bT10); g.drawLine(x, y, x + bT2, y + bT10); g.drawLine(x + bT2, y + bT2, x, y + bT10); g.drawLine(x + bT2, y + bT2, x + bT4, y + bT10); break; case PAS_DROITE1 : g.drawLine(x - bT10, y, x + bT10 , y); g.drawLine(x + bT10, y, x + bT14 , y - bT8); g.drawOval(x + bT14 ,y - bT11, bT8, bT6); g.drawLine(x - bT10, y, x - bT11, y + bT10); g.drawLine(x - bT10, y, x- bT9, y + bT10); g.drawLine(x + bT10, y, x + bT11, y + bT10); g.drawLine(x + bT10, y, x + bT9, y + bT10); break; case PAS_DROITE2 : g.drawLine(x - bT10, y, x + bT10 , y); g.drawLine(x + bT10, y, x + bT15 , y - bT4); g.drawOval(x + bT15 , y - bT7, bT8, bT6); g.drawLine(x - bT10, y, x - bT14, y + bT10); g.drawLine(x - bT10, y, x - bT6, y + bT10); g.drawLine(x + bT10, y, x + bT14, y + bT10); g.drawLine(x + bT10, y, x + bT6, y + bT10); break; case PAS_GAUCHE1 : g.drawLine(x - bT10, y, x + bT10 , y); g.drawLine(x -bT10, y, x - bT14 , y - bT8); g.drawOval(x - bT22, y - bT11, bT8, bT6); g.drawLine(x - bT10, y, x - bT11, y + bT10); g.drawLine(x - bT10, y, x - bT9, y + bT10); g.drawLine(x + bT10, y, x + bT11, y + bT10); g.drawLine(x + bT10, y, x + bT9, y + bT10); break; case PAS_GAUCHE2 : g.drawLine(x - bT10, y, x + bT10 , y); g.drawLine(x - bT10, y, x - bT15 , y - bT4); g.drawOval(x - bT23 ,y - bT7, bT8, bT6); g.drawLine(x - bT10, y, x - bT14, y + bT10); g.drawLine(x - bT10, y, x - bT6, y + bT10); g.drawLine(x + bT10, y, x +bT14, y + bT10); g.drawLine(x + bT10, y, x + bT6, y + bT10); break; case SAUTD : g.drawLine(x - bT10, y, x + bT10 , y); g.drawLine(x + bT10, y, x + bT15 , y - bT2); g.drawOval(x + bT15 , y - bT5, bT8, bT6); g.drawLine(x - bT10, y, x - bT19, y + bT3); g.drawLine(x - bT10, y, x - bT20, y + bT2); g.drawLine(x +bT10, y, x + bT17, y + bT3); g.drawLine(x + bT10, y, x + bT3, y + bT3); break; case SAUTG : g.drawLine(x - bT10, y, x + bT10 , y); g.drawLine(x - bT10, y, x - bT15 , y - bT2); g.drawOval(x - bT23 , y - bT5, bT8, bT6); g.drawLine(x + bT10, y, x + bT19, y + bT3); g.drawLine(x + bT10, y, x+ bT20, y + bT2); g.drawLine(x - bT10, y, x - bT17, y + bT3); g.drawLine(x - bT10, y, x - bT3, y + bT3); break; } } /** @return le rectangle circonscrit au chien, selon sa silhouette et sa position. */ public Rectangle getRectangle() { int x=getX(), y=getY(); float bT=donnebaseTaille(); int bT3 = (int)(3 * bT); int bT5 = (int)(5 * bT); int bT7 = (int)(7 * bT); int bT8 = (int)(8 * bT); int bT11 =(int)(11 * bT); int bT14 = (int)(14 * bT); int bT17 = (int)(17 * bT); int bT20 = (int)(20 * bT); int bT22 = (int)(22 * bT); int bT21 = (int)(21 * bT); int bT23 = (int)(23 * bT); int bT33 = (int)(33 * bT); int bT37 = (int)(37 * bT); int bT43 = (int)(43 * bT); switch(silhouette) { case REPOS : return new Rectangle(x - bT3, y - bT11,(int)(7*bT),bT21); case PAS_DROITE1: return new Rectangle(x - bT11, y - bT11, bT33, bT21); case PAS_DROITE2 : return new Rectangle(x - bT14, y - bT7, bT37, bT17); case PAS_GAUCHE1: return new Rectangle(x - bT22, y - bT11, bT33, bT21); case PAS_GAUCHE2: return new Rectangle(x - bT23 , y - bT7, bT37, bT17); case SAUTG : return new Rectangle(x - bT23, y - bT5, bT43, bT8); case SAUTD : return new Rectangle(x - bT20, y - bT5, bT43, bT8); } return null; } /** change, losque le chien marche, la silhouette pour la silhouette suivante selon cette marche. Si la direction est la droite : - dans le cas ou la silhouette actuelle est la silhouette de repos, ou la seconde silhouette de marche vers la droite, la silhouette suivante est la premiere silhouette de marche vers la droite. - dans le cas ou la silhouette actuelle est la premiere silhouette de marche vers la droite, la silhouette suivante est la seconde silhouette de marche vers la droite. - dans le cas ou la silhouette actuelle est une silhouette qui dit bonjour, ou bien une silhouette qui marche vers la gauche, la silhouette suivante est la silhouette de repos. Si la direction est la gauche : - dans le cas ou la silhouette actuelle est la silhouette de repos, ou la seconde silhouette de marche vers la gauche, la silhouette suivante est la premiere silhouette de marche vers la gauche. - dans le cas ou la silhouette actuelle est la premiere silhouette de marche vers la gauche, la silhouette suivante est la seconde silhouette de marche vers la gauche. - dans le cas ou la silhouette actuelle est une silhouette qui dit bonjour, ou bien une silhouette qui marche vers la droite, la silhouette suivante est la silhouette de repos.*/ public int silhouetteSuivante() { int silhouetteSuivante = silhouette; int direction=getDirection(); if (direction==DROITE) switch(silhouette) { case REPOS : case PAS_DROITE2 : silhouetteSuivante=PAS_DROITE1; break; case PAS_DROITE1 : silhouetteSuivante=PAS_DROITE2; break; case PAS_GAUCHE1 : case PAS_GAUCHE2 : silhouetteSuivante=REPOS; break; } else switch(silhouette) { case REPOS : case PAS_GAUCHE2 : silhouetteSuivante = PAS_GAUCHE1; break; case PAS_GAUCHE1 : silhouetteSuivante = PAS_GAUCHE2; break; case PAS_DROITE1: case PAS_DROITE2: silhouetteSuivante = REPOS; break; } return silhouetteSuivante; } private float donnebaseTaille() { return (float)zone.getBounds().height*(float)getTaille()/4000; } }