Posted By

donfips on 01/23/10


Tagged

street Strasse HS-RM


Versions (?)

House shape


 / Published in: Java
 

  1. public class Haus extends ShapeBase
  2. {
  3. private java.awt.Color mauerfarbe;
  4. private boolean lichtAn = false;
  5.  
  6. /**
  7. * Konstruktor
  8. *
  9. * @param x X-Koordinate des Hauses
  10. * @param y Y-Koordinate des Hauses
  11. * @param breite Breite des Hauses
  12. * @param hoehe Höhe des Hauses
  13. * @param mauerfarbe Mauerfarbe
  14. */
  15. public Haus(int x, int y, int breite, int hoehe, Color mauerfarbe)
  16. {
  17. super(x, y, breite, hoehe);
  18. this.mauerfarbe = mauerfarbe;
  19. }
  20.  
  21. /**
  22. * Simuliert einen Mausklick mit den Koordinaten x, y
  23. * und schaltet damit das Licht des Hauses ein oder aus
  24. *
  25. * @param x X-Koordinate des Klicks
  26. * @param y Y-Koordinate des Klicks
  27. */
  28. public void lichtAendern(int x, int y)
  29. {
  30. if (x >= this.getX() && y >= this.getY() && x <= this.getX() + this.getBreite() - 1 && y <= this.getY() + this.getHoehe() - 1) {
  31. this.lichtAn = !this.lichtAn;
  32. }
  33. }
  34.  
  35. /**
  36. * Zeichnet das Haus auf der Grafikausgabe mit den erhaltenen
  37. * Werten von paintRoof, paintWalls und paintWindows.
  38. *
  39. * @param g Grafik-Objekt
  40. */
  41. public void paint(Graphics g)
  42. {
  43. Polygon roof = this.paintRoof(g);
  44. Polygon walls = this.paintWalls(g, roof);
  45. Polygon door = this.paintDoor(g, walls);
  46. this.paintWindows(g, walls, door);
  47. }
  48.  
  49. /**
  50. * Zeichnet das Dach ausgehend von der Breite des Hauses
  51. *
  52. * @param g Grafik-Objekt
  53. * @return Übergibt das Polygon-Objekt des Daches an die paint-Methode
  54. */
  55. private Polygon paintRoof(Graphics g)
  56. {
  57. // Dach: 50% der Breite
  58. int roofHeight = (int)(this.getBreite() * 0.5);
  59. Polygon dach = new Polygon();
  60. // First
  61. dach.addPoint(this.getAbsoluteX(this.getBreite() / 2), this.getAbsoluteY(0));
  62. // Ecken
  63. dach.addPoint(this.getAbsoluteX(0), this.getAbsoluteY(roofHeight));
  64. dach.addPoint(this.getAbsoluteX(this.getBreite()), this.getAbsoluteY(roofHeight));
  65. g.setColor(Color.RED);
  66. g.fillPolygon(dach);
  67. return dach;
  68. }
  69.  
  70. /**
  71. * Zeichnet die Wände ausgehend von den Parametern des Hauses und des Dachs
  72. *
  73. * @param g Grafik-Objekt
  74. * @param dach Polygon-Objekt des Daches zur Bestimmung der Position
  75. * @return Übergibt das Polygon-Objekt der Wände an die paint-Methode
  76. */
  77. private Polygon paintWalls(Graphics g, Polygon roof)
  78. {
  79. // Breite - 20%
  80. int wallWidth = (int)(this.getBreite() - this.getBreite() * 0.2);
  81. int wallIndent = (int)((this.getBreite() - wallWidth) / 2);
  82. Polygon wall = new Polygon();
  83. Rectangle roofBox = roof.getBounds();
  84.  
  85. // Ecken
  86. wall.addPoint(this.getAbsoluteX(wallIndent), roofBox.y + roofBox.height);
  87. wall.addPoint(this.getAbsoluteX(this.getBreite() - wallIndent), roofBox.y + roofBox.height);
  88. wall.addPoint(this.getAbsoluteX(this.getBreite() - wallIndent), this.getAbsoluteY(this.getHoehe()));
  89. wall.addPoint(this.getAbsoluteX(wallIndent), this.getAbsoluteY(this.getHoehe()));
  90. g.setColor(this.mauerfarbe);
  91. g.fillPolygon(wall);
  92. return wall;
  93. }
  94.  
  95. /**
  96. * Zeichnet die Tür relativ zur Position des Hauses innherhalb der wallBox
  97. *
  98. * @param g Grafik-Objekt
  99. * @param wall Polygon-Objekt der Wände zur Bestimmung der Position
  100. * @return Übergibt das Polygon-Objekt der Tür an die paint-Methode
  101. */
  102. private Polygon paintDoor(Graphics g, Polygon walls)
  103. {
  104. // Breite = 30
  105. int doorWidth = 30;
  106. int doorHeight = (int)(doorWidth * 2);
  107. Polygon door = new Polygon();
  108. Rectangle wallBox = walls.getBounds();
  109.  
  110. // Ecken
  111. door.addPoint((int)wallBox.getX() + (int)(0.5 * doorWidth), (int)(wallBox.getY() + wallBox.getHeight()) - doorHeight);
  112. door.addPoint((int)wallBox.getX() + (int)(1.5 * doorWidth), (int)(wallBox.getY() + wallBox.getHeight()) - doorHeight);
  113. door.addPoint((int)wallBox.getX() + (int)(1.5 * doorWidth), (int)(wallBox.getY() + wallBox.getHeight()));
  114. door.addPoint((int)wallBox.getX() + (int)(0.5 * doorWidth), (int)(wallBox.getY() + wallBox.getHeight()));
  115. g.setColor(new Color(200, 200, 200));
  116. g.fillPolygon(door);
  117. return door;
  118. }
  119.  
  120. /**
  121. * Zeichnet die Fenster abhängig von der Breite und der Höhe des Hauses.
  122. *
  123. * paintWindows durchläuft mehrfach zwei Schleifen, um die benötigte Anzahl
  124. * der Fenster und Stockwerke anhand der Höhe und Breite des Hauses zu zeichen.
  125. *
  126. * Ändert bei Anforderung von lichtAendern die Fensterfarbe.
  127. *
  128. * @param g Grafik-Objekt
  129. * @param wall Polygon-Objekt der Wände
  130. * @param door Polygon-Objekt der Tür
  131. */
  132. private void paintWindows(Graphics g, Polygon walls, Polygon door)
  133. {
  134. Rectangle wallBox = walls.getBounds();
  135. Rectangle doorBox = door.getBounds();
  136.  
  137. int windowWidth = (int)(20);
  138. int windowHeight = (int)(25);
  139.  
  140. g.setColor(this.lichtAn ? new Color(255, 255, 200) : new Color(100, 100, 100));
  141.  
  142. /* Beide Schleifen zeichen zuerst die Fenster oberhalb der Tür
  143. * Die Breite und Höhe der wallBox bestimmt die Anzahl der Fenster,
  144. * bzw die Anzahl Iterationen.
  145. */
  146. for (int i = 0; i <= (wallBox.getHeight() - 95); i += (windowHeight + 10)){
  147. for (int j = 5; j < (wallBox.getWidth()- 10); j += (windowWidth + 10)){
  148. g.fillRect((int)wallBox.getX() + j, (int)(doorBox.getY() - (windowHeight + 10) - i), windowWidth , windowHeight);
  149. }
  150. }
  151.  
  152. /* Anschliessend werden die Fenster rechts der Tür gezeichnet
  153. * j arbeitet hier bei als Abstandhalter mit der der 1.5fachen
  154. * Breite der Tür, zuzüglich 20 um sich an den anderen Fenstern
  155. * zu orientieren.
  156. * Die Breite der wallBox bestimmt die Anzahl der Fenster, bzw
  157. * Iterationen.
  158. */
  159. for (int j = (int)(doorBox.getWidth() * 1.5 + 20); j < (wallBox.getWidth()- 20); j += (windowWidth + 10)){
  160. g.fillRect((int)wallBox.getX() + j, (int)doorBox.getY(), windowWidth , windowHeight);
  161. }
  162.  
  163. }
  164. }

Report this snippet  

You need to login to post a comment.