#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;
}
分享到:
相关推荐
源码下载 博文链接:https://bvu.iteye.com/blog/437656
使用ndk编译box2d物理引擎,并将它移植到android上,测试代码为Box2D自带的Example helloworld.
最简单的helloworld实例上添加物理引擎cocos2d-x box2d 物理引擎
学习cocos2dx后自己整的物理引擎(box2d)的类似helloworld的示例代码。cocos2d-x_Box2d实例代码,完整可运行的工程例子。对初学cocos2dx的物理引擎开发的同志们非常有用!
Box2d V2.1.2 + Qt 4.7.1-vs2008 +VS2008 版hello world
lunar-lander-libgdx-demo 我的“Hello world”应用程序是使用 libGDX 和 Box2d 库创建的。 它是 Atari 于 1979 年开发的月球着陆器游戏的未完成克隆
我们这里的工程名为helloworld。 6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以 直接点击Next。 7.我们将base class 选为QDialog 对话框类。然后点击Next。 8.点击Finish,完成工程的...
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 模拟器 ...
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 (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 ...
思维导图01_hello_world : pixi 逻辑测试02_interaction : 基本鼠标悬停/移出/向下/向上03_prototyping_move:添加界面以“减轻”代码+在交互式obj上添加mousemove。 04_collision_box:添加一个带有简单碰撞盒的...
精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...
精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...
精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...
精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...
精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...
精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 如题。 FreeBird2011最初版(模仿...
Source Code for Hello World with Pygame ................................................................................ 7 Setting Up a Pygame Program ....................................................