Box2D 2.2.1在VS2008下的编译

来源:互联网 发布:张大大主持的网络节目 编辑:程序博客网 时间:2024/06/05 06:45


        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;
}
结合官网文档,参看示例代码。上面示例展示了动态盒子降落到地面上的情况,控制台的输入如下:



收集一些网上翻译的中文手册,下载地址:http://download.csdn.net/detail/akof1314/4789339


原创粉丝点击