Terrain.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package gui.simulator;
  2. import gui.simulator.facilities.*;
  3. import java.awt.BasicStroke;
  4. import java.awt.Color;
  5. import java.awt.Font;
  6. import java.awt.Graphics;
  7. import java.awt.Graphics2D;
  8. import java.awt.Point;
  9. import java.awt.Rectangle;
  10. import java.awt.Shape;
  11. import java.awt.TexturePaint;
  12. import java.awt.event.MouseAdapter;
  13. import java.awt.event.MouseEvent;
  14. import java.awt.event.MouseMotionAdapter;
  15. import java.awt.event.MouseWheelEvent;
  16. import java.awt.event.MouseWheelListener;
  17. import java.awt.geom.*;
  18. import java.awt.image.BufferedImage;
  19. import java.io.File;
  20. import java.io.IOException;
  21. import java.util.LinkedList;
  22. import java.util.List;
  23. import javax.imageio.ImageIO;
  24. import javax.swing.JPanel;
  25. import javax.swing.SwingUtilities;
  26. public class Terrain extends JPanel {
  27. private List<Draw> entities;
  28. private Point2D oldPosition;
  29. private Draw dragObject, selectedObject;
  30. private BufferedImage background;
  31. private int festivallength, festivalwidth;
  32. private int sideBarWidth = 200;
  33. private SimulatorPane.Terrains terrain;
  34. Point2D cameraPoint = new Point2D.Double(festivalwidth/2,festivallength/2);
  35. float cameraScale = 1;
  36. Point2D lastClickPosition;
  37. Point lastMousePosition;
  38. public Terrain(int length, int width, SimulatorPane.Terrains terrain){
  39. //get values
  40. setFestivalLength(length);
  41. setFestivalWidth(width);
  42. this.terrain = terrain;
  43. //set terrainbackground
  44. switch(terrain){
  45. case BEACH:
  46. try {
  47. background = ImageIO.read(new File("res/sand.jpg"));
  48. } catch (IOException e) {
  49. e.printStackTrace();
  50. }
  51. break;
  52. case GRASS:
  53. try {
  54. background = ImageIO.read(new File("res/grass.jpg"));
  55. } catch (IOException e) {
  56. e.printStackTrace();
  57. }
  58. break;
  59. case URBAN:
  60. try {
  61. background = ImageIO.read(new File("res/street.jpg"));
  62. } catch (IOException e) {
  63. e.printStackTrace();
  64. }
  65. break;
  66. }
  67. this.dragObject = null;
  68. this.entities = new LinkedList();
  69. this.initEntities();
  70. this.listeners();
  71. }
  72. private void getFacility(MouseEvent e){
  73. Point2D clickPoint = getClickPoint(e.getPoint());
  74. if(e.getX() < 200)
  75. {
  76. if(e.getY() < 300){
  77. dragObject = new Stage((int)clickPoint.getX(),(int)clickPoint.getY(), 0.5, 10);
  78. }else if(e.getY() > 300 && e.getY() < 550){
  79. dragObject = new RestRoom((int)clickPoint.getX(),(int)clickPoint.getY(), 0.5, 10);
  80. }else if(e.getY() > 550 && e.getY() < 800){
  81. dragObject = new AccessPoint(this, (int)clickPoint.getX(),(int)clickPoint.getY(), 0.5, 10);
  82. }
  83. else if(e.getY() > 800 && e.getY() < 1100){
  84. //dragObject = new custom facility
  85. }
  86. entities.add(dragObject);
  87. }
  88. }
  89. private void listeners(){
  90. addMouseListener(new MouseAdapter() {
  91. @Override
  92. public void mousePressed(MouseEvent e) {
  93. Point2D clickPoint = getClickPoint(e.getPoint());
  94. lastClickPosition = clickPoint;
  95. lastMousePosition = e.getPoint();
  96. //if selected in sidebar
  97. getFacility(e);
  98. //else selected in terrain
  99. if(e.getX() > sideBarWidth){
  100. for(Draw drawObject: entities){
  101. if(drawObject.contains(clickPoint)){
  102. dragObject = drawObject;
  103. selectedObject = dragObject;
  104. oldPosition = new Point2D.Double(selectedObject.getX(), selectedObject.getY());
  105. }
  106. }
  107. }
  108. repaint();
  109. }
  110. @Override
  111. public void mouseReleased(MouseEvent e) {
  112. if(selectedObject != null){
  113. for(Draw drawObject: entities){
  114. if(drawObject == selectedObject){
  115. continue;
  116. }
  117. if(intersection(selectedObject, drawObject)){
  118. //move back
  119. selectedObject.setX(oldPosition.getX());
  120. selectedObject.setY(oldPosition.getY());
  121. }
  122. }
  123. }
  124. selectedObject = null;
  125. dragObject = null;
  126. repaint();
  127. }
  128. });
  129. addMouseMotionListener(new MouseMotionAdapter() {
  130. @Override
  131. public void mouseDragged(MouseEvent e) {
  132. Point2D clickPoint = getClickPoint(e.getPoint());
  133. if(dragObject != null){
  134. if(SwingUtilities.isLeftMouseButton(e)){
  135. dragObject.setX(dragObject.getX() - (lastClickPosition.getX() - clickPoint.getX()));
  136. dragObject.setY(dragObject.getY() - (lastClickPosition.getY() - clickPoint.getY()));
  137. }else if(SwingUtilities.isRightMouseButton(e)){
  138. dragObject.rotation += (lastClickPosition.getX() - clickPoint.getX() + lastClickPosition.getY() - clickPoint.getY());
  139. }
  140. }
  141. else
  142. {
  143. cameraPoint = new Point2D.Double(
  144. cameraPoint.getX() + (lastMousePosition.getX() - e.getX()),
  145. cameraPoint.getY() + (lastMousePosition.getY() - e.getY())
  146. );
  147. }
  148. repaint();
  149. lastMousePosition = e.getPoint();
  150. lastClickPosition = clickPoint;
  151. }
  152. });
  153. addMouseWheelListener(new MouseWheelListener() {
  154. @Override
  155. public void mouseWheelMoved(MouseWheelEvent e) {
  156. Point2D clickPoint = getClickPoint(e.getPoint());
  157. for(Draw object: entities){
  158. //if object selected, scale object
  159. if(object.contains(clickPoint)){
  160. object.scale *= 1 + (e.getPreciseWheelRotation()/10.0);
  161. repaint();
  162. return;
  163. }
  164. }
  165. //scale camera
  166. cameraScale *= 1 - (e.getPreciseWheelRotation()/10.0);
  167. repaint();
  168. }
  169. });
  170. }
  171. /*
  172. * Add facilities on initializing
  173. */
  174. private void initEntities(){
  175. //this.entities.add(new Stage(300, 10, 0.5, 10));
  176. //this.entities.add(new Stage(400, 40, 2, 10));
  177. }
  178. @Override
  179. public void paint(Graphics g) {
  180. super.paint(g);
  181. Graphics2D g2 = (Graphics2D) g;
  182. //draw sidebar
  183. g2.setClip(new Rectangle2D.Double(0,0, sideBarWidth, getHeight()));
  184. g2.setColor(Color.GRAY);
  185. g2.fill3DRect(0, 0, 200, 50, true);
  186. g2.setColor(Color.WHITE);
  187. g2.setFont(new Font("Serif", Font.BOLD, 20));
  188. g2.drawString("Drag and drop", 30, 25);
  189. g2.setColor(Color.BLACK);
  190. g2.setStroke(new BasicStroke(5));
  191. g2.drawLine(199, 0, 199, getHeight());
  192. //draw objects
  193. Draw object1 = new Stage(0,50);
  194. object1.draw(g2);
  195. g2.drawString("stage", 80, 275);
  196. Draw object2 = new RestRoom(0,300, 0.5, 10);
  197. object2.draw(g2);
  198. g2.drawString("toilettage", 70, 525);
  199. Draw object3 = new AccessPoint(this, 0,550, 0.5, 10);
  200. object3.draw(g2);
  201. g2.drawString("ingang", 70, 675);
  202. //draw simulation field
  203. g2.setClip(new Rectangle2D.Double(200, 0, getWidth()-200, getHeight()));
  204. AffineTransform oldTransform = g2.getTransform();
  205. g2.translate(200,0);
  206. g2.setTransform(getCamera());
  207. TexturePaint p = new TexturePaint(background, new Rectangle2D.Double(0, 0, 200, 200));
  208. g2.setPaint(p);
  209. g2.fill(new Rectangle2D.Double(0,0,festivalwidth,festivallength));
  210. for(int i = 0; i < (festivalwidth/100); i++){
  211. };
  212. for(Draw drawObject: entities){
  213. drawObject.draw(g2);
  214. }
  215. //draw collide boxes
  216. if(this.selectedObject != null){
  217. Shape shape = this.selectedObject.getRect();
  218. g2.setColor(Color.RED);
  219. g2.draw(this.selectedObject.getAffineTransform().createTransformedShape(shape));
  220. boolean collide = false;
  221. for(Draw draw: entities){
  222. if(!draw.equals(this.selectedObject)){
  223. if(intersection(this.selectedObject, draw)){
  224. collide = true;
  225. }
  226. }
  227. }
  228. if(collide){
  229. g2.setColor(new Color(254, 0, 0, 128));
  230. }else{
  231. g2.setColor(new Color(0, 254, 0, 128));
  232. }
  233. g2.fill(this.selectedObject.getAffineTransform().createTransformedShape(this.selectedObject.getRect()));
  234. g2.setClip(null);
  235. g2.setTransform(oldTransform);
  236. }
  237. }
  238. private Rectangle drawDragRectangle(Draw shape){
  239. Rectangle rectangle = null;
  240. rectangle = new Rectangle((int) (shape.getX() - shape.getDistanceToOtherObjects()), (int) (shape.getY() - shape.getDistanceToOtherObjects()), (int) (shape.getWidth() * shape.getScale() + (2 * shape.getDistanceToOtherObjects())), (int) (shape.getHeight() * shape.getScale() + (2 * shape.getDistanceToOtherObjects())));
  241. return rectangle;
  242. }
  243. private boolean intersection(Draw d1, Draw d2){
  244. Area area = new Area(d1.getAffineTransform().createTransformedShape(d1.getRect()));
  245. Area area2 = new Area(d2.getAffineTransform().createTransformedShape(d2.getRect()));
  246. area.intersect(area2);
  247. return !area.isEmpty();
  248. }
  249. private Point2D getClickPoint(Point point) {
  250. try {
  251. return getCamera().inverseTransform(point, null);
  252. } catch (NoninvertibleTransformException e1) {
  253. e1.printStackTrace();
  254. }
  255. return null;
  256. }
  257. private AffineTransform getCamera() {
  258. AffineTransform tx = new AffineTransform();
  259. tx.translate(-cameraPoint.getX() + getWidth()/2, -cameraPoint.getY() + getHeight()/2);
  260. tx.scale(cameraScale, cameraScale);
  261. return tx;
  262. }
  263. public void setFestivalLength(int length){
  264. this.festivallength = length;
  265. }
  266. public void setFestivalWidth(int width){
  267. this.festivalwidth = width;
  268. }
  269. public int getFestivalLength(){
  270. return festivallength;
  271. }
  272. public int getFestivalWidth(){
  273. return festivalwidth;
  274. }
  275. }