gpt4 book ai didi

c++ - 具有 SFML 对象的 Box2D 在碰撞后重叠并相互重叠

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:39 25 4
gpt4 key购买 nike

我正在使用 Box2D 和 SFML 创建一个简单的游戏。但是,我的物体(球)落地后并没有完全落地。好像有50%的球都过了我的边界,看起来真的很别扭。以下是一些图片以供说明。

球之前:

enter image description here

球在地面上击中边界后:

enter image description here

如您所见,50% 的球已经消失(很可能是由于偏移或其他原因)。有人知道怎么解决吗?

下面是我创建对象的代码:

    circ_ = sf::CircleShape(radius);
circ_.setOrigin(sf::Vector2f(size.x/2,size.y/2));
circ_.setFillColor(sf::Color(255, 255, 255, 255));
circ_.setOutlineThickness(1);
circ_.setOutlineColor(sf::Color::Black);

bodyDef_.position = b2Vec2(position.x/PIXEL_PER_METER, position.y/PIXEL_PER_METER);

bodyDef_.type = b2_staticBody;
bodyFixtureDef_.density = 1.0f;
bodyFixtureDef_.friction = 0.3f;
bodyFixtureDef_.restitution = 0.8f;

在我的 SFML 代码中,我使用以下方法创建了 Box2D 对象:

Ball basketBall(world, basketBallSize, basketBallPos, 0.0, basketBallRadius, false);

其中半径 = 32。有人可以帮我吗?谢谢。

最佳答案

Box2d 使用圆形/多边形的中心作为位置,而 SFML 使用 Sprite /形状的左上角作为位置,因此在 SFML 和 Box2d 位置之间转换时需要考虑到这一点。还要记住,Box2d 使用米而不是像素,使用弧度而不是度数。

就这样做:

#include <cmath> // for M_PI define

Sprite.setPosition(sf::Vector2f(b2BallBody->GetPosition().x * PIXEL_PER_METER - Sprite.getGlobalBounds().width * 0.5f,
b2BallBody->GetPosition().y * PIXEL_PER_METER - Sprite.getGlobalBounds().height * 0.5f));
Sprite.setRotation(b2BallBody->GetAngle() * (float)(180.0 / M_PI));

关于c++ - 具有 SFML 对象的 Box2D 在碰撞后重叠并相互重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34737280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com