gpt4 book ai didi

java - 有没有更好的方法来通过对对象数组执行碰撞检测?

转载 作者:行者123 更新时间:2023-11-30 05:47:57 25 4
gpt4 key购买 nike

所以我正在使用Java(处理)并且我有一个对象数组,我需要它们能够与自身发生碰撞,但我不太确定如何有效地做到这一点。我有一个基本的方法来做到这一点,但它写得很差,并且不允许动态数组。

我目前有一个静态数组,但我希望将来有一个动态数组。我当前运行通过检查每种可能的组合来检测碰撞的方法。总是有 3 个对象,并且不可能少于 3 个。

这是我的代码:

Circle[] arrayOfCircles = new Circle[3]; //declare array

void setup() {

size(1000, 1000);

for (int i = 0; i < arrayOfCircles.length; i++) {
createPuck(i);
} // creates objects

}

void createPuck(int i) {

float speedY;
float speedX;

if (tempSpeedX == 0 && tempSpeedY == 0) {
speedY = createSpeedY();
speedY = speedY * multiplier;
speedX = 3 * multiplier;
} else {
speedX = tempSpeedX;
speedY = tempSpeedY;
tempSpeedX = 0;
tempSpeedY = 0;
}
arrayOfPucks[i] = new Puck(width, int(random(0, height)), speedX, speedY);
}

int createSpeedY() {

int tempSpeed = int(random(-3, 3));

do {
if (tempSpeed == 0) {
tempSpeed = int(random(-3, 3));
}
} while (tempSpeed == 0);

return tempSpeed;
}

void draw() {
detectCollisions();
}

void detectCollisions() {
for (int i = 0; i < arrayOfCircles.length; i++) {

boolean collision = false;

if (i==0) {

collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i+1]);

if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i+1]);
}

collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i+2]);

if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i+2]);
}
} else if (i==1) {

collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i-1]);

if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i-1]);
}

collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i+1]);

if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i+1]);
}
} else if (i==2) {

collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i-1]);

if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i-1]);
}

collision = arrayOfCircles[i].detectCollision(arrayOfCircles[i-2]);

if (collision == true) {
arrayOfCircles[i].bounce(arrayOfCircles[i-2]);
}
} // end of if
} // end of for loop
} // end of function

class Circle {

float x, y;
float speedX, speedY;
final int radius = 10;

Circle(float x, float y, float speedX, float speedY) {
this.x = x;
this.y = y;

this.speedX = speedX;
this.speedY = speedY;
}
// constructor

void move() {
this.x = this.x-speedX; //move left
this.y = this.y-speedY;
}

//methods
void render() {
fill(0);
ellipse(this.x, this.y, this.radius, this.radius);
}

void bounce() {
this.speedX = this.speedX * -1;
this.speedY = this.speedY * -1;
}

boolean detectSelfCollision(Puck other) {
for (int i = 0; i == 2; i++) {
}
float distX = this.x - other.x;
float distY = this.y - other.y;
float distance = sqrt( (distX*distX) + (distY*distY) );

if (distance <= radius*2) {
return true;
} else {
return false;
}
}
}

代码确实有效,因为它做了我想要的事情,但它不是很简洁,有很多重复并且不太可扩展。

任何建议或帮助将不胜感激,我什至可以根据伪代码重新创建任何建议。我只是在这里碰壁了。

最佳答案

您的 detectCollisions() 方法可以重写:

public void detectCollisions() {
for (int i = 0; i < circles.length; i++)
for (int j = 0; j < circles.length; j++)
if (i != j && circles[i].detectCollision(circles[j]))
circles[i].bounce(circles[j]);
}

关于java - 有没有更好的方法来通过对对象数组执行碰撞检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54523398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com