通过碰撞检测不相交的球体(移动到相同的点)

时间:2014-02-10 14:48:47

标签: java geometry collision

我正在学习java。我的目标是让“玩家”球体(跟随鼠标坐标)后面跟着“敌人”。这些也是球体,追逐“球员”。 每个敌人直接前往它的目的地(玩家坐标)。 现在我遇到了以下问题: 敌人的球体可以相交,导致多个敌人的球体相互叠加。 现在我的问题是:我怎样才能避免球体在彼此之上,但仍然朝着特定的方向前进? 例如:两个球体从略微不同的角度移动到特定点。当然他们会在某个时刻发生碰撞但是接着他们应该继续前进到彼此之上,只是轻轻地碰到彼此的边缘。

Enemy Object扩展了我的实体类:

Entity.java:

 public class Entity {

 protected double x, y;
 protected double speed;
 protected int size;

 //detecting collision between two spheres

 public boolean isColliding(Ellipse2D.Double sphere1, int size1 Ellipse2D.Double sphere2, int size2) {
      double a = size1/2 + size2/2;
      double dx = sphere1.x - sphere2.x;
      double dy = sphere1.y - sphere2.y;
      return a * a > (dx * dx + dy * dy);
      }

public void move(double gx, double gy, ArrayList<Enemy> enemies, int id) {


    // .... Here comes the code calculating the movement in x and y direction  ....
    // --> stepX and stepY get initialized, the sphere should move in stepX and stepY direction 
    // to get to the destinationcoordinates (gx and gy are the destination coordinates)

     if(isColliding(sphere1, size1, sphere2, size29 {

        //what should happen when two spheres moving to the same point collide?
        //They must not stop moving to the same directory, just 
        //stop overlapping with the colliding sphere!!
 }   
 else {
        //if not colliding: x should get closer to gx, y should get
        // closer to gy
   x += stepX;
   y += stepYy;
 }
 }
 }

Core类包含一个包含所有敌人的ArrayList,并且在每次更新时都会调用上面的move方法。 “敌人”是包含所有敌人的ArrayList。

我希望你能帮助我!

由于

1 个答案:

答案 0 :(得分:1)

我可以想到3个选项

1)让一个球体停止运动直到另一个球体离开。如果你这样做,你将需要安排在不停止的球体移动后停止移动的球体,所以如果不停止球体移开,停止球体也会移动。

2)平均他们的动作,使他们一起移动。例如,如果速度为mx1 == 2且my1 == 2且mx2 == 2且my2 == - 4,则my1和my2 =(my1 + my2)/ 2;在这种情况下= -1。

3)让一个球体继续前进,另一个球体调整。在前面的示例中,您将离开my1 == 2并设置my2 = 2

祝你好运!