转载标明出处: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.
总结
本次蛤蟆开始了代码实战,由于白天较忙,晚上精力有限,进度缓慢了一些。喜欢就行哈!下一个笔记,蛤蟆就做点能动的。