package personnages; import java.awt.Color; import java.awt.Graphics; import java.awt.Component; import java.awt.Rectangle; public class Bonhomme 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; private static final int BONJOURD = 15; private static final int BONJOURG = 16; /** appelle le constructeur sans pafametre de sa super-classe. */ public Bonhomme() { super(); } /** constructeur de la classe @param zone composant graphique dans lequel le bonhomme devra s'afficher. @param x abscisse d'un point central du bonhomme. @param y ordonnee d'un point central du bonhomme. @param taille la hauteur du bonhomme en pourcentage de la hauteur du composant. Cette taille est limitee a 100. @param couleur la couleur du bonhomme */ public Bonhomme(Component zone, int x, int y, int taille, Color couleur, boolean cyclique) { super(zone, x, y, taille, couleur, cyclique); } /** dessine le bonhomme en fonction des parametres. Le bonhomme 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. param g le contexte graphique avec lequel le personnage est dessine */ public void dessinerP(Graphics g) { float bT = donnebaseTaille(); int bT1 = (int)(2 * bT); int bT2 = (int)(2 * bT); int bT3 = (int)(3 * bT); int bT4 = (int)(4 * bT); int bT5 = (int)(5 * bT); int bT8 = (int)(8 * bT); int bT9 = (int)(9 * bT); int bT10 = (int)(10 * bT); int bT14 = (int)(14 * bT); int bT15 = (int)(15 * bT); int bT16 = (int)(16 * bT); int bT17 = (int)(17 * bT); int bT18 = (int)(18 * bT); int bT20 = (int)(20 * bT); int bT23 = (int)(23 * bT); int bT25 = (int)(25 * bT); int bT33 = (int)(33 * bT); g.setColor(getCouleur()); switch(silhouette) { case REPOS : g.drawLine(x, y - bT10, x , y - bT25); g.drawOval(x - bT4 , y - bT33, bT8, bT8); g.drawLine(x, y - bT23, x - bT5, y - bT10); g.drawLine(x, y - bT23, x + bT5, y- bT10); g.drawLine(x, y- bT10, x - bT3, y + bT10); g.drawLine(x, y- bT10, x + bT3, y + bT10); break; case PAS_DROITE1 : g.drawLine(x, y- bT10, x , y - bT25); g.drawOval(x - bT4 , y - bT33, bT8, bT8); g.drawLine(x, y - bT23, x - bT5, y- bT10); g.drawLine(x, y - bT23, x + bT5, y - bT10); g.drawLine(x, y - bT10, x - bT2, y + bT3); g.drawLine(x - bT2, y + bT3, x - bT10, y + bT8); g.drawLine(x, y - bT10, x + bT3, y); g.drawLine(x + bT3, y, x + bT3, y + bT10); break; case PAS_DROITE2 : g.drawLine(x, y- bT10, x , y - bT25); g.drawOval(x - bT4, y - bT33, bT8, bT8); g.drawLine(x, y - bT23, x - bT5, y- bT10); g.drawLine(x, y - bT23, x + bT5, y- bT10); g.drawLine(x, y- bT10, x, y); g.drawLine(x, y, x - bT2, y + bT10); g.drawLine(x, y- bT10, x + bT9, y - bT1); g.drawLine(x + bT9 , y - bT1, x + bT10, y + bT8); break; case PAS_GAUCHE1 : g.drawLine(x, y - bT10, x , y - bT25); g.drawOval(x - bT4 , y - bT33, bT8, bT8); g.drawLine(x, y - bT23, x - bT5, y - bT10); g.drawLine(x, y - bT23, x + bT5, y - bT10); g.drawLine(x, y - bT10, x + bT2, y + bT3); g.drawLine(x + bT2, y + bT3, x + bT10, y + bT8); g.drawLine(x, y - bT10, x - bT3, y); g.drawLine(x - bT3, y, x - bT3, y + bT10); break; case PAS_GAUCHE2 : g.drawLine(x, y - bT10, x , y - bT25); g.drawOval(x - bT4 , y - bT33, bT8, bT8); g.drawLine(x, y - bT23, x - bT5, y - bT10); g.drawLine(x, y - bT23, x + bT5, y - bT10); g.drawLine(x, y - bT10, x, y); g.drawLine(x, y, x + bT2, y + bT10); g.drawLine(x, y - bT10, x - bT9, y - bT1); g.drawLine(x - bT9 , y - bT1, x - bT10, y + bT8); break; case SAUTG : case SAUTD : g.drawLine(x, y + bT15, x , y); g.drawOval(x - bT4 , y - bT8, bT8, bT8); g.drawLine(x, y + bT2, x - bT8, y + bT2); g.drawLine(x, y + bT2, x + bT8, y + bT2); g.drawLine(x, y + bT15, x - bT20, y + bT15); g.drawLine(x, y + bT15, x + bT20, y + bT15); break; case BONJOURD : g.drawLine(x, y - bT10, x , y - bT25); // corps g.drawOval(x - bT4 ,y - bT33, bT8, bT8); // tete g.drawLine(x, y - bT23, x - bT2, y- bT10); // bras g.drawLine(x, y - bT23, x + bT5, y - bT16); // bras g.drawLine(x + bT5, y - bT16, x + bT15, y - bT17); // avant-bras g.fillOval(x + bT14 , y - bT18, bT2, bT2); // poing g.drawLine(x, y - bT10, x - bT3, y + bT10); // jambe g.drawLine(x, y - bT10, x + bT3, y + bT10); // jambe break; case BONJOURG : g.drawLine(x, y - bT10, x , y - bT25); // corps g.drawOval(x - bT4 ,y - bT33, bT8, bT8); // tete g.drawLine(x, y - bT23, x + bT2, y- bT10); // bras g.drawLine(x, y - bT23, x - bT5, y- bT16); // bras g.drawLine(x - bT5, y - bT16, x - bT15, y - bT17); // avant-bras g.fillOval(x - bT16 , y - bT18, bT2, bT2); // poing g.drawLine(x, y - bT10, x - bT3, y + bT10); // jambe g.drawLine(x, y - bT10, x + bT3, y + bT10); // jambe break; } } /** retourne, losque le bonhomme marche, la silhouette qui suit la silhouette actuelle. 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 direction = getDirection(); int silhouetteSuivante = silhouette; if (direction == DROITE) switch(silhouette) { case REPOS : case PAS_DROITE2 : silhouetteSuivante = PAS_DROITE1; break; case PAS_DROITE1 : silhouetteSuivante = PAS_DROITE2; break; case BONJOURG : case BONJOURD : 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 BONJOURG : case BONJOURD : case PAS_DROITE1: case PAS_DROITE2: silhouetteSuivante = REPOS; break; } return silhouetteSuivante; } /** donne la valeur abslolue de la difference d'ordonnee entre l'abscisse x du bonhomme et l'abscisse de sa main lorsqu'il a le bras tendu pour dire bonjour. */ public int getLongueurBras() { float bT = donnebaseTaille(); return (int)(15 * bT); } /** retourne le rectangle circonscrit au bonhomme, selon sa silhouette et sa position. */ public Rectangle getRectangle() { int x = getX(), y = getY(); float bT = donnebaseTaille(); int bT4 = (int)(4 * bT); int bT5 = (int)(5 * bT); int bT8 = (int)(8 * bT); int bT10 = (int)(10 * bT); int bT15 =(int)(15 * bT); int bT16 =(int)(16 * bT); int bT20 = (int)(20 * bT); int bT25 = (int)(25 * bT); int bT33 = (int)(33 * bT); int bT40 = (int)(40 * bT); int bT43 = (int)(43 * bT); switch(silhouette) { case REPOS : return new Rectangle(x - bT5, y - bT33, bT10, bT43); case PAS_DROITE1: return new Rectangle(x - bT10, y - bT33, bT15, bT43); case PAS_DROITE2 : return new Rectangle(x - bT5, y - bT33, bT15, bT43); case PAS_GAUCHE1: return new Rectangle(x - bT5, y - bT33, bT15, bT43); case PAS_GAUCHE2: return new Rectangle(x - bT10, y - bT33, bT15, bT43); case SAUTG : case SAUTD : return new Rectangle(x - bT20, y - bT8, bT40, bT25); case BONJOURD : return new Rectangle(x - bT4, y - bT33, bT20, bT43); case BONJOURG : return new Rectangle(x - bT16, y - bT33, bT20, bT43); } return null; } /** fait tendre la main au bonhomme (vers la droite si la direction du bonhomme est DROITE et vers la gauche sinon) pour qu'il dise bonjour a un autre bonhomme de la meme taille et de la meme ordonnee mais de direction opposee, a condition que ces deux bonhommes soient exactement a la bonne distance(2 * getLongueurBras()) et leve ensemble le bras. */ public void direBonjour() { if (getDirection() == DROITE) faireMouvement(BONJOURD, getX(), getY()); else faireMouvement(BONJOURG, getX(), getY()); dormir(2000); } private float donnebaseTaille() { return (float)zone.getBounds().height * (float)getTaille() / 4300; } }