Java 碰撞检测
Java Collision Detection
我正在尝试使用 intersects
检测两个形状之间的碰撞,但是检测不起作用。
打印出 Circle
对象显示 x 和 y 位置设置为 0。我怀疑位置 getter 和 setter 方法可能没有正常工作,但是,打印出此信息显示非零值。
为什么检测不起作用?
谢谢。
编辑:下面的代码现在可以工作了。有关问题/解决方案的详细信息,请参阅评论。
主要Class
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());
}
}
圆形Class
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");
}
}
}
}
形状Class
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);
}
}
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);
}
或者,您可以只使用 class Rectangle
:
中已经提供的方法
public Circle(int x, int y, int width, int height) {
super(x, y, width, height);
}
并且还使用 setLocation
代替 setxPos
和 setyPos
。
完整的代码会变成这样:
Shape
class
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
class:
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
class:
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());
}
}
我正在尝试使用 intersects
检测两个形状之间的碰撞,但是检测不起作用。
打印出 Circle
对象显示 x 和 y 位置设置为 0。我怀疑位置 getter 和 setter 方法可能没有正常工作,但是,打印出此信息显示非零值。
为什么检测不起作用?
谢谢。
编辑:下面的代码现在可以工作了。有关问题/解决方案的详细信息,请参阅评论。
主要Class
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());
}
}
圆形Class
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");
}
}
}
}
形状Class
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);
}
}
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);
}
或者,您可以只使用 class Rectangle
:
public Circle(int x, int y, int width, int height) {
super(x, y, width, height);
}
并且还使用 setLocation
代替 setxPos
和 setyPos
。
完整的代码会变成这样:
Shape
class
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
class:
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
class:
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());
}
}