0

0

c++ Box2D物理引擎怎么用 c++ 2D游戏物理入门【教程】

尼克

尼克

发布时间:2026-01-11 15:51:07

|

395人浏览过

|

来源于php中文网

原创

Box2D 是一个开源、高性能的 C++ 2D 物理引擎,仅模拟物理行为(如刚体运动、碰撞、关节),不负责渲染,需配合图形库使用;其核心对象为世界→刚体→夹具→形状,推荐1单位=1米并采用固定时间步调用 Step()。

c++ box2d物理引擎怎么用 c++ 2d游戏物理入门【教程】

Box2D 是一个开源、高性能的 2D 物理引擎,用 C++ 编写,广泛用于游戏开发(如《愤怒的小鸟》早期版本)。它不负责渲染,只模拟刚体运动、碰撞、关节等物理行为,需配合图形库(如 SFML、SDL2 或 OpenGL)使用。

一、环境准备与基础编译

Box2D 官方已迁移到 GitHub,推荐使用现代构建方式:

FreeTTS
FreeTTS

FreeTTS是一个免费开源的在线文本到语音生成解决方案,可以将文本转换成MP3,

下载
  • https://github.com/erincatto/box2d 克隆或下载最新 release(v2.4.x)
  • 用 CMake 构建(支持 Windows/macOS/Linux):启用 BUILD_SHARED_LIBS=OFF 可静态链接,避免 DLL 依赖问题
  • include/box2d 加入项目头文件搜索路径;链接生成的 libbox2d.a(Linux/macOS)或 box2d.lib(Windows)
  • 无需预编译 DLL —— 静态链接更轻量、部署简单

二、核心对象与最小可运行示例

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())

三、关键概念与避坑提醒

  • 单位制是任意的,但推荐 1单位 = 1米:Box2D 对“过大”或“过小”的数值(如 1000px 或 0.001f)模拟不稳定,物体可能穿透或抖动
  • 刚体类型分三种:static(静止,不受力)、kinematic(匀速运动,可设速度但不受力影响)、dynamic(完全物理模拟)
  • 夹具(Fixture)才是碰撞主体:形状本身不参与物理,必须通过夹具附加到刚体上;一个刚体可有多个夹具(如角色+武器碰撞体)
  • 务必用固定时间步调用 Step():不要直接传帧间隔(dt),否则物理结果不可重现;可用累积时间 + while 循环做插值
  • 销毁刚体要小心:不能在接触回调中直接调用 DestroyBody(),应标记后延后删除,否则引发迭代器失效

四、下一步实用扩展方向

  • 添加圆形、边缘(b2EdgeShape)、链形(b2ChainShape)等不同形状
  • b2ContactListener 捕获碰撞开始/结束事件(如播放音效、触发伤害)
  • 连接刚体:铰链(b2RevoluteJoint)、距离(b2DistanceJoint)、滑轮(b2PulleyJoint)等实现门、绳索、升降机
  • 设置过滤层(categoryBits / maskBits)控制哪些物体可以相互碰撞(如子弹不撞友军)
  • 结合 SFML 渲染:用 sf::RectangleShape 同步 Box2D 刚体的位置和角度(注意 Box2D 角度是弧度,SFML 是度)

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

83

2023.09.25

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

571

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1089

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

787

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

450

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2347

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

775

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

1485

2023.08.28

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

80

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7万人学习

Git 教程
Git 教程

共21课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号