2010-04-20 2 views
4

У меня есть простой 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; 
  • Апплет 300 пикселей на 300 пикселей.
  • radius хранит радиус окружностей.
  • xPosition и xPosition2 хранить координаты x для двух шаров.
  • yPosition и yPosition магазин у-координата для двух шаров,
  • xSpeed и xSpeed2 магазин рентгеновских скоростей для двух шаров.
  • ySpeed и ySpeed2 хранить скорости y для двух шаров.
+0

Добро пожаловать на SO, Боб. Это скорее более математический вопрос, чем вопрос программирования, поскольку нет способа сделать то, что вы хотите встроить в язык Java. Чтобы вы начали, подумайте об этом так: обнаружение столкновений означает обнаружение, когда шары будут перекрываться или касаться, верно? И вы знаете их позиции и размеры .... – Pops

+0

Ya, но я ничего не могу придумать. Я попытался сделать это с помощью математики, и я закончил с шариками, проходящими друг через друга и около 30 строк бесполезного кода –

ответ

5

Используйте http://java.sun.com/j2se/1.5.0/docs/api/java/awt/geom/Point2D.html, там есть метод расстояния, если он меньше радиуса, с которым они сталкиваются.

EDIT: Err, меньше радиуса * 2, извините

+0

Kool спасибо!Я слышал о пересекающейся команде .. но, видимо, это работает только с прямоугольниками. –

+0

Я бы добавил +1 к вам, но я не могу –

+0

В память о Боб Twinkles, у меня был +1 –

1

Там в Point2D в Java или вы можете сделать это самостоятельно, это тривиально просто для столкновений круг/круг или сфера столкновений/сферы.

int distXX = (xPosition1 - xPosition2) * (xPosition1 - xPosition2); 
int distYY = (yPosition1 - yPosition2) * (yPosition1 - yPosition2); 
if (radius*radius > distXX * distYY) { 
    ... // There's a collision 
} 
+1

Обратите внимание, что типичная ошибка новичка разработчика игры должна состоять в том, чтобы начать использовать «квадратные корни» для вычисления расстояния и проверки с радиусом вместо того, чтобы не скручивать корень и проверять радиус радиуса x. В приведенном выше решении используется только дискретное совпадение, и фактически * это * то, что используется в * много * играх (писал игры несколько десятилетий назад, это был * способ * сделать это). – SyntaxT3rr0r

+0

oooh благодаря вам! –

+0

ok Я только что скомпилировал и побежал, и мяч сопел с каждым, но с другим мячом –

-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); 

} 
+0

erm это хорошо, но я запускаю все приложение одного класса –

-1

Эта ссылка очень полезно!

Circle-Circle Collisions

Это очень подробный и didatic


В нижней части этой страницы есть еще ссылки, еще более подробный материал!


я использовал расстояние между центрами метода --- 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! 
} 
Смежные вопросы