其他分享
首页 > 其他分享> > c – SFML边界框碰撞检测

c – SFML边界框碰撞检测

作者:互联网

我正在尝试为我的第一个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();

解决方法:

猜测是有害的,我会说物体的旋转是罪魁祸首,因为旋转具有扩大物体边界的不幸效果.旋转后的边界矩形仍然在由屏幕确定的x-y平面中,但包含旋转后的对象.如图所示,请查看此图片中文本的全局边界框:

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

SFML entities can give you their bounding box. The bounding box is the minimal rectangle that contains the entity, with sides aligned on the X and Y axes.

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

标签:sfml,bounding-box,c,collision-detection
来源: https://codeday.me/bug/20190830/1767066.html