LibGDX - 给出一个移动圆圈的arraylist,我如何检查它们之间的碰撞?

时间:2014-12-02 11:26:09

标签: libgdx sprite collision geometry detection

所以我有3个课程,MyGdxGame,Ball和DetectCollision。 MyGdxGame初始化4个 Ball 实例(不同颜色和速度/方向,全部从屏幕两侧反弹)并将它们存储为arraylist。

这个arraylist通过DetectCollision的构造函数传递:

public class DetectCollisions {
ArrayList<Ball> ball;

public DetectCollisions(ArrayList<Ball> ball) {
    this.ball = ball;
    start();
}
public void start() {
for(int i=0; i<ball.size();i++) {
    ...
}
}

任何人都可以给我一个关于我应该去哪里的提示吗?我只是想在每次球碰撞时检测到(最终我会打印出碰撞次数)。

任何帮助高度赞赏:)

2 个答案:

答案 0 :(得分:1)

如果要向arraylist添加大量对象,请使用2D物理引擎为您完成所有工作。如果要继续实现自己的函数,最基本的方法是在列表上实现嵌套循环,以检查arraylist中的每个可能的对。复杂度为O(n ^ 2)

for(int i=0; i<ball.size();i++) {  
    for(int j=i+1; j<ball.size();j++) {
        check(ball.get(i), ball.get(j));
    }
}

名为检查的方法会检查给定的两个圆是否发生碰撞。检查两个圈子&#39;碰撞很容易。如果圆的中心点之间的距离小于圆的半径之和,则它们发生碰撞。 Check this page了解更多信息。

答案 1 :(得分:0)

如果让每个Ball都具有Circle类型的边界,这很容易实现。

您可以按如下方式制作一个圆圈:Circle ballBounds = new Circle(float x, float y, float radius)此圆圈可以作为每个球的边界,最终允许您使用Intersector类检查它们是否发生碰撞。

拥有每个Ball的边界,我们可以轻松遍历ArrayList<Ball>并查看有多少碰撞。例如:

ArrayList<Ball> ball = new ArrayList<Ball>(); // You need to add Balls to this ArrayList

Intersector intersector = new Intersector();

int counter = 0;

for(int i = 0; i < ball.size()-2; i++){
   if(intersecor.overlaps(ball.get(i), ball.get(i+1)){
       counter++;
   }
   i++;
}