在玩游戏时,我希望能够更改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个像素?我需要删除整个地面实体并重新创建地面实体和固定装置,还是可以仅删除或修改现有的地面固定装置?

最佳答案

我发现它可以破坏当前的GroundBody,然后创建一个新的GroundBody,并且地面固定装置可以正常工作。我不知道这是否最适合性能,但它的工作方式就像我想要的那样。

因此,基本上,在比赛期间的适当时间,我会执行以下操作:

    world->DestroyBody(groundBody);

然后,我重新执行在上面的问题陈述中显示的代码,将verts数组中的20.0像素值替换为50.0像素值,如下所示:
b2Vec2 verts[] = {
    b2Vec2(-screenSize.width / 100.0, 50.0 / 100.0),
    b2Vec2(screenSize.width / 100.0, 50.0 / 100.0)
}

关于ios - 如何在Box2D地面物体中更改地面固定装置的边缘,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15073261/

10-10 20:37