在上一篇文章中咱們建立了的一個物理世界,當物理世界中的剛體一個也沒有顯示出來。爲顯示物理世界中的物體,咱們須要引入GLES-Render(調試Box2D使用)。這兩個文件能夠再函數
%Cocos_Home%\samples\Cpp\TestCpp\Classes\Box2DTestBed中找到,將這兩個文件拷貝到項目中並引入工程中。ui
再聲明一個變量this
b2World* world; b2Body* wallBody ; float32 wallLineOffset ; GLESDebugDraw* m_debugDraw; //調試物理世界繪製對象
聲明兩個函數spa
void printDebugDraw(bool isPrint); virtual void draw();
printDebugDraw實現debug
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 code
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); }
物理世界的物體就顯示出來了,但那幾個球怎麼沒有動呢?不用急,是由於咱們尚未讓物理世界運行起來。對象
讓物理世界運行起來blog
添加函數ci
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; }
再運行看看效果