Terrain.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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. Point2D cameraPoint = new Point2D.Double(1920/2,1080/2);
  33. float cameraScale = 1;
  34. Point2D lastClickPosition;
  35. Point lastMousePosition;
  36. public Terrain(int length, int width){
  37. this.length = length;
  38. this.width = width;
  39. try {
  40. background = ImageIO.read(new File("res/grass.jpg"));
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. this.dragObject = null;
  45. this.entities = new LinkedList();
  46. this.initEntities();
  47. this.listeners();
  48. }
  49. private void listeners(){
  50. addMouseListener(new MouseAdapter() {
  51. @Override
  52. public void mousePressed(MouseEvent e) {
  53. boolean newObject = false;
  54. for(Draw drawObject: entities){
  55. if(drawObject.contains(e.getPoint())){
  56. dragObject = drawObject;
  57. offset = new Point2D.Double(e.getX() - drawObject.getX(), e.getY() - drawObject.getY());
  58. selectedObject = dragObject;
  59. newObject = true;
  60. }
  61. }
  62. if(!newObject){
  63. selectedObject = null;
  64. }
  65. repaint();
  66. }
  67. @Override
  68. public void mouseReleased(MouseEvent e) {
  69. dragObject = null;
  70. }
  71. });
  72. addMouseMotionListener(new MouseAdapter() {
  73. @Override
  74. public void mouseDragged(MouseEvent e) {
  75. Point2D clickPoint = getClickPoint(e.getPoint());
  76. if(dragObject != null){
  77. if(SwingUtilities.isLeftMouseButton(e)){
  78. dragObject.setX(e.getX() - offset.getX());
  79. dragObject.setY(e.getY() - offset.getY());
  80. }else if(SwingUtilities.isRightMouseButton(e)){
  81. dragObject.setRotation(e.getX() * -1);
  82. }
  83. }
  84. else
  85. {
  86. cameraPoint = new Point2D.Double(
  87. cameraPoint.getX() + (lastMousePosition.getX() - e.getX()),
  88. cameraPoint.getY() + (lastMousePosition.getY() - e.getY())
  89. );
  90. repaint();
  91. }
  92. lastMousePosition = e.getPoint();
  93. lastClickPosition = clickPoint;
  94. repaint();
  95. }
  96. });
  97. addMouseWheelListener(new MouseAdapter() {
  98. @Override
  99. public void mouseWheelMoved(MouseWheelEvent e) {
  100. for(Draw object: entities){
  101. if(object.contains(e.getPoint())){
  102. double scale = object.getScale();
  103. scale *= 1 + (e.getPreciseWheelRotation() / 10);
  104. object.setScale(scale);
  105. }
  106. }
  107. repaint();
  108. }
  109. });
  110. }
  111. private void initEntities(){
  112. this.entities.add(new Stage(10, 10, 0.5, 10));
  113. this.entities.add(new Stage(200, 40, 2, 10));
  114. }
  115. @Override
  116. public void paint(Graphics g) {
  117. super.paint(g);
  118. Graphics2D g2 = (Graphics2D) g;
  119. TexturePaint p = new TexturePaint(background, new Rectangle2D.Double(0, 0, 500, 500));
  120. g2.setPaint(p);
  121. g2.fill(new Rectangle2D.Double(0,0,width,length));
  122. for(Draw drawObject: entities){
  123. drawObject.draw(g2);
  124. }
  125. if(this.selectedObject != null){
  126. Shape shape = new Rectangle2D.Double(this.selectedObject.getX(), this.selectedObject.getY() , this.selectedObject.getWidth() * this.selectedObject.getScale(), this.selectedObject.getHeight() * this.selectedObject.getScale());
  127. AffineTransform backup = g2.getTransform();
  128. AffineTransform trans = new AffineTransform();
  129. 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())));
  130. g2.transform(trans);
  131. g2.setColor(Color.RED);
  132. g2.draw(shape);
  133. g2.transform(backup);
  134. boolean collide = false;
  135. for(Draw draw: entities){
  136. if(!draw.equals(this.selectedObject)){
  137. if(intersection(draw, this.selectedObject)){
  138. collide = true;
  139. }
  140. }
  141. }
  142. if(collide){
  143. g2.setColor(new Color(254, 0, 0, 128));
  144. }else{
  145. g2.setColor(new Color(0, 254, 0, 128));
  146. }
  147. g2.fill(this.drawDragRectangle(this.selectedObject));
  148. }
  149. }
  150. private Rectangle drawDragRectangle(Draw shape){
  151. Rectangle rectangle = null;
  152. 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())));
  153. return rectangle;
  154. }
  155. private boolean intersection(Draw d1, Draw d2){
  156. 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()));
  157. 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()));
  158. return s1.intersects(s2);
  159. }
  160. private Point2D getClickPoint(Point point) {
  161. try {
  162. return getCamera().inverseTransform(point, null);
  163. } catch (NoninvertibleTransformException e1) {
  164. e1.printStackTrace();
  165. }
  166. return null;
  167. }
  168. private AffineTransform getCamera() {
  169. AffineTransform tx = new AffineTransform();
  170. tx.translate(-cameraPoint.getX() + getWidth()/2, -cameraPoint.getY() + getHeight()/2);
  171. tx.scale(cameraScale, cameraScale);
  172. return tx;
  173. }
  174. }