【问题标题】:Is there a way to rotate an sf::FloatRect有没有办法旋转 sf::FloatRect
【发布时间】:2020-08-03 19:50:28
【问题描述】:

我正在我的项目中制作碰撞检测系统,我需要检测旋转纹理上的碰撞。

为了检测碰撞,在主角纹理周围制作了 4 个 sf::FloatRect 对象(用于检测左、右、上和下的碰撞),并使用纹理的位置制作了一个 sf::FloatRect,它是尺寸。如果主纹理周围的 4 个sf::FloatRect 对象之一与另一个sf::FloatRect 相交,则检测到碰撞。

当我想检测碰撞的纹理被旋转时,问题就出现了。 sf::FloatRect 不旋转。

有没有办法旋转它?或者在这种情况下有替代品吗?我查看了 SFML 的在线文档,但找不到任何旋转它的方法。

    RectangleShape collisionArea(Vector2f(pos[2], pos[3]));
    collisionArea.setPosition(pos[0], pos[1]);
    collisionArea.setRotation(rotation);

    FloatRect box = collisionArea.getGlobalBounds();


        FloatRect areaLeft(position.x - movementSpeed, position.y, movementSpeed, textureDimentions.y);
        FloatRect areaRight(position.x + textureDimentions.x, position.y, movementSpeed, textureDimentions.y);
        FloatRect areaUp(position.x, position.y - movementSpeed, textureDimentions.x, movementSpeed);
        FloatRect areaDown(position.x, position.y + textureDimentions.y, textureDimentions.x, movementSpeed);

        if(box.intersects(areaLeft))
        {
            collidingMap[0] = true;
        }

        if(box.intersects(areaRight))
        {
            collidingMap[1] = true;
        }


        if(box.intersects(areaUp))
        {
            collidingMap[2] = true;
        }


        if(box.intersects(areaDown))
        {
            collidingMap[3] = true;
        }

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:
    SFML 中的

    sf::FloatRect 表示 AABB(AABB 代表 Axis-Aligned 边界框)。所以不,它不能旋转。您需要的是 OBB(Oriented Bounding Box)碰撞检测。你需要要么

    • 为它编写自己的代码(困难)

    • 找到适合您的图书馆!

    我在 SFML 论坛上搜索后找到了this。可能有比这更好的解决方案,但这是我发现的第一个。

    【讨论】:

    • 想一想,AABB 现在确实有意义,因为在对象上检测到碰撞,但不是在对象本身上,而是在 X 和 Y 轴上。围绕它。感谢您的帮助,我一定会调查的:D
    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多