Box2D C++教程-设置世界(World)7

来源:互联网 发布:今天网络怎么这么差 编辑:程序博客网 时间:2024/05/10 11:50

Box2D C++教程-设置世界(World)7

本文出自http://www.wenbanana.com稻草人博客,欢迎访问!

 

转载自:http://www.ohcoder.com/post/2012-06-14/40027381940

世界(Worlds)

世界作为Box2D世界里主要的实体,在之前的讨论话题中已简单的介绍过。当你创建或者删除物体的时候,可以调用世界里的方法来完成这些功能,所以世界也管理着所有对象的空间分配。这也就意味着世界非常重要,那么就让我们来看看世界到底可以做些什么吧。

·        定义重力加速度

·        调用物理模拟

·        发现定制器的作用域

·        切断射线并找到相交的定制器

最后两个特性会在后面的话题里展开讲解,目前我们只看看第一个特性以及世界的生命周期。testbed为我们做了这些,而且我们已经使用了类成员变量中m_world,所以相比于创建一个测试场景来说,我们只对它做一个快速查看。

世界(world)的创建像其它普通类型一样,在构造函数里进行基本的设置。

1

2

3

4

b2Vec2 gravity(0, -9.8);  //normal earth gravity, 9.8 m/s/s straight down!

bool doSleep =  true;

   

b2World* myWorld = new b2World(gravity, doSleep);

重力加速度的设置会影响世界里的每个动态物体,而且你还可以在以后的时间里通过SetGravity()方法改变重力加速度。比如说,试着将之前我们所创建的场景里的重力加速度改为0,看看会发生什么。

1

m_world->SetGravity(  b2Vec2(0,0) );

睡眠参数设定了当物体不受外界作用的时候是否允许睡眠('sleep'),此举可以提高程序运行的效率。如果这个参数为真(true),那么物体当不受作用时候会不进行状态模拟的计算,而一旦有外界作用而被叫醒('wake')的时候,会重新对其进行模拟。比如和其它物体发生碰撞,从而产生作用力作用于物体上,等等。

注意:Box2D v2.2.1版本开始,睡眠参数被移除,并默认为真(true)。如果想改变参数状态需要调用b2World::SetAllowSleeping(bool)方法。

一旦像上面那样创建了一个世界,你就可以像我们之前做的那样往世界里添加物体。为了让有趣的事情发生,我们需要不停的调用Step()方法来模拟物理世界的运行。当然了这一步也被testbed框架中,作为Test类的一部分完成了。

float32 timeStep =  1/20.0;  //the length of time passed to simulate (seconds)

int32 velocityIterations =  8;  //how strongly to correct velocity

int32 positionIterations =  3; //how strongly to correct position

                                                                             

myWorld->Step( timeStep,  velocityIterations, position iterations);

在这个例子中,1/20秒调用一次Setp方法,所以在场景中的物体如果每秒移动5米,那么每调用Setp一次物体就移动5/20=0.25米。当然timeStep参数还会影响到世界中所有受到重力的物体。或许现在你发现了通过调整时间步长,能够影响物体产生不同加速度。为了让模拟看起来更逼真,在游戏中你通常会将timeStep的值设置成每次调用Step()方法的频率值。比如说testbed中,默认的帧率为每秒60帧,所以Step()方法也会在一秒内调用60次,并且把timeStep设置成1/60秒。

当物体之间发生碰撞时,速度迭代和位置迭代的设置将会对其产生影响。通常在Box2D中,当两个物体进行碰撞检测时,物体之间会发生重叠(互相进入),所以需要做一些计算来得出哪个物体应该移动或者旋转,来使它们不再发生重叠。让这两个数值越大,模拟的精度也就越高,当然了性能要求也就会越高。

清除

当世界对象完成了所有工作的时候,就可以将其简单的删除:

delete myWorld;

当世界像这样被删除之后,它也会它所关联的所有连接器和物体都删除掉。记住!当进行了此操作之后就不要再使用删除的物体指针!

 

原创粉丝点击