【问题标题】:SFML Bounding Box Collision DetectionSFML 边界框碰撞检测
【发布时间】:2015-02-01 12:29:14
【问题描述】:

我正在尝试为我的第一个 SFML 项目编写一个非常基本的游戏。它是一个带有关节臂的机器人,只能用手弹出气球。我遇到的问题是,当检查钳子精灵是否与气球精灵相交时,无论气球或机器人钳子的位置如何,它都会始终返回 true。我正在使用变换来放置机器人手臂的各个部分,这就是导致我认为的问题的原因,但我不知道为什么。我曾尝试在不使用变换的单独程序中使用边界框碰撞,并且效果很好。转换和检测代码如下。如果有人能向我解释这一点,我将不胜感激。我是 SFML 的新手,所以在这里为我的无知道歉!

    sf::Transform trBody;
    trBody.translate(sBodyPos);
    /////////////////////////////////////////////////

    sf::Transform trArm1;
    trArm1.translate(sArm1Pos);

    sf::Transform rotArm1;
    rotArm1.rotate(sArm1Rot);

    sf::Transform TR1 = trBody*trArm1*rotArm1;
    /////////////////////////////////////////////////

    sf::Transform trArm2;
    trArm2.translate(sArm2Pos);

    sf::Transform rotArm2;
    rotArm2.rotate(sArm2Rot);

    sf::Transform TR2 = TR1*trArm2*rotArm2;
    /////////////////////////////////////////////////

    sf::Transform trPincer1;
    trPincer1.translate(sPincer1Pos);

    sf::Transform TR3 = TR2*trPincer1;
    /////////////////////////////////////////////////

    sf::Transform trPincer2;
    trPincer2.translate(sPincer2Pos);

    sf::Transform TR4 = TR2*trPincer2;
    /////////////////////////////////////////////////
    sf::Transform trBalloon1;
    trBalloon1.translate(sBalloon1Pos);

    if (sPincer1.getGlobalBounds().intersects(sBalloon1.getGlobalBounds())){

        cout << "Bang" << endl;
        ballOneHit = true;

    }

    // Clear screen
    app.clear();
    app.draw(sArm2, TR2);
    app.draw(sPincer1, TR3);
    app.draw(sPincer2, TR4);
    app.draw(sArm1, TR1);
    app.draw(sBody, trBody);

    if (ballOneHit == false){

        app.draw(sBalloon1, trBalloon1);

    }

    // Update the window
    app.display();

【问题讨论】:

    标签: c++ collision-detection sfml bounding-box


    【解决方案1】:

    冒昧猜测,我想说对象的旋转是罪魁祸首,因为旋转具有扩展对象边界的不幸效果。旋转后的边界矩形仍在屏幕确定的 x-y 平面内,但包含旋转后的对象。如图所示,看看这张图片中文本的全局边界框:

    请注意,该框围绕对象,但不是您可能期望得到的原始边界框的旋转版本。用the tutorial on graphics transforms的话来说:

    SFML 实体可以为您提供它们的边界框。边界框是包含实体的最小矩形,边在 X 轴和 Y 轴上对齐。

    要解决此问题,您可以尝试创建一个始终完全包含在对象可见部分内的矩形,然后将其用于命中检测而不是对象的边界框。

    【讨论】:

    • 作为一个实验,我创建了一个单独的程序,其中我使用 setPosition() 定位了一个气球,并使用变换将另一个气球放置到位。结果是被变换的气球的边界框保持在 0,0。在这种发生碰撞的场景中,我必须将使用 setPosition() 定位的气球移动到屏幕上另一个气球的位置,而是移动到它从 0,0 转换而来的位置。很郁闷!
    • @RobEatsEverythingDelaney 通常你应该坚持使用sf::Transformable 类提供的函数来处理对象的转换——从长远来看它会更干净!请记住,实现sf::Transformablesf::Drawable(例如sf::Sprite)的类将跟踪sf::Transformable中的函数创建的转换并正确绘制自己而无需指定一个(你可以window.draw(sprite);
    • *内置类实现 sf::Transformablesf::Drawable
    • @RobEatsEverythingDelaney 这个评论有用吗?如果是这样,我想把它移到我的答案中。
    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多