【问题标题】:Checking if rectangles intercect only working if they intersect on first check检查矩形是否相交仅在它们在第一次检查时相交时才起作用
【发布时间】:2014-02-25 03:56:23
【问题描述】:
public void update() {
    speedY = bg.getSpeedY() / 2;
    tileY += speedY;
    r.set(tileX, tileY, 50, 48);
    // Collision with cycle here:
    if (tileY > 480) {
        r = null;
    }
    if (tileY < 480) {
        checkCollision();
    }
}

private void checkCollision() {
    if (type != 0) {
        boolean val = Rect.intersects(Cycle.rect, r);   
        if (val) {
            test = true;
        }
    }
}

使用调试器,我确定所有矩形都正确更新,并且 Cycle.rect 返回正确的矩形位置。如果矩形在第一次检查时相交,它工作正常。但是,随着更新的运行,相交永远不会返回 true。为什么会发生这种情况?我只使用布尔值来帮助调试。

我记录了两个我认为矩形应该相交但不相交的值:

r: 02-24 23:32:50.762: V/矩形 (16624): 矩形 (50, 314 - 50, 48) Cycle.rect: 02-24 23:32:50.762: V/Rect(16624): Rect(49, 329 - 100, 100)

【问题讨论】:

  • 仅凭这些信息很难回答。也许type 是0?也许Cycle.rect 真的不与r 相交?检查Cycle.rect 和r 的每个位置。此外,记录值 tileY 可能会有所帮助。
  • 我没有记录瓷砖Y,而是记录了两个矩形以确保它们相交。我在类型检查中登录,所以我知道类型不是 0。 02-24 23:32:50.762: V/Rect(16624): Rect(50, 314 - 50, 48) 02-24 23:32:50.762 : V/Rect(16624): Rect(49, 329 - 100, 100) 这两个矩形应该相交吗?
  • 检查我的答案。经过一番试验,如果我交换你的上下值,我得到你的Rects 相交。

标签: java android game-engine intersection rectangles


【解决方案1】:

问题出在 Java 中的坐标系上,其中左上角被视为 0。因此,如果 top 坐标小于而不是 bottom,则“定义”Rect .否则,它被认为是空的。

来自Rect API reference,

注意:大多数方法不会检查坐标是否正确排序(即左

也适用于set()(注意:强调我的),

将矩形的坐标设置为指定值。注意:不执行范围检查,因此由调用者确保left 。

还有isEmpty()

如果矩形为空(左>=右或上>=下)返回真

【讨论】:

  • 你摇滚!我使用顶部和底部作为高度和宽度。这导致了我所有的错误。谢谢!
猜你喜欢
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
相关资源
最近更新 更多