Box2D C++ 教程 第五节:物体(Bodies)
2014-03-11 21:44
176 查看
Box2D
C++ 教程 第五节:物体(Bodies)
作者 firedragonpzy14 十一月, 2012
暂无评论
声明:本教程翻译自:Box2D
C++ tutorials-Bodies,仅供学习参考
物体(Bodies)
物体是物理场景中的基本对象,但是这里的物体并不是你看到的实际互相弹跳碰撞的实物。听起来很费解吗?挺住!马上做解释!
你可以把物体想象成是一种看不见摸不着的实物的属性。这些不可见的属性是:
质量(mass)-实物到底有多重
速度(velocity)-某方向上实物到底运动多快
转动惯量(rotational inertia)-开始或停止转动需要多大的力
角速度(angular velocity)-某方向实物转动的速度有多快
位置(location)-实物在哪
角度(angle)-实物面向哪个方向
即便你知道一个对象的所有这些特性,你仍然不清楚这到底意味着什么或者它们之间产生碰撞的时候,它们会有什么样的反应。我们需要使用定制器(fixtures)来定义物体的形状和大小,关于定制器我们会在本教程的下一个话题进行讲解。目前我们还是使用一个简单的盒子来代替随后出现的定制器(fixture)的一些细节。让我们创建一个物体并为它设置一些基本属性,来看看是如何工作的吧。
有三种类型的物体:静态物体(static),动态物体(dynamic)以及运动学物体(kinematic)。前两个顾名思义看起来更好理解一些。最后一个看起来理解起来并不是那么的直观。目前先忽略一些细节,随后再进行解释。首先我们将创建一个动态物体,我们可以在场景中的地面上看到它可以移动,然后试图设置速度,等等。开始吧。
创建物体
首先为物体的创建做一个定义,用它来创建物体自身。如果你想创建多个相同或相似的物体,这么做会很方便(译者注:这里所说的创建物体的定义就是下面代码中的b2BodyDef结构体的定义,以后所创建的物体都可以根据这个结构体做快速初始化)。在Footest类的构造方法里,添加如下代码,来创建物体定义:
?
?
为物体设置大小,形状以及其它明确的性质,我们通过添加定制器(fixtures)实现。此外,即便为物体添加默认的定制器也会影响物体的质量。物体可以附加多个定制器,附加的每一个定制器都会影响物体的总质量。目前,我们只为物体添加一个简单的定制器,一个四方形,定制器本来是下一次教程的话题,现在细说有点超前。
?
现在,当你运行程序,会看到一个下落的小盒子。如果你足够快,你可以用鼠标捕捉它,然后随意拖拽,如果小盒子丢出屏幕范围可以按restart按钮(R键)重新开始。既然这是个动态物体,那么它可以移动并且旋转,还会受到重力的影响。
设置物体属性
现在,我们设置一些文章开始提到的属性,看看会发生什么。比如说,改变初始位置和角度:
?
?
?
现在让我们看看什么是静态物体。既然我们已经自定义了物体定义和定制器,那我们就重用它们,只修改一些必须的特性:
?
运动学物体(Kinematic bodies)
最后,让我们来看看所有关于运动学物体的部分。正如我们之前看到的动态物体可以移动,但静态物体不能移动。当一个静态物体和动态物体发生碰撞的时候,静态物体总能“获胜”并且把持住自己,并且被弹回,两个物体不会发生重叠。运动学物体非常像静态物体,当它与动态物体相撞之后,总能保持自己不动,把动态物体反弹回去,与静态物体唯一不同的是,运动学物体可以被移动。
可以像下面这样创建一个运动学物体:
?
新创建的物体在场景中可以被移动或者旋转,但不会被重力所影响,并且当与动态物体发生碰撞的时候也不会受到影响。注意当它与静态物体发生接触的时候,它们之间是没有相互作用的。
在大多数游戏中,动态物体通常被用来创建玩家和其它场景中的角色,静态物体被用来创建墙,地板等等。运动学物体通常用来扮演那些可以移动或旋转但是不能被动态物体所相撞的物体。一个比较恰当的例子是平台场景游戏中,移动的平台可以使用运动学物体来模拟-这可以保证不论玩家如何跳跃,都不能与之发生相撞。
获取物体属性(Getting body properties)
很多情况下你都想知道物体目前在哪儿或者移动有多块,旋转角度等等。实现这个很简单,让我们马上就尝试一下。为了达到这个效果,我们需要在Step()方法中访问物体变量,所以我们需要声明一个类的成员变量来代替只在构造函数中声明变量。
?
?
你可以通过GetPositon()和GetAngle()方法返回SetTransform所设置的值,而且不会发生值的改变。比如说,像下面这行代码根本不会改变物体的移动。
?
遍历世界中的物体
如果你想监视世界中的所有物体,你可以像下面这样做。GetBodyList()方法可以返回物体链表的第一个元素。
?
当一个物体完成了它的使命,你可以通过调用世界对象的DestroyBody方法:
?
相关文章推荐
- Box2D C++教程5-物体(Bodies)
- Box2D C++ 教程-物体
- Box2D C++ 教程-安全地移除物体
- Box2D C++ 教程-物体
- Box2D C++ 教程-物体
- Box2D C++教程14-自己绘制物体
- Box2D C++教程8-力和冲量
- Box2D C++教程18-碰撞过滤器
- Box2D C++ 教程-创建测试
- Box2D C++ 教程-设置世界
- Box2D C++ 教程-用户数据
- Box2D C++ 教程-力和冲量
- Box2D C++ 教程-使用debug Draw
- Box2D C++教程-自定义重力9
- Box2D C++ 教程-碰撞过滤
- Box2D C++ 教程-自定义重力
- Box2D C++ 教程-画自己的图像
- Box2D C++ 教程-匀速运动
- Box2D C++ 教程-用户数据
- Box2D C++ 物体的安全删除