您的位置:首页 > 编程语言 > C语言/C++

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

2012-09-01 18:33 190 查看
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;
当世界像这样被删除之后,它也会它所关联的所有连接器和物体都删除掉。记住!当进行了此操作之后就不要再使用删除的物体指针!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: