【问题标题】:Pixel-perfect collision and doubles像素完美碰撞和双打
【发布时间】:2014-01-14 12:22:44
【问题描述】:

我正在与tilesentities 合作;他们都是rectangles,我可以调整entities的速度,比如设置速度为2.3。更复杂的问题是tilesentities 之间的冲突。

我的collision 方法实际上是从current speed 中检查next tile,所以如果speed2.3,但tileentity 之间的距离是@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.31.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;
}

总结和问题

我有一个问题,如果一个实体的speedgreater thandistance 来自它要进入的tile,它会在它自己和@987654351 之间至少留下一个pixel @,我真的不喜欢这个。我可以使用什么样的算法来找出entitytile 之间的最小差异?

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

【问题讨论】:

  • 难道这行:while (Math.abs(xa) &gt; 1) 应该使用&gt;=
  • @maackle 我希望是这样,但显然不是。

标签: java collision


【解决方案1】:

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

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

Here is a good example.

【讨论】:

    【解决方案2】:

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

    当玩家移动到一个图块上时,将归一化的玩家向量添加到归一化的图块向量,得到的(重新归一化的)向量是玩家实际移动的方向。这有助于我让角色在拐角处移动,但会帮助你让角色真正接触到墙壁。

    如果一切都失败了,如果速度大于差距,那么只移动玩家差距的数量。在您的示例中,不要移动播放器 2.3,移动它们 1.4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2015-09-22
      • 2012-06-06
      • 1970-01-01
      相关资源
      最近更新 更多