Box2D 是一个开源、高性能的 C++ 2D 物理引擎,仅模拟物理行为(如刚体运动、碰撞、关节),不负责渲染,需配合图形库使用;其核心对象为世界→刚体→夹具→形状,推荐1单位=1米并采用固定时间步调用 Step()。
Box2D 是一个开源、高性能的 2D 物理引擎,用 C++ 编写,广泛用于游戏开发(如《愤怒的小鸟》早期版本)。它不负责渲染,只模拟刚体运动、碰撞、关节等物理行为,需配合图形库(如 SFML、SDL2 或 OpenGL)使用。
Box2D 官方已迁移到 GitHub,推荐使用现代构建方式:
include/box2d 加入项目头文件搜索路径;链接生成的 libbox2d.a(Linux/macOS)或 box2d.lib(W
indows)Box2D 围绕四个关键对象组织:世界(b2World)→ 刚体(b2Body)→ 夹具(b2Fixture)→ 形状(b2Shape)。下面是一个创建地面和下落方块的极简逻辑:
// 1. 创建世界(重力向下) b2Vec2 gravity(0.0f, -10.0f); b2World world(gravity);// 2. 创建地面刚体(静态) b2BodyDef groundDef; groundDef.position.Set(0.0f, -10.0f); b2Body* ground = world.CreateBody(&groundDef); b2PolygonShape groundShape; groundShape.SetAsBox(50.0f, 1.0f); // 宽50高1的矩形 ground->CreateFixture(&groundShape, 0.0f); // 密度为0 → 静态刚体
// 3. 创建下落方块(动态) b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set(0.0f, 5.0f); b2Body* body = world.CreateBody(&bodyDef); b2PolygonShape dynamicShape; dynamicShape.SetAsBox(1.0f, 1.0f); body->CreateFixture(&dynamicShape, 1.0f); // 密度1.0 → 可受力
// 4. 主循环:更新物理(建议固定步长,如 1/60 秒) float32 timeStep = 1.0f / 60.0f; int32 velocityIterations = 6; int32 positionIterations = 2; world.Step(timeStep, velocityIterations, positionIterations);
// 5. 读取位置用于渲染(例如:body->GetPosition())
DestroyBody(),应标记后延后删除,否则引发迭代器失效sf::RectangleShape 同步 Box2D 刚体的位置和角度(注意 Box2D 角度是弧度,SFML 是度)