C++ 我如何处理这种类型的碰撞?

C++ 我如何处理这种类型的碰撞?,c++,collision-detection,sfml,tile,C++,Collision Detection,Sfml,Tile,因此,我在简单的游戏开发方面花了一段时间,刚刚在squidi.net/three/entry.php?id=85上发现了一个有趣的游戏想法。我用C++使用SFML 2.1,在顶点数组中显示一个TrimAP,显示水平。这是我到目前为止所拥有的,您可以看到我的简单瓷砖集:。我对如何处理潜艇(不在基于网格的移动系统上)和墙壁之间的碰撞感到非常困惑。问题是,假设子对象从底部接近瓷砖2(检查瓷砖集图像),如果我检查子对象和整个瓷砖之间的碰撞,子对象将在到达图像中的实际墙之前停止。这里有一张图片来帮助解释这

因此,我在简单的游戏开发方面花了一段时间,刚刚在squidi.net/three/entry.php?id=85上发现了一个有趣的游戏想法。我用C++使用SFML 2.1,在顶点数组中显示一个TrimAP,显示水平。这是我到目前为止所拥有的,您可以看到我的简单瓷砖集:。我对如何处理潜艇(不在基于网格的移动系统上)和墙壁之间的碰撞感到非常困惑。问题是,假设子对象从底部接近瓷砖2(检查瓷砖集图像),如果我检查子对象和整个瓷砖之间的碰撞,子对象将在到达图像中的实际墙之前停止。这里有一张图片来帮助解释这一点:

很抱歉之前的混乱,我希望这不会像以前那么糟糕

非常感谢您的帮助

谢谢

卡雷尔


编辑:重写问题以使其更清楚。

您的潜艇比一块瓷砖小,因此潜艇在任何给定时间最多覆盖4块瓷砖

  • 识别潜艇重叠的瓷砖。至少1个,最多4个
  • 对于每个重叠的磁贴,调用对应于该磁贴类型(0到6)的函数
  • 您可以向每个函数传递子对象距该平铺中心的距离

    以下是最简单的:

    bool collided_with_tile_0( int x_offset, int y_offset )
    {
      return false;  // Nothing to collide with
    }
    
    这个也很简单:

    bool collided_with_tile_1( int x_offset, int y_offset )
    {
      return std::abs( y_offset ) < SUB_SIZE;  // Collision if y_offset is close to 0
    }
    
    bool与tile\u 1发生碰撞(intx\u偏移,inty\u偏移)
    {
    return std::abs(y\u offset)

    祝你好运

    我将警告您,如果所讨论的对象的移动速度快于您的拼贴分辨率,那么简单的基于网格的碰撞将发生可怕的故障。假设碰撞框的大小为8x8像素。现在,当潜艇移动时会发生什么,比如说每tic移动16个皮克斯?你可以看到,如果你对如何检查碰撞不太仔细,它可以跳过单层碰撞壁——检查潜艇在移动时撞击的每一块瓦片,而不是直接通过速度更新位置。但比这更糟糕的是,图像中每秒仅移动2个像素,仅剪切平铺的边缘,但在另一侧结束。同样,基于平铺的碰撞,没有跟踪移动时所接触的每个块的代码,将失败

    更通用的方法是使用基于直线或向量的碰撞。基本上,不使用平铺贴图,而是使用表示墙边的向量列表。要检查2D中的碰撞,可以检查起点的perpdot(垂直点积)符号与碰撞向量的关系,以及运动终点与碰撞向量的关系。如果它们不同,则表示您越界并发生碰撞。如果其中一个为0,则您位于碰撞线上。一定要检查生产线的终点,因为这涉及到更多的点产品

    此方法的附加好处是,当发生碰撞时,可以很容易地沿墙“滑动”角色,而不只是将角色后退到前面的位置,从而导致墙粘滞和振动。它真的很快,只需要几次乘法和减法。它还可以很容易地扩展到SIMD风格的代码


    请参阅以了解更多信息。

    您能否更具体地说明您的代码出了什么问题?我对如何理解您的问题感到非常困惑。小部件能否在任何方向自由移动?或者它仅限于瓷砖移动的中心(每次移动1整块瓷砖)?很好,抱歉,它可以自由移动,并且不会捕捉到任何网格系统。