在游戏过程中,我希望能够在Box2D世界中改变地面边缘。我创造了一个地面体,然后我在身体上添加了一个地面固定装置。例如,以下代码将在我的Box2D世界中在屏幕底部上方20像素处创建一个平坦的地面:
b2BodyDef groundBodyDef;
groundBodyDef.type = b2_staticBody;
groundBodyDef.position.Set(0, 0);
groundBody = world->CreateBody(&groundBodyDef);
b2PolygonShape groundShape;
b2FixtureDef groundFixtureDef;
groundFixtureDef.shape = &groundShape;
groundFixtureDef.density = 0.0;
CGSize screenSize = [CCDirector sharedDirector].winSize;
int num = 2;
b2Vec2 verts[] = {
b2Vec2(-screenSize.width / 100.0, 20.0 / 100.0),
b2Vec2(screenSize.width / 100.0, 20.0 / 100.0)
};
for(int i = 0; i < num - 1; ++i) {
b2Vec2 offset = b2Vec2(screenSize.width/2/PTM_RATIO,
20.0/2/PTM_RATIO);
b2Vec2 left = verts[i] + offset;
b2Vec2 right = verts[i+1] + offset;
groundShape.SetAsEdge(left, right);
groundBody->CreateFixture(&groundFixtureDef);
}
假设我需要更改verts数组以获得不同的地面夹具定义?例如,是否可以在玩家的移动之间动态地将地面提高50个像素?我是否需要删除整个地面体并重新创建地面体和夹具,或者我可以删除或修改现有的地面夹具?
答案 0 :(得分:1)
我发现它可以破坏当前的地面体,然后创造一个新的地面和地面固定装置工作正常。我不知道这对性能是否最好,但它的效果就像我想要的那样。
所以基本上,在我游戏的适当时候,我会做以下事情:
world->DestroyBody(groundBody);
然后我重新执行上面问题陈述中显示的代码,用顶点数组中的50.0像素值替换20.0像素值,如下所示:
b2Vec2 verts[] = {
b2Vec2(-screenSize.width / 100.0, 50.0 / 100.0),
b2Vec2(screenSize.width / 100.0, 50.0 / 100.0)
}
答案 1 :(得分:0)
将b2PolygonShape更改为b2EdgeShape。
CGSize s = [[CCDirector sharedDirector] winSize];
b2EdgeShape groundBox;
// bottom
groundBox.Set(b2Vec2(0.0f,0.0f), b2Vec2(s.width/PTM_RATIO,0.0f));
groundBody->CreateFixture(&groundBox,0);
您无法在运行时更改夹具定义。因此,在运行时使用不同的夹具并切换该主体。