所以我有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++) {
...
}
}
任何人都可以给我一个关于我应该去哪里的提示吗?我只是想在每次球碰撞时检测到(最终我会打印出碰撞次数)。
任何帮助高度赞赏:)
答案 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++;
}