像素完美的碰撞和双打

时间:2014-01-14 03:46:13

标签: java collision

我正在使用tilesentities;它们都是rectangles,我可以调整entities的速度,例如将速度设置为2.3。复杂的问题是tilesentities之间的碰撞。

collision的方法实际上已添加以检查其next tile中的current speed,因此如果speed2.3,则距离为tile entity1.4collision,它不会让它移动那个微小的差异,它会在两者之间留下最微小的像素。这不是一件好事。我一直试图解决这个问题,以增加这个微小的差异,但我无法弄明白......

以下是我的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.4CONFIGURE 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}}之间最小的差异?

如果您需要任何其他信息,我很乐意添加它。

2 个答案:

答案 0 :(得分:0)

碰撞的方式是让它一直运行直到它重叠,检测到重叠,然后在检测到它重叠时将其移回实际的触摸点。

这是关于编写游戏的所有“如何”网站的well documented technique

Here is a good example.

答案 1 :(得分:0)

虽然不完全是he question I asked on GameDev,但我收到的答案可以在这里使用:给你的瓷砖运动校正向量。

当玩家移动到图块上时,将标准化的玩家向量添加到标准化的图块向量中,并且得到的(重新标准化的)向量是玩家应该实际移动的方向。这有助于我让角落周围的人物变形,但会帮助你让角色真正碰到墙壁。

如果所有其他方法都失败了,如果速度大于间隙,则只移动玩家的差距。在你的例子中,不要移动播放器2.3,移动它们1.4。