昨晚在别人的博客上学到了用box2d实现物理引擎的知识,可是出现了bug,也不知道为什么,今天在网上查了下,原来是版本的原因。
Box2D v2.*中API已经移除了v1.*中的SetAsEdge方法,所以我们可以用如下方法来替换SetAsEdge方法。
用b2EdgeShape 而不是 b2PolygonShape,直接用b2EdgeShape的Set方法来替换。
老版本b2World两个参数,而新版本却一个参数
老:b2World (constb2Vec2 &gravity, bool doSleep);
新:b2World (constb2Vec2 &gravity);
原来代码:
bool doSleep = true;
_world = new b2World(gravity, doSleep); //老版本两个参数
//创建世界
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);
b2Body *groundBody = _world->CreateBody(&groundBodyDef);
b2PolygonShape groundBox;
b2FixtureDef boxShapeDef;
boxShapeDef.shape = &groundBox;
groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(0, winSize.height/PTM_RATIO),
b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO));
改正后代码:
_world = new b2World(gravity);
//创建世界
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);
b2Body *groundBody = _world->CreateBody(&groundBodyDef);
b2EdgeShape groundBox;
b2FixtureDef boxShapeDef;
boxShapeDef.shape = &groundBox;
groundBox.Set(b2Vec2(0,0),b2Vec2(winSize.width/PTM_RATIO,0));
groundBody->CreateFixture(&boxShapeDef);
groundBox.Set(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);
groundBox.Set(b2Vec2(0, winSize.height/PTM_RATIO),
b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO));