我有一个简单的Java小程序,它有两个用户控制的球,使用java.awt
绘制。我需要一种方法来检测它们之间的碰撞。我有一个检测墙壁碰撞的算法:
if (xPosition > (300 - radius)){
xSpeed = -xSpeed;
}
else if (xPosition < radius){
xSpeed = -xSpeed;
}
else if (yPosition > (300 - radius)) {
ySpeed = -ySpeed;
}
else if (yPosition < radius){
ySpeed = -ySpeed;
}
xPosition += xSpeed;
yPosition += ySpeed;
和第二球:
if (xPosition2 > (300 - radius)){
xSpeed2 = -xSpeed2;
}
else if (xPosition2 < radius){
xSpeed2 = -xSpeed2;
}
else if (yPosition2 > (300 - radius)) {
ySpeed2 = -ySpeed2;
}
else if (yPosition2 < radius){
ySpeed2 = -ySpeed2;
}
xPosition2 += xSpeed2;
yPosition2 += ySpeed2;
radius
存储圆圈的半径。xPosition
和xPosition2
存储两个球的x坐标。yPosition
和yPosition
存储两个球的y坐标,xSpeed
和xSpeed2
存储两个球的x速度。ySpeed
和ySpeed2
存储两个球的y速度。答案 0 :(得分:5)
使用http://java.sun.com/j2se/1.5.0/docs/api/java/awt/geom/Point2D.html,那里有一个距离法,如果它小于它们碰撞的半径。
编辑: 呃,小于半径* 2,对不起
答案 1 :(得分:1)
Java中有Point2D,或者你可以自己动手,圆/圆碰撞或球/球碰撞很容易。
int distXX = (xPosition1 - xPosition2) * (xPosition1 - xPosition2);
int distYY = (yPosition1 - yPosition2) * (yPosition1 - yPosition2);
if ( radius*radius > distXX * distYY ) {
... // There's a collision
}
答案 2 :(得分:-1)
public boolean colliding(Ball anotherBall) {
double xDelta = (this.x + this.ballSize/2 + this.dx) - (anotherBall.x + anotherBall.ballSize/2 + anotherBall.dx);
double YDelta = (this.y + this.ballSize/2 + this.dy) - (anotherBall.y + anotherBall.ballSize/2 + anotherBall.dy);
double distance = Math.sqrt(Math.pow(xDelta, 2) + Math.pow(YDelta, 2));
return (distance <= this.ballSize/2 + anotherBall.ballSize/2);
}
答案 3 :(得分:-1)
此链接非常有用!
这是非常详细和狡猾的
在该页面的底部还有另一个链接,更详细的内容!
我使用了距离中心方法--- Circles
通过测量每个中心之间的距离,您可以说它们是否发生碰撞。 距离不应该超过2半径的总和。
这就是我的所作所为:
private boolean checkDrawContains(ShapeDrawable newHole)
{
long newCenterX = newHole.getBounds().left + (newHole.getBounds().width()/2); //Get the center of my shapes
long newCenterY = newHole.getBounds().top + (newHole.getBounds().height()/2);
for(ShapeDrawable hole: mHoles) // I was storing the circles in an ArrayList
{
long centerX = hole.getBounds().left + (hole.getBounds().width()/2); //Get the center of my shapes
long centerY = hole.getBounds().top + (hole.getBounds().height()/2);
long x = centerX - newCenterX;
long y = centerY - newCenterY;
long aux = (long) ((Math.pow(Math.abs(x),2)) + (Math.pow(Math.abs(y),2))); //Pythagoras the hard way :P
long distance = (long) Math.sqrt(aux);
long sRads = (newHole.getBounds().width()/2) + (hole.getBounds().width()/2);
if(distance <= sRads ) {
return true; //Is Colliding!
}
}
return false; // Is not Colliding!
}