【发布时间】:2014-01-14 12:22:44
【问题描述】:
我正在与tiles 和entities 合作;他们都是rectangles,我可以调整entities的速度,比如设置速度为2.3。更复杂的问题是tiles 和entities 之间的冲突。
我的collision 方法实际上是从current speed 中检查next tile,所以如果speed 是2.3,但tile 和entity 之间的距离是@987654336 @,它不会让它移动那个微小的差异,它会在两者之间留下最小的像素。这不是一件很好的事情。我一直在尝试解决这个问题以增加那个微小的差异,但我就是想不通..
这是我的collision 方法(在Java):
public boolean collision(double xa, double ya) {
for (int c = 0; c < 4; c++) {
int xt = (int) ((this.x + xa) + c % 2 * 15 - 7) >> 4; // (n >> 4) is the same as (n / 16), but faster, if you didn't know.
int yt = (int) ((this.y + ya) + c / 2 * 15 - 8) >> 4;
if (level.getTile(xt, yt).isSolid()) return true;
}
return false;
}
这是我当前用来处理实体的所有移动的方法,其中检查了碰撞:
public void move(double xa, double ya) {
if (xa != 0 && ya != 0) {
move(xa, 0);
move(0, ya);
return;
}
if (collision(xa, ya)) { //---
return; // CONFIGURE DIFFERENCE HERE
} //---
while (xa != 0) {
if (Math.abs(xa) > 1) {
this.x += intValue(xa);
xa -= intValue(xa);
} else {
this.x += xa;
xa = 0;
}
}
while (ya != 0) {
if (Math.abs(ya) > 1) {
this.y += intValue(ya);
ya -= intValue(ya);
} else {
this.y += ya;
ya = 0;
}
}
}
我想要合并的是在我将消息CONFIGURE DIFFERENCE HERE 放入move 方法的那个注释块中找到2.3 和1.4 之间的区别。考虑到这可能是一个简单的算法,我可能失败得很厉害,但我就是想不出找到差异的正确方法。每隔一段时间,我就会发现自己离墙只有一个像素。这是我一直在尝试以某种方式开始工作的一种方法。
if (collision(xa, ya)) {
while (Math.abs(xa) > 1) {
xa -= intValue(xa); //intValue(int v) returns 1 if v > 0
// returns -1 if v < 0
}
while (Math.abs(ya) > 1) {
ya -= intValue(ya);
}
if (collision(xa, ya)) return;
}
总结和问题
我有一个问题,如果一个实体的speed 是greater thandistance 来自它要进入的tile,它会在它自己和@987654351 之间至少留下一个pixel @,我真的不喜欢这个。我可以使用什么样的算法来找出entity 和tile 之间的最小差异?
如果您需要任何其他信息,我很乐意添加。
【问题讨论】:
-
难道这行:
while (Math.abs(xa) > 1)应该使用>=? -
@maackle 我希望是这样,但显然不是。