【问题标题】:How to check if two rectangles, one is rotated, intersect in SFML如何检查两个矩形,一个是旋转的,在 SFML 中是否相交
【发布时间】:2015-10-13 09:49:38
【问题描述】:

我在矩形的封闭平铺地图中有一个旋转的矩形。 检查玩家(即旋转的矩形)是否与瓷砖地图的其中一个矩形相交的最佳方法是什么?

游戏内的图片更好地展示地图的样子:

如果重要的话,玩家的类型是 sf::Shape,地图的数据在 int 数组中。

【问题讨论】:

    标签: c++ sfml rect


    【解决方案1】:

    SFML 不提供碰撞检测,它只有检查两个轴对齐的矩形是否相交的方法。如果你需要更复杂的东西,你必须自己实现。

    如果不需要精确检测,可以用地图的矩形测试Sprite.getGlobalBounds().intersects(...)。 如果你想要理想的碰撞检测,你有不止一种选择:

    • Pixel perfect Collision。首先检查边界框是否与地图图块相交,然后检查所有非透明像素是否发生碰撞。不是很快,但易于实施,可能适合您的情况。
    • 数学方法,不止一种,但看看分离轴定理。如果您仅限于矩形(或/和圆形和凸多边形),则效果最好。

    【讨论】:

      【解决方案2】:

      对于仍然遇到此问题的任何人:

      您应该查看sf::Transformable (https://www.sfmldev.org/documentation/2.5.1/classsf_1_1Transformable.php) 的getTransform()getInverseTransform() 函数。获取玩家和特定墙的逆变换允许您使用简单的 AABB 碰撞算法(就像 SFML 已经在 getGlobalBounds().intersects(...) 中实现了它)。您基本上会查看玩家的本地坐标系以及墙是如何定位到它的,忽略所有平移、旋转和缩放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-14
        • 2013-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        相关资源
        最近更新 更多