Terrain.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package gui.simulator;
  2. import gui.simulator.facilities.Stage;
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.Point;
  7. import java.awt.Rectangle;
  8. import java.awt.Shape;
  9. import java.awt.TexturePaint;
  10. import java.awt.event.MouseAdapter;
  11. import java.awt.event.MouseEvent;
  12. import java.awt.event.MouseWheelEvent;
  13. import java.awt.geom.AffineTransform;
  14. import java.awt.geom.NoninvertibleTransformException;
  15. import java.awt.geom.Point2D;
  16. import java.awt.geom.Rectangle2D;
  17. import java.awt.image.BufferedImage;
  18. import java.io.File;
  19. import java.io.IOException;
  20. import java.util.LinkedList;
  21. import java.util.List;
  22. import javax.imageio.ImageIO;
  23. import javax.swing.JPanel;
  24. import javax.swing.SwingUtilities;
  25. public class Terrain extends JPanel {
  26. private List<Draw> entities;
  27. private Point2D offset;
  28. private Draw dragObject, selectedObject;
  29. private BufferedImage background;
  30. private int length;
  31. private int width;
  32. private int terrain;
  33. Point2D cameraPoint = new Point2D.Double(1920/2,1080/2);
  34. float cameraScale = 1;
  35. Point2D lastClickPosition;
  36. Point lastMousePosition;
  37. public Terrain(int length, int width, int terrain){
  38. this.length = length;
  39. this.width = width;
  40. this.terrain = terrain;
  41. switch(terrain){
  42. case 1:
  43. try {
  44. background = ImageIO.read(new File("res/sand.jpg"));
  45. } catch (IOException e) {
  46. e.printStackTrace();
  47. }
  48. break;
  49. case 2:
  50. try {
  51. background = ImageIO.read(new File("res/grass.jpg"));
  52. } catch (IOException e) {
  53. e.printStackTrace();
  54. }
  55. break;
  56. case 3:
  57. try {
  58. background = ImageIO.read(new File("res/street.jpg"));
  59. } catch (IOException e) {
  60. e.printStackTrace();
  61. }
  62. break;
  63. }
  64. this.dragObject = null;
  65. this.entities = new LinkedList();
  66. this.initEntities();
  67. this.listeners();
  68. }
  69. private void listeners(){
  70. addMouseListener(new MouseAdapter() {
  71. @Override
  72. public void mousePressed(MouseEvent e) {
  73. boolean newObject = false;
  74. for(Draw drawObject: entities){
  75. if(drawObject.contains(e.getPoint())){
  76. dragObject = drawObject;
  77. offset = new Point2D.Double(e.getX() - drawObject.getX(), e.getY() - drawObject.getY());
  78. selectedObject = dragObject;
  79. newObject = true;
  80. }
  81. }
  82. if(!newObject){
  83. selectedObject = null;
  84. }
  85. repaint();
  86. }
  87. @Override
  88. public void mouseReleased(MouseEvent e) {
  89. dragObject = null;
  90. }
  91. });
  92. addMouseMotionListener(new MouseAdapter() {
  93. @Override
  94. public void mouseDragged(MouseEvent e) {
  95. Point2D clickPoint = getClickPoint(e.getPoint());
  96. if(dragObject != null){
  97. if(SwingUtilities.isLeftMouseButton(e)){
  98. dragObject.setX(e.getX() - offset.getX());
  99. dragObject.setY(e.getY() - offset.getY());
  100. }else if(SwingUtilities.isRightMouseButton(e)){
  101. dragObject.setRotation(e.getX() * -1);
  102. }
  103. }
  104. else
  105. {
  106. cameraPoint = new Point2D.Double(
  107. cameraPoint.getX() + (lastMousePosition.getX() - e.getX()),
  108. cameraPoint.getY() + (lastMousePosition.getY() - e.getY())
  109. );
  110. repaint();
  111. }
  112. lastMousePosition = e.getPoint();
  113. lastClickPosition = clickPoint;
  114. repaint();
  115. }
  116. });
  117. addMouseWheelListener(new MouseAdapter() {
  118. @Override
  119. public void mouseWheelMoved(MouseWheelEvent e) {
  120. for(Draw object: entities){
  121. if(object.contains(e.getPoint())){
  122. double scale = object.getScale();
  123. scale *= 1 + (e.getPreciseWheelRotation() / 10);
  124. object.setScale(scale);
  125. }
  126. }
  127. repaint();
  128. }
  129. });
  130. }
  131. private void initEntities(){
  132. this.entities.add(new Stage(10, 10, 0.5, 10));
  133. this.entities.add(new Stage(200, 40, 2, 10));
  134. }
  135. @Override
  136. public void paint(Graphics g) {
  137. super.paint(g);
  138. Graphics2D g2 = (Graphics2D) g;
  139. TexturePaint p = new TexturePaint(background, new Rectangle2D.Double(0, 0, 500, 500));
  140. g2.setPaint(p);
  141. g2.fill(new Rectangle2D.Double(0,0,width,length));
  142. for(Draw drawObject: entities){
  143. drawObject.draw(g2);
  144. }
  145. if(this.selectedObject != null){
  146. Shape shape = new Rectangle2D.Double(this.selectedObject.getX(), this.selectedObject.getY() , this.selectedObject.getWidth() * this.selectedObject.getScale(), this.selectedObject.getHeight() * this.selectedObject.getScale());
  147. AffineTransform backup = g2.getTransform();
  148. AffineTransform trans = new AffineTransform();
  149. trans.rotate(Math.toRadians(this.selectedObject.getRotation()), (this.selectedObject.getX() + (this.selectedObject.getWidth() / 2 * this.selectedObject.getScale())),(this.selectedObject.getY() + (this.selectedObject.getHeight() /2 * this.selectedObject.getScale())));
  150. g2.transform(trans);
  151. g2.setColor(Color.RED);
  152. g2.draw(shape);
  153. g2.transform(backup);
  154. boolean collide = false;
  155. for(Draw draw: entities){
  156. if(!draw.equals(this.selectedObject)){
  157. if(intersection(draw, this.selectedObject)){
  158. collide = true;
  159. }
  160. }
  161. }
  162. if(collide){
  163. g2.setColor(new Color(254, 0, 0, 128));
  164. }else{
  165. g2.setColor(new Color(0, 254, 0, 128));
  166. }
  167. g2.fill(this.drawDragRectangle(this.selectedObject));
  168. }
  169. }
  170. private Rectangle drawDragRectangle(Draw shape){
  171. Rectangle rectangle = null;
  172. 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())));
  173. return rectangle;
  174. }
  175. private boolean intersection(Draw d1, Draw d2){
  176. Rectangle2D.Double s1 = new Rectangle2D.Double(d1.getX() - d1.getDistanceToOtherObjects(), d1.getY() - d1.getDistanceToOtherObjects(), d1.getWidth() * d1.getScale() + (2*d1.getDistanceToOtherObjects()) , d1.getHeight() * d1.getScale() + (2*d1.getDistanceToOtherObjects()));
  177. Rectangle2D.Double s2 = new Rectangle2D.Double(d2.getX() - d2.getDistanceToOtherObjects(), d2.getY() - d2.getDistanceToOtherObjects(), d2.getWidth() * d2.getScale() + (2*d2.getDistanceToOtherObjects()) , d2.getHeight() * d2.getScale() + (2*d2.getDistanceToOtherObjects()));
  178. return s1.intersects(s2);
  179. }
  180. private Point2D getClickPoint(Point point) {
  181. try {
  182. return getCamera().inverseTransform(point, null);
  183. } catch (NoninvertibleTransformException e1) {
  184. e1.printStackTrace();
  185. }
  186. return null;
  187. }
  188. private AffineTransform getCamera() {
  189. AffineTransform tx = new AffineTransform();
  190. tx.translate(-cameraPoint.getX() + getWidth()/2, -cameraPoint.getY() + getHeight()/2);
  191. tx.scale(cameraScale, cameraScale);
  192. return tx;
  193. }
  194. }