Cocos2d-x教程(17)-Box2D 物理引擎

 欢迎加入 Cocos2d-x 交流群: 193411763
转载时请注明原文地址:
http://blog.csdn.net/u012945598/article/details/17787243


Cocos2d-x 3.x版本物理引擎的使用参考  http://blog.csdn.net/u012945598/article/details/38417333


物理引擎并非每款游戏的必需品,但它却可以更好的模拟现实世界的真实感。

此篇文章我们将初步讲解Box2D的使用方法。

想要精通Box2D并非简单的事情,但简单的使用Box2D却并非什么难事,首先我们需要了解几个常用的概念:

1.世界 b2World  所有的物理效果都是要在物理世界中模拟的,物理世界就是一个大集合,容纳所有刚体,夹具,形状等

2.物体 b2Body   也就是我们物理学中的刚体,一旦创建,则形态不会发生改变

3.形状 b2Shape 形状是依附于夹具的,具有摩擦(friction)和恢复(restitution)等属性,主要用于碰撞检测

4.夹具 b2Fixture  是一种把形状附加到物体上的关系,利用形状可以创建夹具,再将夹具加到物体之上,物体便拥有碰撞能力

5.关节 b2Join     可以将多个物体固定到一起,可以限定一个活动范围,常用属性有 限制(Limits) 和 马达(Motors)


注意事项:

1.物理世界依据的是牛顿定律,并独立于正常的渲染世界的,两个世界一个负责游戏画面渲染,一个负责物理模拟,他们之间存在数据交互。

2.不要试图在碰撞检测的发放中改变物体的状态,我们可以将需要删除的物体用容器保存起来,在驱动方法执行完后异步处理这些不需要的数据。

3.Box2D世界里的最佳物体大小是0.1~10个单位长度的物体,因此我们也应该尽量将物体大小设定在这个范围内,不应直接使用像素值,而应该一个转换率。我们在文件中声明一个宏定义 " #define PTM_RATIO 32  " 单位是像素/米


使用物理引擎的步骤:

1.初始化一个物理世界
2.创建一个精灵
3.为精灵设置物体及夹具

之后这个精灵便能够受物理效果的影响了。

下面新建一个工程,新建一个类,命名为Box2dHandler,我们将在该类中管理所有与物理引擎相关的内容。

我们习惯创建一个精灵类的派生类作为物理世界中的精灵对象,尽管这一步骤并非必须,但是你会发现有了这样的一个类,在之后处理数据时会方便很多。(Cocos2d-x 版本中已经提供了CCPhysicsSprite类)下面在Box2dHandler.h文件中引入头文件

#include "cocos2d.h"

#include "Box2D.h"

USING_NS_CC;

#define PTM_RATIO 32

加入下列代码:

Cocos2d-x教程(17)-Box2D 物理引擎_第1张图片

我们在物理世界创建一个精灵时,便可以通过B2Sprite类来创建,当然前提是你希望这个对象受到物理效果的影响。

下面我们继续在.h文件中添加Box2dHandler类,在Box2dHandler类中将包含所有相关的物理操作。

Cocos2d-x教程(17)-Box2D 物理引擎_第2张图片

注意第30行,我们创建了一个GLESDebugDraw的对象,这个类的封装是位于"GLES-Render.h"和"GLES-Render.cpp"文件中的,这两个文件需要我们手动引入,文件目录为:cocos2d-x-2.2.1/samples/Cpp/TestCpp/Classes/Box2DTestBed

下面我们将这些方法一一实现:

Cocos2d-x教程(17)-Box2D 物理引擎_第3张图片





Cocos2d-x教程(17)-Box2D 物理引擎_第4张图片

Cocos2d-x教程(17)-Box2D 物理引擎_第5张图片

Cocos2d-x教程(17)-Box2D 物理引擎_第6张图片

Cocos2d-x教程(17)-Box2D 物理引擎_第7张图片

Cocos2d-x教程(17)-Box2D 物理引擎_第8张图片

这样,基本的方法就已经全部完成,当然,update函数以及碰撞检测的函数中的函数体部分根据需求不同会有变化,我们这里并没有添加太多的内容,下面我们来看一下Box2dHandler类的使用方法,打开项目中的HelloWorld.cpp文件,引入Box2dHandler类的头文件,并在Init()方法中加入下列代码:


由于我们在物理世界中,将y轴重力设置成了-10,所以运行项目后,我们会看到屏幕上又两个精灵从落下,一个位于屏幕中心,一个位于顶部,两个精灵的周围有红色的半透明矩形,当物体落到底部后,控制台会输出"开始碰撞",矩形也会变成灰色,说明已经处于休眠状态,当再次收到物理效果影响时便会激活。





你可能感兴趣的:(cocos2d-x,cocos2d-x,box2D,box2D,物理引擎,物理引擎,马宗扬)