【问题标题】:Tilemap Collision SFML C++Tilemap 碰撞 SFML C++
【发布时间】:2014-02-28 23:52:11
【问题描述】:

我已经度过了许多令人沮丧的时间并且无法弄清楚这一点,我理解碰撞并让它工作直到我尝试实现重力,我似乎​​无法在玩家击中瓷砖地图后设置玩家位置,从地面坠落是我的问题,x 轴以下代码的变体工作正常

if (background.colMap[tiles[i].y][tiles[i].x] == 1)
    {
        playerSpeed.y = -0.f;
        playerSprite.setPosition(playerSprite.getPosition().x, playerSprite.getPosition().y - 1);
        inAir = false;
    }

虽然我可以通过将速度降低到 0 并将玩家向后移动 1 个像素来工作,但它所做的只是玩家精灵上下弹跳

【问题讨论】:

  • 这些信息或代码不足以告诉您问题所在,但您可能会回到跌倒状态,或者遇到一次性问题。
  • dauphic 是对的,我们确实需要一个有效的最小代码示例来真正解决问题,但我还是试了一下,希望对您有所帮助!

标签: c++ map collision sfml tile


【解决方案1】:

鉴于上述信息,我假设您正在制作横向卷轴游戏,并且您的角色正在与瓷砖顶部发生碰撞。

也就是说,您需要了解的第一件事是,您不应该在角色移动之后而是在移动之前调整角色的位置。角色永远不应该在你的游戏中处于“非法”的位置。哪怕只有几分之一秒。

你有能力看到未来(至少在你自己的游戏中),随意使用它!永远领先一步。

如何找到合适的地方?

基本代数!

情况是这样的。

这里的目标是找到绿色和红色虚线与蓝色小虚线(代表地面)相交的位置。

首先,我们需要找到我们的角色(黑点)轨迹的方程,它应该看起来像:y = ax + b

a = (Y2 - Y1)/(X2 - X1)b = y - ax 的坡度在哪里。

在我们的示例中,等式是y = -2x + 10。我们只需要知道 Y = 3 时 X 的值是多少,我们可以使用 x = (y - b) / a 和在我们的例子中找到 x = (3 - 10) / (-2) = 3.5

所以我们现在知道我们的角色将与(3.5, 3) 的地板相交,这就是我们将放置角色的位置。

你当前技术的缺陷

如果我正确理解您的代码,当您碰撞时,您会将字符提高 1 个像素。

想象一下,您的角色移动得非常快,并且在一次更新他的位置时,他从一个有效位置变为一个无效位置,距离地面 25 像素。使用您目前的技术,至少需要 25 次位置更新才能回到地面,或者可能只需要 25 次碰撞检测循环,但仍然不是很有效。

另一件事,您似乎在循环关卡中所有可能的图块,因此可能大部分是空图块和/或完整的地面(无法访问)图块,这对您真正需要的东西来说是一个很大的开销。

最好的选择是存储可碰撞图块的坐标并迭代这些图块。

如果您有一个屏幕,比如说 50 x 50 块,并且只有 25 个可碰撞的块,您仍在检查50 * 50 - 25 = 2475 块,这些是 2475 次不必要的检查。但很明显,这不是你遇到麻烦的原因,即使那些 2475 次不必要的检查也不会破坏逻辑。

只是为了玩数字,因为我们的角色在 25 像素以下,我们将循环 25 次 2500 块,即 62500 次检查,而不是 25 * 25 = 625 使用可碰撞的瓷砖集合,或者仅使用 25 次检查数学的东西。

【讨论】:

  • 我的播放器尺寸是 64px 高 x 32px 宽,每个图块是 32x32px。我只通过获取玩家的四个角并查看它触及的瓷砖来检查玩家接触的瓷砖的碰撞。我似乎想不通的是如何计算玩家是否在它之前触摸了碰撞瓷砖。我很欣赏你的例子,但我很难掌握它
  • 你可以使用我描述的方法,用你的字符矩形的 4 个角来查看它们是否与瓷砖碰撞。
猜你喜欢
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 2011-03-27
  • 2013-08-22
相关资源
最近更新 更多