我正在使用tiles
和entities
;它们都是rectangles
,我可以调整entities
的速度,例如将速度设置为2.3
。复杂的问题是tiles
和entities
之间的碰撞。
我collision
的方法实际上已添加以检查其next tile
中的current speed
,因此如果speed
为2.3
,则距离为tile
entity
和1.4
是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;
}
}
}
这是我当前使用的方法来处理实体的所有移动,其中检查了碰撞:
2.3
我想要合并的是找到该注释块中1.4
和CONFIGURE DIFFERENCE HERE
之间的区别,我在move
方法中放置了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
摘要&amp;问题
我遇到一个问题,如果某个实体的greater than
distance
来自tile
pixel
,它至少会留下tile
entity
1}}在它自己和tile
之间,我真的不喜欢这个。我可以使用哪种算法来查找{{1}}和{{1}}之间最小的差异?
如果您需要任何其他信息,我很乐意添加它。
答案 0 :(得分:0)
碰撞的方式是让它一直运行直到它重叠,检测到重叠,然后在检测到它重叠时将其移回实际的触摸点。
这是关于编写游戏的所有“如何”网站的well documented technique。
答案 1 :(得分:0)
虽然不完全是he question I asked on GameDev,但我收到的答案可以在这里使用:给你的瓷砖运动校正向量。
当玩家移动到图块上时,将标准化的玩家向量添加到标准化的图块向量中,并且得到的(重新标准化的)向量是玩家应该实际移动的方向。这有助于我让角落周围的人物变形,但会帮助你让角色真正碰到墙壁。
如果所有其他方法都失败了,如果速度大于间隙,则只移动玩家的差距。在你的例子中,不要移动播放器2.3,移动它们1.4。