2017-03-05 226 views
0

我正在尝试使用intersects检测两个形状之间的碰撞,但检测不起作用。Java碰撞检测

打印出Circle对象显示x和y位置设置为0.我怀疑可能是位置getter和setter方法工作不正常,但是打印出此信息会显示非零值。

为什么检测不起作用?

谢谢。

编辑:下面的代码现在正在工作。请参阅评论以了解问题/解决方案的细节。

主类

import java.awt.Graphics; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main extends JPanel { 

    public static List<Circle> circleList = new ArrayList<>(); 
    private static Random random = new Random();  

    public Main() { 
     for (int i = 0; i < 2; i++) { 
      circleList.add(new Circle(random.nextInt(500), random.nextInt(500))); 
     }  
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (Circle CircleShape : circleList) { 
      CircleShape.collision(); 
      CircleShape.drawCircle(g); 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(500, 500); 
     frame.setResizable(true); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.add(new Main()); 
    } 

} 

Circle类

import java.awt.Graphics; 

public class Circle extends Shape { 

    public Circle(int x, int y) { 
     super(x, y); 
     super.setSize(200, 200); 
    } 

    public void drawCircle(Graphics g) { 
     g.setColor(colour); 
     g.fillOval(x, y, 200, 200); 
    } 

    public void collision() { 
     for (Circle CircleShape : Main.circleList) { 
      System.out.println(CircleShape); 
      System.out.println(CircleShape.getxPos()); 

      if (this.intersects(CircleShape)) { 
       System.out.println("collision detected"); 
      } else { 
       System.out.println("no collision detected"); 
      } 

     } 
    } 

} 

形状类

import java.awt.Color; 
import java.awt.Rectangle; 

public class Shape extends Rectangle { 

    //int x, y; 
    Color colour; 

    public Shape(int x, int y) { 
     //this.setxPos(x); 
     //this.setyPos(y); 
     this.setPos(x, y); 
    } 
/* 
    public int getxPos() { 
     return this.x; 
    } 

    public void setxPos(int x) { 
     this.x = x; 
    } 

    public int getyPos() { 
     return this.y; 
    } 

    public void setyPos(int y) { 
     this.y = y; 
    } 
*/ 

    public void setPos(int x, int y) { 
     super.setLocation(x, y); 
    } 

    public Point getPos() { 
     return new Point(x, y); 
    } 

} 
+0

你应该在'setxPos'和'setyPos'方法中调用'super.setLocation(x,y)',否则坐标将被忽略。在子类中重新定义变量不会覆盖超类中的变量。 – BackSlash

+0

感谢您的回复。我使用'super.setLocation(x,y)'创建了一个新的getter和setter方法,但是,碰撞检测仍然不起作用。 – user1334130

+0

你能否用新代码更新问题? – BackSlash

回答

1

intersects方法指望的x,y,宽度和高度属性被正确地设置,因为它们用于检测物体是否与另一个物体发生碰撞。

所以,在你的setter方法中,你需要调用super.setLocation(newX, newY),你也应该提供一个有效的宽度和高度。

所以,它应该是:

public void setxPos(int x) { 
    this.x = x; 
    super.setLocation(x, y); 
} 

public void setyPos(int y) { 
    this.y = y; 
    super.setLocation(x, y); 
} 

public Circle(int x, int y) { 
    super(x, y); 
    super.setSize(200, 200); 
} 

或者,你可以使用已经提供的方法从Rectangle类:

public Circle(int x, int y, int width, int height) { 
    super(x, y, width, height); 
} 

,还可以使用setLocation而不是setxPossetyPos

完整的代码会变成这样:

Shape

import java.awt.Color; 
import java.awt.Rectangle; 

public class Shape extends Rectangle { 

    Color colour; 

    public Shape(int x, int y, int width, int height) { 
     // provided by the Rectangle class. Needed for proper collision detection 
     super(x, y, width, height); 
    } 
} 

Circle类:

import java.awt.Graphics; 

public class Circle extends Shape { 

    public Circle(int x, int y, int width, int height) { 
     super(x, y, width, height); 
    } 

    public void drawCircle(Graphics g) { 
     g.setColor(super.colour); 
     // instead of writing values here, we get them from width and height fields 
     g.fillOval(x, y, (int) getWidth(), (int) getHeight()); 
    } 

    public void collision() { 
     for (Circle CircleShape : Main.circleList) { 
      System.out.println(CircleShape); 
      System.out.println(CircleShape.getLocation().x); 

      if (this.intersects(CircleShape)) { 
       System.out.println("collision detected"); 
      } else { 
       System.out.println("no collision detected"); 
      } 

     } 
    } 
} 

Main类:

import java.awt.Graphics; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main extends JPanel { 

    public static List<Circle> circleList = new ArrayList<>(); 
    private static Random random = new Random(); 

    public Main() { 
     for (int i = 0; i < 2; i++) { 
      // width and height are specified here instead of inside the Circle.drawCircle method. 
      circleList.add(new Circle(random.nextInt(500), random.nextInt(500), 200, 200)); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     for (Circle CircleShape : circleList) { 
      CircleShape.collision(); 
      CircleShape.drawCircle(g); 
     } 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setSize(500, 500); 
     frame.setResizable(true); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.add(new Main()); 
    } 

}