浏览代码

Collision

Gilian Joosen 10 年之前
父节点
当前提交
8318b8e907
共有 2 个文件被更改,包括 32 次插入22 次删除
  1. 5 2
      src/gui/simulator/Draw.java
  2. 27 20
      src/gui/simulator/Terrain.java

+ 5 - 2
src/gui/simulator/Draw.java

@@ -12,12 +12,11 @@ import java.io.IOException;
 public abstract class Draw {
 
     private Image image;
-    private double x, y, rotation, scale;
+    public double x, y, rotation, scale;
     private double distanceToOtherObjects;
 
     public Draw(String image, int x, int y, double scale, double distanceToOtherObjects){
         try{
-            //System.out.println(getClass().getResource(image));
             this.image = ImageIO.read(getClass().getResource(image));
         }catch(IOException ex){
             ex.printStackTrace();
@@ -87,4 +86,8 @@ public abstract class Draw {
     public double getDistanceToOtherObjects() {
         return distanceToOtherObjects;
     }
+
+    public Rectangle2D.Double getRect(){
+        return new Rectangle2D.Double(-distanceToOtherObjects, - distanceToOtherObjects, image.getWidth(null)  + 2* distanceToOtherObjects, image.getHeight(null) + 2*distanceToOtherObjects);
+    }
 }

+ 27 - 20
src/gui/simulator/Terrain.java

@@ -14,11 +14,7 @@ import java.awt.TexturePaint;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseWheelEvent;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Ellipse2D;
-import java.awt.geom.NoninvertibleTransformException;
-import java.awt.geom.Point2D;
-import java.awt.geom.Rectangle2D;
+import java.awt.geom.*;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
@@ -33,7 +29,7 @@ import javax.swing.SwingUtilities;
 public class Terrain extends JPanel {
 
     private List<Draw> entities;
-    private Point2D offset;
+    private Point2D offset, oldPosition;
     private Draw dragObject, selectedObject;
     private BufferedImage background;
     
@@ -107,17 +103,33 @@ public class Terrain extends JPanel {
                         offset = new Point2D.Double(e.getX() - drawObject.getX(), e.getY() - drawObject.getY());
                         selectedObject = dragObject;
                         newObject = true;
+                        oldPosition = new Point2D.Double(selectedObject.getX(), selectedObject.getY());
                     }
                 }
                 if(!newObject){
                     selectedObject = null;
+                    //map dragging
                 }
                 repaint();
             }
 
             @Override
             public void mouseReleased(MouseEvent e) {
+                if(selectedObject != null){
+                    for(Draw drawObject: entities){
+                        if(drawObject == selectedObject){
+                            continue;
+                        }
+                        if(intersection(selectedObject, drawObject)){
+                            //move back
+                            selectedObject.setX(oldPosition.getX());
+                            selectedObject.setY(oldPosition.getY());
+                        }
+                    }
+                }
+
                 dragObject = null;
+                repaint();
             }
         });
 
@@ -203,19 +215,14 @@ public class Terrain extends JPanel {
         }
 
         if(this.selectedObject != null){
-            Shape shape = new Rectangle2D.Double(this.selectedObject.getX(), this.selectedObject.getY() , this.selectedObject.getWidth() * this.selectedObject.getScale(), this.selectedObject.getHeight() * this.selectedObject.getScale());
-            AffineTransform backup = g2.getTransform();
-            AffineTransform trans = new AffineTransform();
-            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())));
-            g2.transform(trans);
+            Shape shape = this.selectedObject.getRect();
             g2.setColor(Color.RED);
-            g2.draw(shape);
-            g2.transform(backup);
+            g2.draw(this.selectedObject.getAffineTransform().createTransformedShape(shape));
 
             boolean collide = false;
             for(Draw draw: entities){
                 if(!draw.equals(this.selectedObject)){
-                    if(intersection(draw, this.selectedObject)){
+                    if(intersection(this.selectedObject, draw)){
                         collide = true;
                     }
                 }
@@ -228,8 +235,7 @@ public class Terrain extends JPanel {
                 g2.setColor(new Color(0, 254, 0, 128));
 
             }
-
-            g2.fill(this.drawDragRectangle(this.selectedObject));
+            g2.fill(this.selectedObject.getAffineTransform().createTransformedShape(this.selectedObject.getRect()));
             g2.setClip(null);
         }
     }
@@ -241,9 +247,11 @@ public class Terrain extends JPanel {
     }
 
     private boolean intersection(Draw d1, Draw d2){
-        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()));
-        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()));
-        return s1.intersects(s2);
+        Area area = new Area(d1.getAffineTransform().createTransformedShape(d1.getRect()));
+        Area area2 = new Area(d2.getAffineTransform().createTransformedShape(d2.getRect()));
+
+        area.intersect(area2);
+        return !area.isEmpty();
     }
     
     private Point2D getClickPoint(Point point) {
@@ -259,7 +267,6 @@ public class Terrain extends JPanel {
 		AffineTransform tx = new AffineTransform();
 		tx.translate(-cameraPoint.getX() + getWidth()/2, -cameraPoint.getY() + getHeight()/2);
 		tx.scale(cameraScale, cameraScale);
-		
 		return tx;
 	}
 }