瘸腿蛤蟆笔记35-cocos2d-x-3.2 Box2d物理引擎实践调试

转载标明出处:http://blog.csdn.net/notbaron/article/details/38799137

上篇回顾

本篇名言:我们都随时处于正在学习的过程。 [Don Shimoda]

上几篇中,蛤蟆学习了Box2d物理引擎中的大部分理论知识,覆盖面比较广,但是基本没有具体的例子,学得很是心虚。不禁想起老话,不论学知识,还是学技能,我们必须做到理论和实际相结合。好吧,从这篇笔记开始,蛤蟆又要开始实际演练了,Are you ready? Let’s go。

 

理论介绍

         虽然理论在前面几篇已经介绍的很多,但是每次实战中设计到知识,蛤蟆觉得还是很有必要在温习一下的,温故而知新嘛!

         边缘形状(Edgeshape)是线状的。用于协助提供一个自由状态的游戏环境。边缘形状的最大限制是可以刻圆形,多边形碰撞,但是不能和自己碰撞。因为Box2d 的碰撞几何要求至少有一个是由体积的。因为边缘形状是没有体积的,so两个边缘形状就不能碰撞的了。

b2Draw这个类实现 DEBUG画图调用。在每个时间步内都会被调用。

这个Draw类被继承和注册,提供在游戏中画物理实体以供调度。由于Box2D中所有对象都是不可见的,要创建可见对象我们得用刚体定义中的userData属性来创建自己的图形,如果不创建自己的图形,则用b2DebugDraw类来实现物体的可见,方便调试。

void DrawDebugData(); 这个函数用来调用绘画shapes,其他debug数据。这个函数式源代码中实现的,在b2World.cpp文件中,如果小伙伴不是很在意就先忽略它吧。

 

具体步骤

我们还是使用helloworld工程。

1、  首先将\cocos2d-x-3.2\tests\cpp-tests\Classes\Box2DTestBed目录中的两个文件GLES-Render.c,GLES-Render.h,复制到我们自己的所在工厂目录中的classes文件夹中。然后将这两个文件添加到我们自己的工程项目中。这个文件中继承了b2Draw 这个类,实现 DEBUG画图调用。在每个时间步内都会被调用。

2、  然后在HelloWorld.Scene.h头文件中,加入如下

首先是#include "GLES-Render.h"包含刚才的文件

然后在头文件中定义如下:

         GLESDebugDraw *debugDraw;//这个变量

         b2World* world; //物理变量

         virtualvoid draw(Renderer *renderer,constMat4 &transform, uint32_t flags)override;//实现Node的draw函数

3、  在bool HelloWorld::init() 函数中加入如下代码,即可

b2Vec2 gravity;

         gravity.Set(0.0f,-10.0f);  

         world= new b2World(gravity);

         b2BodyDefbd;//

         world->CreateBody(&bd);

         b2Body*ground = world->CreateBody(&bd);

         b2EdgeShapeshape;

         shape.Set(b2Vec2(100.0f,500.0f), b2Vec2(1040.0f, 500.0f));

         ground->CreateFixture(&shape,0.0f);

         b2Vec2vertices[3];

         vertices[0].Set(100.0f,500.0f);

         vertices[1].Set(200.0f,500.0f);

         vertices[2].Set(150.0f,600.0f);

         b2PolygonShapem_polygons[1];

         m_polygons[0].Set(vertices,3);

         m_polygons[0].SetAsBox(100.0f,100.0f);

         float32x = 500.0f;

         float32y = 500.0f;

         bd.position.Set(x,y);

         bd.angle= 30; 

         bd.angularDamping= 0.02f;

         b2Body*m_bodies;

         m_bodies= world->CreateBody(&bd);

         b2FixtureDeffd;

         fd.shape= m_polygons;

         fd.friction= 0.3f;

         m_bodies->CreateFixture(&fd);

         debugDraw= new GLESDebugDraw(0.5);

         world->SetDebugDraw(debugDraw);

         uint32flags = 0;

         flags+= b2Draw::e_shapeBit ;

b2Draw::e_centerOfMassBit;

b2Draw::e_aabbBit;

b2Draw::e_centerOfMassBit;

b2Draw::e_jointBit;

b2Draw::e_shapeBit;

         debugDraw->SetFlags(flags);

 

4、  在HelloWorld.cpp文件中,加入如下函数:

void HelloWorld::draw(Renderer *renderer,constMat4 &transform,uint32_tflags)

{

    Layer::draw(renderer,transform,flags);

         world->DrawDebugData();   //这个一定要写

}

编译运行如下图:

         我们成功将Bodies画到程序里面了哈。Ok,又前进了小步了。

 

代码解释

         Ok,我们解释下代码

b2Vec2 gravity;//定义个变量用于表示重力

         gravity.Set(0.0f,-10.0f);            //设置变量值,是 Y方向-10,就是我们的重力加速度嘛

         world= new b2World(gravity);//通过一个重力向量创建一个物理世界

         b2BodyDefbd;//创建一个Body的定义变量

         world->CreateBody(&bd);//通过默认的Body定义变量创建一个Body

         b2Body*ground = world->CreateBody(&bd);//通过bd创建一个Body

         b2EdgeShapeshape;//定义个边缘形状

         shape.Set(b2Vec2(100.0f,500.0f), b2Vec2(1040.0f, 500.0f));//设置边缘形状的点

         ground->CreateFixture(&shape,0.0f);//通过Shape创建一个Fixture,绑定边缘形状和groud这个Body.

         b2Vec2vertices[3];//定义一个多点的数组

         vertices[0].Set(100.0f,500.0f);

         vertices[1].Set(200.0f,500.0f);

         vertices[2].Set(150.0f,600.0f);

         b2PolygonShapem_polygons[1];//创建一个多边形的Shape变量

         m_polygons[0].Set(vertices,3);//赋值点值给Shape

         m_polygons[0].SetAsBox(100.0f,100.0f);//设置长宽,将Shape定义为一个多边形(此处是正方形)

         float32x = 500.0f;//变量X

         float32y = 500.0f; //变量Y

         bd.position.Set(x,y);//设置下一个Body 的位置

         bd.angle= 30;  //设置下一个Body  的角度

         bd.angularDamping= 0.02f; //设置下一个Body 的摩擦力

         b2Body*m_bodies;//在定义一个Body变量

         m_bodies= world->CreateBody(&bd);//通过bd定义创建一个Body

         b2FixtureDeffd;//创建一个Fixture定义

         fd.shape= m_polygons;//设置Fixture的形状是 那个多边形。

         fd.friction= 0.3f;//设置Fixture的摩擦力,在Fixture上是可以定义摩擦力,回复力和密度的

         m_bodies->CreateFixture(&fd);//将多边形和新建的Body关联起来。

         debugDraw= new GLESDebugDraw(0.5); //新建一个 debug渲染模块

         world->SetDebugDraw(debugDraw);//注册这个 debug类。

         uint32flags = 0;

         flags+= b2Draw::e_shapeBit ;//设置需要画那些东西出来,定义如下(在源代码b2Draw.h头文件中定义

e_shapeBit                                   =0x0001,          ///< draw shapes

                   e_jointBit                                      = 0x0002,          ///< draw joint connections

                   e_aabbBit                                     = 0x0004,          ///< draw axis aligned boundingboxes

                   e_pairBit                             = 0x0008,          ///< draw broad-phase pairs

                   e_centerOfMassBit                   = 0x0010  ///< draw center of mass frame

b2Draw::e_aabbBit; //显示AABB块

b2Draw::e_centerOfMassBit;//显示物体质心

b2Draw::e_jointBit; //显示关节

b2Draw::e_shapeBit; //显示形状

         debugDraw->SetFlags(flags);//设置Flag.

 

总结

         本次蛤蟆开始了代码实战,由于白天较忙,晚上精力有限,进度缓慢了一些。喜欢就行哈!下一个笔记,蛤蟆就做点能动的。

你可能感兴趣的:(瘸腿蛤蟆笔记35-cocos2d-x-3.2 Box2d物理引擎实践调试)