在上一篇文章中我们创建了的一个物理世界,当物理世界中的刚体一个也没有显示出来。为显示物理世界中的物体,我们需要引入GLES-Render(调试Box2D使用)。这两个文件可以再
%Cocos_Home%\samples\Cpp\TestCpp\Classes\Box2DTestBed中找到,将这两个文件拷贝到项目中并引入工程中。
再声明一个变量
b2World* world;
b2Body* wallBody ; float32 wallLineOffset ; GLESDebugDraw* m_debugDraw; //调试物理世界绘制对象
声明两个函数
void printDebugDraw(bool isPrint);
virtual void draw();
printDebugDraw实现
void HelloWorld::printDebugDraw(bool isPrint){
if(!isPrint)
return;
//根据像素与米的转换系数创建调试绘制对象
m_debugDraw = new GLESDebugDraw( PIXEL_TO_METER );
world->SetDebugDraw(m_debugDraw); uint32 flags = 0;
flags += b2Draw::e_shapeBit; //显示刚体上的形状
// flags += b2Draw::e_jointBit; //显示关节
// flags += b2Draw::e_aabbBit;
// flags += b2Draw::e_pairBit;
// flags += b2Draw::e_centerOfMassBit;
m_debugDraw->SetFlags(flags); }
draw实现
void HelloWorld::draw()
{
CCLayer::draw(); ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); kmGLPushMatrix(); world->DrawDebugData(); kmGLPopMatrix(); }
修改createWorld
void HelloWorld::createWorld()
{
b2Vec2 gravity;
gravity.Set(0.0f,-9.0f); //物理世界重力向量,这里创建一个向下的重力向量
b2BodyDef* bodydef = new b2BodyDef();
world = new b2World(gravity); //根据重力向量创建物理世界对象 world->SetAllowSleeping(true); //允许休眠
world->SetWarmStarting(true); //初始状态将受到重力影响 printDebugDraw(true);
}
现在运行看看效果吧
物理世界的物体就显示出来了,但那几个球怎么没有动呢?不用急,是因为我们还没有让物理世界运行起来。
让物理世界运行起来
添加函数
void HelloWorld::update(float dt)
{
//速度迭代次数
int velocityIterations = 8;
//位置迭代次数
int positionIterations = 1; world->Step(dt, velocityIterations, positionIterations); //dt为时间步长 }
在init方法中添加代码
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
return false;
} wallLineOffset = 0.5; this->createWorld();
this->createWall();
this->createBall(); this->scheduleUpdate(); //不断调用update函数
…… return true;
}
再运行看看效果