java - 微型飞行器碰撞检测

标签 java collision-detection

我试图了解这段代码如何用于碰撞检测。我可以看出目标是一个边界框,并且我们正在测试该实体的每个可能的点,但我不确定在这种情况下有符号移位运算符的目的。事实上,我什至不明白为什么它会有用,只是它做了什么。谁能详细说明一下吗?

protected boolean move2(int xa, int ya) {
    if (xa != 0 && ya != 0) throw new IllegalArgumentException("Move2 can only move along one axis at a time!");

    int xto0 = ((x) - xr) >> 4;
    int yto0 = ((y) - yr) >> 4;
    int xto1 = ((x) + xr) >> 4;
    int yto1 = ((y) + yr) >> 4;

    int xt0 = ((x + xa) - xr) >> 4;
    int yt0 = ((y + ya) - yr) >> 4;
    int xt1 = ((x + xa) + xr) >> 4;
    int yt1 = ((y + ya) + yr) >> 4;
    boolean blocked = false;
    for (int yt = yt0; yt <= yt1; yt++)
        for (int xt = xt0; xt <= xt1; xt++) {
            if (xt >= xto0 && xt <= xto1 && yt >= yto0 && yt <= yto1) continue;
            level.getTile(xt, yt).bumpedInto(level, xt, yt, this);
            if (!level.getTile(xt, yt).mayPass(level, xt, yt, this)) {
                blocked = true;
                return false;
            }
        }
    if (blocked) return false;

    List<Entity> wasInside = level.getEntities(x - xr, y - yr, x + xr, y + yr);
    List<Entity> isInside = level.getEntities(x + xa - xr, y + ya - yr, x + xa + xr, y + ya + yr);
    for (int i = 0; i < isInside.size(); i++) {
        Entity e = isInside.get(i);
        if (e == this) continue;

        e.touchedBy(this);
    }
    isInside.removeAll(wasInside);
    for (int i = 0; i < isInside.size(); i++) {
        Entity e = isInside.get(i);
        if (e == this) continue;

        if (e.blocks(this)) {
            return false;
        }
    }

    x += xa;
    y += ya;
    return true;
}

可能值得注意的是,实体知道其精确的 x 和 y 像素位置,但图 block 根本不知道其位置。世界有一个图 block 数组,但只知道它的图 block 位置...因此,当需要进行碰撞检测时,该函数必须确定从玩家位置获取哪个图 block 位置。

完整的源代码可以在这里找到:http://www.ludumdare.com/compo/ludum-dare-22/?action=preview&uid=398

请注意,图 block 为 16x16

最佳答案

除以 2 的幂通常表示为右移 n 位,其中 n 是幂。

过去,在编写 C 语言或汇编语言时,您会这样做,因为它比实际除法快得多。左移与乘以 2 的等效幂相同,并且比硬件乘法快得多。如今,大多数编译器都会对此进行特例处理,并发出移位指令,而不是 2 的幂的乘法/除法。

当然,如果您的图 block 大小不是 2 的幂,则必须除以。

关于java - 微型飞行器碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13060976/

相关文章:

c++ - 简单的二维碰撞问题

java 两个旋转矩形之间的碰撞检测

java - 通过 TableView 中选定行第二列上的 ENTER 键显示上下文菜单 (JavaFX)

java - 从堆中删除随机元素

Java JButton Action 监听器

java - 项目层次结构是 Idea 而不是 BlueJ

python | Pygame | Sprite 碰撞

collision-detection - 使用 PCL 进行两个点云之间的碰撞检测

java - 如何使用临时 Web 服务(非 SOAP、无模式 XML)?

javascript - 带碰撞检测的 Canvas 滚动