0

私は Box2D を初めて使用し、いくつかのボックスと地面で単純なシーンを取得しようとしていますが、何をしてもボックスが地面を通り抜けて落ちてしまいます。

これは、Box2D ワールドを初期化する方法です。

b2Vec2 gravity;
gravity.Set(0.0f, -9.81f);

bool doSleep = true;

world = new b2World(gravity);
world->SetAllowSleeping(doSleep);
world->SetContinuousPhysics(true);

b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0, 0); // bottom-left corner

b2Body* groundBody = world->CreateBody(&groundBodyDef);

b2EdgeShape groundBox;

groundBox.Set(b2Vec2(0,0), b2Vec2(screenSize.width/PTM_RATIO,0));
groundBody->CreateFixture(&groundBox, 0);

groundBox.Set(b2Vec2(0,screenSize.height/PTM_RATIO), b2Vec2(screenSize.width/PTM_RATIO,screenSize.height/PTM_RATIO));
groundBody->CreateFixture(&groundBox, 0);

groundBox.Set(b2Vec2(0,screenSize.height/PTM_RATIO), b2Vec2(0,0));
groundBody->CreateFixture(&groundBox, 0);

groundBox.Set(b2Vec2(screenSize.width/PTM_RATIO,screenSize.height/PTM_RATIO), b2Vec2(screenSize.width/PTM_RATIO,0));
groundBody->CreateFixture(&groundBox, 0);

そして、これは私がオブジェクトをシーンに追加する方法です:

b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;

CGPoint p = CGPointMake(sprite.x, sprite.y);

bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
bodyDef.userData = (void*)sprite;

b2Body *body = world->CreateBody(&bodyDef);

b2PolygonShape dynamicBox;

dynamicBox.SetAsBox(sprite.width/PTM_RATIO, sprite.height/PTM_RATIO);

b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 13.0f;
fixtureDef.friction = 0.0f;
fixtureDef.restitution = 0.5f;
body->CreateFixture(&fixtureDef);

body->SetType(b2_dynamicBody);

sprite.physicsBody = body;

そして、これは私のティッカーです:

int32 velocityIterations = 8;
int32 positionIterations = 1;

world->Step(1.0f/60.0f, velocityIterations, positionIterations);

for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
{
    if (b->GetUserData() != NULL)
    {
        SEPhysicsSprite * sprite = (SEPhysicsSprite*)b->GetUserData();

        CGPoint newCenter = CGPointMake(b->GetPosition().x * PTM_RATIO,
                                        b->GetPosition().y * PTM_RATIO);

        sprite.x = newCenter.x;
        sprite.y = newCenter.y;
        sprite.rotation = b->GetAngle();
    }
}

これは画面の下部に地面を作成することになっていますが、オブジェクトが通り抜けてしまいます。私が画面の左側に触れているボックスを落下させた場合、それは何かにぶつかり、衝突している小さな小さなピクセルのように、少し跳ね返ってから落下し続けます。

iphone と c++ などの多くの例を見てきましたが、それらはすべて同様の初期化コードを持っており、コードが機能しない理由がわかりません。半減してください!

4

0 に答える 0