Box2D是一个用于游戏的2D刚体仿真库。程序员可以使用它, 让游戏中的物体运动起来更真实, 让游戏世界更具交互性。以游戏的角度来看,物理引擎就是一个程序性动画的系统。
官网地址:http://code.google.com/p/box2d/
1.解压Box2D_v2.2.1.zip到文件夹;
2.从http://www.cmake.org/cmake/resources/software.html下载cmake;
3.安装完成后,打开CMake(cmake-gui),按如下图配置:
4.然后按下"Generate"按钮;
5.就可以在"Build"目录下,用VS2008打开"Box2D.sln";
6.编译生成项目,运行Testbed项目,如下图所示:
Hello World工程介绍了如何使用Box2D,这个是没有图形界面,需要在控制台看到输出。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#include <Box2D/Box2D.h>
#include <cstdio> using namespace std; // 这是一个简单的例子,使用Box2D进行构建和运行一个仿真。 // 在这里,我们创建了一个大型地面盒和一个小型动态框。 // 在这个例子中有没有图形。 // Box2D意味着在你的游戏引擎中,和你的渲染引擎一起使用。 int main( int argc, char** argv) { B2_NOT_USED(argc); B2_NOT_USED(argv); // 定义重力矢量 b2Vec2 gravity( 0.0f, - 10.0f); // 构造一个世界对象,它将持有并仿真刚体 b2World world(gravity); // 定义地面物体 b2BodyDef groundBodyDef; groundBodyDef.position.Set( 0.0f, - 10.0f); // 调用物体的工厂方法,从池中分配内存给地面物体,并且创建地面盒形状。 // 这个物体也会被加入到世界当中。 b2Body* groundBody = world.CreateBody(&groundBodyDef); // 定义地面盒形状 b2PolygonShape groundBox; // 长度都是半宽度的盒子 groundBox.SetAsBox( 50.0f, 10.0f); // 添加地面夹具到地面物体 groundBody->CreateFixture(&groundBox, 0.0f); // 定义动态物体。我们设置它的位置和调用物体的工厂方法。 b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.position.Set( 0.0f, 4.0f); b2Body* body = world.CreateBody(&bodyDef); // 为我们的动态物体定义另一个盒子形状 b2PolygonShape dynamicBox; dynamicBox.SetAsBox( 1.0f, 1.0f); // 定义动态物体夹具 b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; // 设置盒子密度为非零,所以它将会是动态的。 fixtureDef.density = 1.0f; // 覆盖默认的摩擦 fixtureDef.friction = 0.3f; // 添加形状到物体 body->CreateFixture(&fixtureDef); // 准备仿真。通常情况下,我们使用一个时间步为1/60秒(60Hz)以及10次的迭代。 // 在大多数的游戏场景,这提供了一个高品质的仿真。 float32 timeStep = 1.0f / 60.0f; int32 velocityIterations = 6; int32 positionIterations = 2; // 这是我们的小游戏循环 for (int32 i = 0; i < 60; ++i) { // 指示世界执行一个单一的仿真步骤。 // 以保持固定的时间步长和迭代,通常是最好的。 world.Step(timeStep, velocityIterations, positionIterations); // 现在打印物体的位置和角度 b2Vec2 position = body->GetPosition(); float32 angle = body->GetAngle(); printf( "%4.2f %4.2f %4.2f\n", position.x, position.y, angle); } // 当世界的析构函数被调用时,所有的物体和关节被释放。 // 这可能会产生孤立的指针,所以一定要小心你的世界管理。 return 0; } |
![](https://img-my.csdn.net/uploads/201211/20/1353398837_8248.png)
![](https://img-my.csdn.net/uploads/201211/20/1353398848_4149.png)
收集一些网上翻译的中文手册,下载地址: http://download.csdn.net/detail/akof1314/4789339