I've created a pretty simple setup using Cocos2d (2.0) and Box2d that comes packaged with it. I have a few bodies in my world, but don't have sprites linked up with them yet and I want to debug their orientations, positions, etc.
This seems like a pretty standard task, but I could not find out how to do this easily. From my research it seems related to these methods:
_world->SetDebugDraw(...);
_world->DrawDebugData(...);
// and the GLES-Render class
Help?
I figured it out in case anyone else stumbles across this.
- In your initialization, you want to create a debug draw object
(GLESDebugDraw comes with Cocos2d+Box2d).
- Set the flags to specify what you want drawn (shapes, center of gravity, joints, etc.).
- Assign it to your world object.
b2Draw *debugDraw = new GLESDebugDraw(PTM_RATIO);
debugDraw->SetFlags(GLESDebugDraw::e_shapeBit);
_world->SetDebugDraw(debugDraw);
Then, the trick is that you need to override ccLayer's draw method and call:
_world->DrawDebugData();
It must be in the draw method otherwise this won't work. I initially tried to put it in my own scheduled method (where I call _world->step()) and this did not work.
IN The coco2dx v2.2 this is done as
//Write this in init()
_debugDraw = new GLESDebugDraw(PTM_RATIO);
_world->SetDebugDraw(_debugDraw);
uint32 flags = 0;
flags += b2Draw::e_shapeBit;
flags += b2Draw::e_jointBit;
flags += b2Draw::e_aabbBit;
flags += b2Draw::e_pairBit;
flags += b2Draw::e_centerOfMassBit;
_debugDraw->SetFlags(flags);
//////////////////////////////////////////////////
void HelloWorld::draw()
{
CCLayer::draw();
if CC_ENABLE_BOX2D_INTEGRATION
ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
kmGLPushMatrix();
_world->DrawDebugData();
kmGLPopMatrix();
endif
}
Check in Application.mk file if there is
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1
then replace it with
APP_CPPFLAGS := -frtti -DCC_ENABLE_BOX2D_INTEGRATION=1 -DCOCOS2D_DEBUG=1