2

ゲームのプレイ中に、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 ピクセル高くすることは可能ですか? グランド ボディ全体を削除して、グランド ボディとフィクスチャを再作成する必要がありますか? それとも、既存のグランド フィクスチャを削除または変更するだけでよいですか?

4

2 に答える 2

1

現在の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)
}
于 2013-03-12T22:26:21.580 に答える
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);

実行時にフィクスチャ定義を変更することはできません。したがって、別のフィクスチャを使用し、実行時にそのボディを切り替えます。

于 2013-02-26T17:22:28.120 に答える