“简单”矩形碰撞检测:为什么我的代码不起作用?

时间:2011-04-18 17:18:01

标签: java android collision-detection

嘿伙计们,请看看我的代码,看看这里有什么问题。我查看了文档和所有内容,看起来这应该可行。

public Boolean CollisionTest (Rect one, Rect two) {
        if (one.intersect(two)) {
            collided = true;
        } else {
            collided = false;
        }
        return(collided);
    }

如果两个矩形碰撞,这不会返回吗?我怀疑这个的原因我在我的主线程中有一些空指针异常(它在我的游戏循环线程的finally语句中停止)调试时错误,当我不使用这个函数时它很好。

非常奇怪,如果有人能发布有用的碰撞检测教程的链接,我也很感激。我想处理我自己的碰撞检测,而不是使用外部库。

谢谢大家!

4 个答案:

答案 0 :(得分:12)

根据intersect功能的Android开发者文档:

  

如果指定的矩形与此矩形相交,则返回true 并将此矩形设置为该交点,否则返回false并且不要更改此矩形。

我强调的部分意味着如果矩形相交,你的one参数可能会改变 - 我猜它是如何以某种方式设置为null,并导致你的稍后在游戏循环中出错。

文档还说明:

  

要测试交叉点,请使用intersects()

Rect.intersects(Rect a, Rect b)方法的说明是available here

如果我们修改您的方法以使用Rect.intersects,它将如下所示:

public Boolean CollisionTest (Rect one, Rect two) {
        return Rect.intersects(one, two);
    }

此时你可能完全摆脱CollisionTest并直接调用Rect.intersects - 除非在某些时候你想要实现自己的碰撞检测。在这种情况下,您只需要修改这个方法。这取决于你,真的。

答案 1 :(得分:1)

你可以这样写一张支票:

public boolean CollisionTest(Rect one, Rect two) {
  return one.left <= two.right && one.right >= two.left &&
      one.top <= two.bottom && one.bottom >= two.top;
}

答案 2 :(得分:1)

我看到你没有在函数中定义碰撞。是在全局空间中定义还是作为实例变量。

您也可以缩短代码

public Boolean CollisionTest (Rect one, Rect two) {
    if (one.intersect(two)) {
        collided = true;
    } else {
        collided = false;
    }
    return(collided);
}

作为

return one.intersect(two);

答案 3 :(得分:1)

好吧,我不熟悉Rect API,但是@Donut已经很好地回答了这一部分。既然你也想知道碰撞检测,我会留下两个非常好的教程。

我有使用Java(在Android手机上)制作游戏的瓷砖地图系统和基本碰撞检测的经验。 Thisthis是非常好的教程,非常简单,它们包含基本的碰撞检测。