`

Box2D 2.0.1版Hello World教程

阅读更多
#include "Box2D.h"  
  
#include <cstdio>   
//    
// 这是盒子和小盒子的一个简单例子模拟使用Box2D的.   
// 这里我们创造一个大地面箱子和一小动态   
// 箱子.    
int main(int argc, char** argv)   
{   
    B2_NOT_USED(argc);   
    B2_NOT_USED(argv);   
    // 定义世界的大小。    
    //如果钢体到达世界的边缘,但是它将会速度越来越慢直到休眠。   
    // 我们创建地面体。要创建它我们需要一个物体定义(body definition),通过物体定义我们来   
    //指定地面体的初始位置。   
    b2AABB worldAABB;   
    worldAABB.lowerBound.Set(-100.0f, -100.0f);   
    worldAABB.upperBound.Set(100.0f, 100.0f);   
  
    // 定义重力向量   
    b2Vec2 gravity(0.0f, -10.0f);   
  
    // 是否休眠   
    bool doSleep = true;   
  
    // 建立一个世界对象.   
    b2World world(worldAABB, gravity, doSleep);   
  
    //我们创建地面体。要创建它我们需要定义一个静态刚体(body definition),通过物体定义我们来   
    //指定地面体的初始位置。   
    b2BodyDef groundBodyDef;   
    groundBodyDef.position.Set(0.0f, -10.0f);   
  
    //将物体定义传给世界对象来创建地面体。世界对象并不保存到物体定义的引用。地面体是作   
    //为静态物体(static body)创建的,静态物体之间并没有碰撞,它们是固定的。当一个物体具有零质量的   
    //时候 Box2D 就会确定它为静态物体,物体的默认质量是零,所以它们默认就是静态的   
    b2Body* groundBody = world.CreateBody(&groundBodyDef);   
  
    // 我们创建一个地面的多边形定义。我们使用 SetAsBox 简捷地把地面多边形规定为一个盒子   
    //(矩形)形状,盒子的中点就位于父物体的原点上。   
    b2PolygonDef groundShapeDef;   
  
    //SetAsBox 函数接收了半个宽度和半个高度,这样的话,地面盒就是 100 个单位宽(x 轴)以及   
    //20 个单位高(y 轴)。Box2D 已被调谐使用米,千克和秒来作单位,   
    groundShapeDef.SetAsBox(50.0f, 10.0f);   
  
    //我们在地面体上创建地面多边形,以完成地面体   
    groundBody->CreateShape(&groundShapeDef);   
  
    // 现在我们已经有了一个地面体,我们可以使用同样的方法来创建一个动态物体。除了尺寸之外的主要   
    //区别是,我们必须为动态物体设置质量性质。   
    //首先我们用 CreateBody 创建物体   
    b2BodyDef bodyDef;   
    //设置起始坐标   
    bodyDef.position.Set(0.0f, 14.0f);   
    b2Body* body = world.CreateBody(&bodyDef);   
  
    // 接下来我们创建并添加一个多边形形状到物体上。注意我们把密度设置为 1,默认的密度是 0。并   
    //且,形状的摩擦设置到了 0.3。形状添加好以后,我们就使用 SetMassFromShapes 方法来命令物体通   
    //过形状去计算其自身的质量。这暗示了你可以给单个物体添加一个以上的形状。如果质量计算结果为 0,   
    //那么物体会变成真正的静态。物体默认的质量就是零   
    b2PolygonDef shapeDef;   
    //动态刚体的大小   
    shapeDef.SetAsBox(1.0f, 1.0f);   
  
    //密度,密度默认为0为0时判断为静态钢体   
    shapeDef.density = 1.0f;   
  
    //摩擦力   
    shapeDef.friction = 0.3f;   
  
    //创建刚体   
    body->CreateShape(&shapeDef);   
    //我也可以通过这个函数设置位置和角度   
    //body->SetXForm(b2Vec2(0.0f,5.0f),0.3f);   
  
    //以物体形状计算   
    body->SetMassFromShapes();   
  
    // Box2D 中有一些数学代码构成的积分器(integrator),积分器在离散的时间点上模拟物理方程,它将   
    // 与游戏动画循环一同运行。所以我们需要为 Box2D 选取一个时间步,通常来说游戏物理引擎需要至少   
    // 60Hz 的速度,也就是 1/60 的时间步。你可以使用更大的时间步,但是你必须更加小心地为你的世界调   
    // 整定义。我们也不喜欢时间步变化得太大,所以不要把时间步关联到帧频(除非你真的必须这样做)。直截   
    // 了当地,这个就是时间步:   
    float32 timeStep = 1.0f / 60.0f;   
    // Box2D 中还有约束求解器(constraint solver)。约束求解器用于解决模拟中的所有   
    // 约束,一次一个。单个的约束会被完美的求解,然而当我们求解一个约束的时候,我们就会稍微耽误另   
    // 一个。要得到良好的解,我们需要迭代所有约束多次。建议的 Box2D 迭代次数是 10 次。你可以按自己   
    // 的喜好去调整这个数,但要记得它是速度与质量之间的平衡。更少的迭代会增加性能并降低精度,同样   
    // 地,更多的迭代会减少性能但提高模拟质量。这是我们选择的迭代次数:   
    int32 iterations = 10;   
  
    // 输出坐标以及角度   
    for (int32 i = 0; i < 60; ++i)   
    {   
        // 单个约束求解以1/60帧。每帧计算10次   
        world.Step(timeStep, iterations);   
  
        // 得到动态刚体的坐标以及角度   
        b2Vec2 position = body->GetPosition();   
        float32 angle = body->GetAngle();   
  
        printf("%4.2f %4.2f %4.2f\n", position.x, position.y, angle);   
    }   
  
    // When the world destructor is called, all bodies and joints are freed. This can   
    // create orphaned pointers, so be careful about your world management.   
    system("pause");   
    return 0;   
}  

分享到:
评论

相关推荐

    Box2DFlash Hello World(Box2D动力学基础研究)

    源码下载 博文链接:https://bvu.iteye.com/blog/437656

    NDK编译Box2D_V2.2源码

    使用ndk编译box2d物理引擎,并将它移植到android上,测试代码为Box2D自带的Example helloworld.

    cocos2d-x box2d 物理引擎

    最简单的helloworld实例上添加物理引擎cocos2d-x box2d 物理引擎

    cocos2d-x_Box2d实例代码

    学习cocos2dx后自己整的物理引擎(box2d)的类似helloworld的示例代码。cocos2d-x_Box2d实例代码,完整可运行的工程例子。对初学cocos2dx的物理引擎开发的同志们非常有用!

    qt-box2d-vs2008-test

    Box2d V2.1.2 + Qt 4.7.1-vs2008 +VS2008 版hello world

    lunar-lander-libgdx-demo:我的“Hello world”应用程序是使用 libGDX 和 Box2d 库创建的。 它是 Atari 于 1979 年开发的月球着陆器游戏的未完成克隆

    lunar-lander-libgdx-demo 我的“Hello world”应用程序是使用 libGDX 和 Box2d 库创建的。 它是 Atari 于 1979 年开发的月球着陆器游戏的未完成克隆

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    我们这里的工程名为helloworld。 6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以 直接点击Next。 7.我们将base class 选为QDialog 对话框类。然后点击Next。 8.点击Finish,完成工程的...

    Learn iPhone and iPad cocos2d Game Development

     2.2.1 helloworld文件在项目中的位置  2.2.2 资源  2.2.3 其他资源  2.2.4 类  2.3 cocos2d中的内存管理问题  2.4 改变世界  2.5 你还应该知道的  2.5.1 ios设备  2.5.2 关于内存的使用  2.5.3 模拟器  ...

    Learning.Cocos2d-JS.Game.Development

    Chapter 7: Adding Physics to Your Games Using Box2D Engine Chapter 8: Adding Physics to Your Games Using the Chipmunk2D Engine Chapter 9: Creating Your Own Blockbuster Game – A Complete Match 3 Game

    Hello Android.rar

    Hello Android (3rd Edition),英文书籍,适用于android入门 ! Android is an open source software toolkit for mobile phones that was created by Google and the Open Handset Alliance. It’s inside ...

    sen2D:基于画布的二维网络引擎

    思维导图01_hello_world : pixi 逻辑测试02_interaction : 基本鼠标悬停/移出/向下/向上03_prototyping_move:添加界面以“减轻”代码+在交互式obj上添加mousemove。 04_collision_box:添加一个带有简单碰撞盒的...

    vc++ 应用源码包_6

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

    vc++ 应用源码包_5

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

    vc++ 应用源码包_3

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

    vc++ 应用源码包_1

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

    vc++ 应用源码包_2

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

    vc++ 开发实例源码包

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 如题。 FreeBird2011最初版(模仿...

    Making Games with Python & PyGame.pdf(with code)

    Source Code for Hello World with Pygame ................................................................................ 7 Setting Up a Pygame Program ....................................................

Global site tag (gtag.js) - Google Analytics