我正在尝试了解此代码如何用于碰撞检测。我可以告诉目标是一个边界框,我们正在测试实体的每个可能的点,但我不确定在这种情况下签名的移位运算符的目的。事实上,我甚至不明白为什么它会有用,只是它有用。任何人都可以详细说明吗?
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位置,但是瓷砖根本不知道它的位置。世界上有一系列瓷砖,但只知道它的瓷砖位置...因此,当需要进行碰撞检测时,该功能必须确定从玩家位置获得哪个瓷砖位置。
完整来源可在此处获取:http://www.ludumdare.com/compo/ludum-dare-22/?action=preview&uid=398
请注意,图块为16x16
答案 0 :(得分:2)
除以2的幂通常表示为右移 n 位,其中 n 是幂。
曾经是在编写C或汇编时你做的那样,因为它比实际划分要快得多。左移与乘以2的等效功率相同,并且比硬件乘法快得多。现在大多数编译器都会特殊情况下这样做并发出移位而不是乘以/除以2的幂。
当然,如果您的磁贴大小不是2的幂,则必须划分。