Cocos2d-x 3.x版本物理引擎的使用参考@L_301_1@
物理引擎并非每款游戏的必需品,但它却可以更好的模拟现实世界的真实感。
想要精通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_RATIO32
加入下列代码:
我们在物理世界创建一个精灵时,便可以通过B2Sprite类来创建,当然前提是你希望这个对象受到物理效果的影响。
下面我们继续在.h文件中添加Box2dHandler类,在Box2dHandler类中将包含所有相关的物理操作。
注意第30行,我们创建了一个GLESDebugDraw的对象,这个类的封装是位于"GLES-Render.h"和"GLES-Render.cpp"文件中的,这两个文件需要我们手动引入,文件目录为:cocos2d-x-2.2.1/samples/Cpp/TestCpp/Classes/Box2DTestBed
下面我们将这些方法一一实现:
这样,基本的方法就已经全部完成,当然,update函数以及碰撞检测的函数中的函数体部分根据需求不同会有变化,我们这里并没有添加太多的内容,下面我们来看一下Box2dHandler类的使用方法,打开项目中的HelloWorld.cpp文件,引入Box2dHandler类的头文件,并在Init()方法中加入下列代码:
由于我们在物理世界中,将y轴重力设置成了-10,所以运行项目后,我们会看到屏幕上又两个精灵从落下,一个位于屏幕中心,一个位于顶部,两个精灵的周围有红色的半透明矩形,当物体落到底部后,控制台会输出"开始碰撞",矩形也会变成灰色,说明已经处于休眠状态,当再次收到物理效果影响时便会激活。