Terrain.java 10.0 KB

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