【问题标题】:2D rectangle sliding collision doesn't work二维矩形滑动碰撞不起作用
【发布时间】:2013-02-16 13:34:36
【问题描述】:

所以我正在开发一个小逃生游戏,我想确保你不能穿过墙壁。我也希望能够滑过墙壁。我的意思是当你的左边有一堵墙时,你按左上推,你向上滑动但不要穿过墙。首先,我编造了一些运行不佳的错误代码。在网上搜索了一番后,我发现了这个:

http://xboxforums.create.msdn.com/forums/t/59723.aspx

这听起来非常合乎逻辑和简单,所以我在我的程序中实现了它。问题是它仍然不起作用,只是非常不规则。有时它允许你滑动(虽然比预期的慢/快),有时你只能滑动得更快,有时你根本不能滑动。我的代码如下所示:

bool cLevel::slideCol(SDL_Rect* pos, SDL_Rect* oldPos) {
    bool col = false;

    for (int i = 0; i < walls.size(); ++i) {
        if (rectCol(*pos, walls[i])) {
            pos->x = oldPos->x;
            col = true;
        }

        if (rectCol(*pos, walls[i])) {
            pos->y = oldPos->y;
            col = true;
        }
    }

    return col;
}

它会根据当前位置检查所有墙壁。它首先调整 x 位置,如果仍有碰撞,它会调整 y 位置。如果您想查看我的问题,您可以在此处获得演示:https://dl.dropbox.com/u/65227065/Operation%20Get%20Out.zip。我很确定 rectCol 功能有效,我已经彻底测试过了。但可以肯定的是,无论如何,这里就是:

bool rectCol(SDL_Rect f, SDL_Rect s) {
    bool ret = false;

    int t1, r1, b1, l1;
    int t2, r2, b2, l2;

    t1 = f.y;
    r1 = f.x + f.w;
    b1 = f.y + f.h;
    l1 = f.x;

    t2 = s.y;
    r2 = s.x + s.w;
    b2 = s.y + s.h;
    l2 = s.x;

    // Er zijn vier situaties mogelijk: - rechtsonder1 overlapt linksboven2
    //                                  - linksonder1 overlapt rechtsboven2
    //                                  - linksboven1 overlapt rechtsonder2
    //                                  - rechtsboven1 overlapt linksonder2
    // Die worden hier elk individueel gechecked

    if (r1 > l2 && r1 < r2) { // rechts
        if (b1 > t2 && b1 < b2) { // onder1 overlapt linksboven2
            ret = true;
        } else if (t1 > t2 && t1 < b2) { // boven overlapt overlapt linksonder2
            ret = true;
        }
    } else if (l1 > l2 && l1 < r2) { // links
        if (b1 > t2 && b1 <= b2) { // onder1 overlapt rechtsboven2
            ret = true;
        } else if (t1 > t2 && t1 < b2) { // boven1 overlapt met rechtsonder2
            ret = true;
        }
    }

    return ret;
}

我在这里无能为力。也许我只是错过了一些非常简单的东西(我可能一如既往)但我似乎无法弄清楚这一点。希望你们能帮助我,否则“提交”问题会让我看到曙光。

提前致谢!

[编辑] 好的,所以我再次尝试了我原来的方法,因为我有预感。原来我原来的系统不起作用,因为在一个函数中我在浮点坐标和整数坐标之间来回跳跃。因此,如果将来有类似问题的人发现了这个线程,那么请确保您坚持一种类型:整数或浮点数。这样可以省去很多麻烦。

【问题讨论】:

  • 你做错了。调试。

标签: c++ 2d sdl collision rectangles


【解决方案1】:

您的rectCol 函数指示是否发生了碰撞,但它不区分 X 中的碰撞和 Y 中的碰撞。

如果发生碰撞,您的slideCol 函数会调整 X 位置,即使碰撞完全在 Y 轴上。因此您不能沿着地板或天花板滑动。

我不知道为什么滑动有时“比预期的”慢或快。我在代码中看不出有什么理由(我不会用你的 dll 做实验),所以我怀疑你的期望可能不切实际。

【讨论】:

  • 嗯,我一直在想,有很多情况下我的代码不起作用。和往常一样,我忽略了一些事情。谢谢你让我朝着正确的方向前进哈哈
猜你喜欢
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多