Reputation: 143
I'm using cocos2d-x 2.0.3 with Box2d 2.2.1 and has first example I've introduced a dynamic body (a boat defined with PhysicsEditor) in a frame. Applying a gravity the behaviour expected is that the boat collide with the frame but instead it go through.
Here is the definition of world and bodies:
// create world
b2Vec2 gravity;
gravity.Set(0.1f, -0.0f);
bool doSleep = true;
world = new b2World(gravity);
world->SetAllowSleeping(doSleep);
world->SetContinuousPhysics(true);
// Debug Draw functions
m_debugDraw = new GLESDebugDraw( PTM_RATIO * CCDirector::sharedDirector()->getContentScaleFactor());
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);
// for the screenBorder body we'll need these values
CCSize screenSize = size;
float widthInMeters = screenSize.width / PTM_RATIO;
float heightInMeters = screenSize.height / PTM_RATIO;
b2Vec2 lowerLeftCorner = b2Vec2(- widthInMeters / 2, 0.0);
b2Vec2 lowerRightCorner = b2Vec2(widthInMeters / 2, 0.0);
b2Vec2 upperLeftCorner = b2Vec2(- widthInMeters / 2, heightInMeters);
b2Vec2 upperRightCorner = b2Vec2(widthInMeters/2, heightInMeters);
// Define the static container body, which will provide the collisions at screen borders.
b2BodyDef screenBorderDef;
screenBorderDef.position.Set(0, 0);
screenBorderDef.type = b2_staticBody;
b2Body* screenBorderBody = world->CreateBody(&screenBorderDef);
b2EdgeShape screenBorderShape;
// Create fixtures for the four borders (the border shape is re-used)
screenBorderShape.Set(lowerLeftCorner, lowerRightCorner);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
screenBorderShape.Set(lowerRightCorner, upperRightCorner);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
screenBorderShape.Set(upperRightCorner, upperLeftCorner);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
screenBorderShape.Set(upperLeftCorner, lowerLeftCorner);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
// add sail boat sprite
CCSprite *sailBoatSprite = CCSprite::create("SailBoat.png");
addChild(sailBoatSprite, -1, kSailingBoat);
sailBoatSprite->setAnchorPoint(ccp(0.5, 0.5));
sailBoatSprite->setPosition(ccp(0.0, 128.0));
// add sail boat body
GB2ShapeCache *shapeCache = GB2ShapeCache::sharedGB2ShapeCache();
shapeCache->addShapesWithFile("SailBoat.plist");
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(0.0/PTM_RATIO, 128.0/PTM_RATIO);
bodyDef.userData = sailBoatSprite;
b2Body *body = world->CreateBody(&bodyDef);
shapeCache->addFixturesToBody(body, "SailBoat");
sailBoatSprite->setAnchorPoint(GB2ShapeCache::sharedGB2ShapeCache()->anchorPointForShape("SailBoat"));
this->schedule(schedule_selector(SailingFieldNode::tick));
Here is the updates method:
void SailingFieldNode::tick(float dt)
{
int32 velocityIterations = 8;
int32 positionIterations = 1;
world->Step(0.01, velocityIterations, positionIterations);
for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
{
if (b->GetUserData() != NULL) {
CCSprite *myActor = (CCSprite*)b->GetUserData();
myActor->setPosition(ccp( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO));
myActor->setRotation(-1 * CC_RADIANS_TO_DEGREES(b->GetAngle()));
}
}
}
void SailingFieldNode::draw()
{
CCLayer::draw();
ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position);
kmGLPushMatrix();
world->DrawDebugData();
kmGLPopMatrix();
CHECK_GL_ERROR_DEBUG();
}
As you can see in the following screenshot the boat is in the frame then there should be the collision:
Any help?
Thanks in advance.
Jean
Upvotes: 0
Views: 424
Reputation: 143
Problem solved, the issue was that in PhysicsEditor I haven't set the dynamic body in a category (with the flag). In my code I don't use them yet but probably you must set it in one category to have collisions (I've set my body in bit_0).
Jean
Upvotes: 0