`

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;   
}  

分享到:
评论

相关推荐

    Box2D新手入门顺阶教程

    本教程从最基础的“HelloWorld”示例开始,逐步深入到Box2D的核心概念与技术细节。 #### HelloWorld入门解析 “HelloWorld”不仅是编程领域的传统入门程序,也是学习任何新框架或库的理想起点。在Box2D中,“Hello...

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

    这个"Hello World"项目是Box2DFlash的基础入门教程,旨在帮助开发者快速理解和掌握如何使用Box2DFlash进行2D游戏或互动应用的开发。 在Box2DFlash中,"Hello World"通常会展示一个简单的物理场景,例如一个静态的...

    Box2d示例/代码/教程大全(不断更新)

    在Box2D的世界中,`HelloWorld`通常是介绍性的程序,演示了如何初始化物理世界、创建基本的物体(如静态或动态的刚体)以及设置它们的物理属性,如形状、质量、摩擦力等。开发者可以通过这个文件了解如何导入Box2D库...

    box2d v2.0.1用户手册

    ### Box2D v2.0.1 用户手册详解 #### 1. 导言 **1.1 关于** Box2D 是一个专为游戏设计的2D刚体仿真库,能够实现逼真的物体运动效果,使游戏环境更加互动与真实。通过模拟现实世界的物理现象,比如碰撞、力的作用...

    box2d-as3版 中文教程

    ### Box2D-as3版中文教程相关知识点 #### 1. 导言 **1.1 关于** Box2D是一款强大的2D物理仿真库,主要用于游戏开发领域,旨在为游戏提供更为真实的物理效果和更加丰富的互动体验。通过Box2D,游戏开发者可以让...

    Box2D 中文教程

    ### Box2D 中文教程详解 #### 一、引言 Box2D 是一款功能强大的 2D 物理引擎,适用于游戏开发和其他需要物理模拟的应用场景。它可以帮助开发者实现逼真的物理效果,如物体碰撞、重力作用等,使得游戏世界更加真实...

    box2d中文教程

    ### Box2D中文教程知识点详解 #### 一、Box2D简介 Box2D是一个用于游戏开发中的2D物理仿真库。它可以帮助开发者创建出更加真实、互动性强的游戏环境。通过Box2D,物体的运动将遵循物理法则,从而使得游戏世界更加...

    box2d实现弹跳

    Box2D 实现弹跳 Box2D 是一个开源的物理引擎,广泛应用于游戏开发、模拟仿真、机器人仿真等领域。它提供了一个通用的碰撞检测和物理模拟引擎,可以模拟各种物理现象,如碰撞、摩擦、弹跳等。 在本文中,我们将使用...

    Cocos2d-x HelloWorld代码部分类图及时序图

    了解这些基础知识后,开发者可以进一步学习Cocos2d-x的其他特性,比如动作(Actions)、粒子系统(Particle System)、物理引擎(Box2D或Chipmunk)、动画(Animation)等,以创建更复杂的游戏和应用。Cocos2d-x还...

    物理引擎Box2D 中文教程

    ### 物理引擎Box2D 中文教程 #### 1. 导言 **1.1 关于** Box2D 是一款专为游戏设计而打造的2D刚体仿真库。该库允许开发者在游戏中实现更加真实可信的物体运动效果,从而增加游戏的互动性和沉浸感。从游戏开发者的...

    NDK编译Box2D_V2.2源码

    根据Box2D的“HelloWorld”示例,将C++代码移植到Android平台,创建世界、定义物体、处理物理步骤。在Android的生命周期方法中调用相应的初始化和更新方法。 8. **构建与调试**: 使用Android Studio的构建系统...

    Box2D中文手册

    ### Box2D中文手册:Cocos2D-X物理引擎Box2D详细使用教程 #### 1. 导言 Box2D是一款专为游戏开发设计的2D刚体物理仿真库,其目标是通过模拟真实世界的物理效果,使得游戏中的物体运动更为自然,增强游戏的真实感与...

    box2d中文帮助文档

    首先,Box2D的HelloWorld教程是一个很好的起点,它展示了如何创建一个基本的物理世界。以下是一些关键步骤: 1. 创建**世界**(b2World):这是所有物理计算发生的环境。你需要指定一个边界(b2AABB)和重力(g)...

    box2d 中文手册

    此外,Chris Hecker和David Baraff的教程以及维基百科等资源提供了丰富的物理和数学知识,有助于加深对Box2D基本概念的认识。同时,由于Box2D基于C++开发,因此掌握C++编程是使用该库的先决条件。 #### 三、Box2D...

    box2d制作的单摆

    2. **HelloWorld.as**: 这可能是一个基础的示例类,展示如何在Box2D中创建和操作物体。在单摆场景中,它可能包含创建摆锤和悬挂点的代码,以及定义它们的物理属性,如质量、形状和初始位置。 3. **Rope.as**: 这个...

Global site tag (gtag.js) - Google Analytics