Box2d をやってみる… チュートリアル1 (5) ApplyLinearImpulse

まだまだ Box2d のチュートリアルの続き。

http://www.raywenderlich.com/28602/intro-to-box2d-with-cocos2d-2-x-tutorial-bouncing-balls

うーん、やっとここまできた… ^^;

今日は kick()メソッドを追加するみたい。よしやってみる。

まずは HelloWorldScene.h にメソッドを追加。

    virtual void kick();

あとは HelloWorldScene.cpp に実装して行く。

kickメソッドはこんな感じ。

void HelloWorld::kick()
{
    for (b2Body * b = _world->GetBodyList(); b; b = b->GetNext())
    {
        float angle = CC_DEGREES_TO_RADIANS(b->GetAngle());
        const float distance = 200.0f;

        b2Vec2 force = b2Vec2(distance * cos(angle) - distance * sin(angle),
                              distance * sin(angle) + distance * cos(angle));

        b->ApplyLinearImpulse(force, b->GetPosition());
    }
}

画面端で跳ね返すために 床の他に壁を追加。(四方を囲む感じっぽい)

    //box2d floor & wall
    {
        b2Body * body = NULL;
        {
            b2BodyDef bodyDef;
            {
                bodyDef.type = b2_staticBody;
                bodyDef.position.Set(0.0f, 0.0f);
            }

            body = _world->CreateBody(&bodyDef);
        }

        if (body)
        {
            b2FixtureDef fixtureDef;
            {
                b2EdgeShape shape;
                {
                    //左下 -> 右下
                    shape.Set(b2Vec2(0.0f, 0.0f),
                              b2Vec2(winSize.width / PTM_RATIO, 0.0f));
                }

                fixtureDef.shape = &shape;
            }
            body->CreateFixture(&fixtureDef);

            {
                b2EdgeShape shape;
                {
                    //左下 -> 左上
                    shape.Set(b2Vec2(0.0f, 0.0f),
                              b2Vec2(0.0f, winSize.height / PTM_RATIO));
                }
                fixtureDef.shape = &shape;
            }
            body->CreateFixture(&fixtureDef);

            {
                b2EdgeShape shape;
                {
                    //左上 -> 右上
                    shape.Set(b2Vec2(0.0f, winSize.height / PTM_RATIO),
                              b2Vec2(winSize.width / PTM_RATIO, winSize.height / PTM_RATIO));
                }

                fixtureDef.shape = &shape;
            }
            body->CreateFixture(&fixtureDef);

            {
                b2EdgeShape shape;
                {
                    //右上 -> 右下
                    shape.Set(b2Vec2(winSize.width / PTM_RATIO, winSize.height / PTM_RATIO),
                              b2Vec2(winSize.width / PTM_RATIO, 0.0f));
                }
                fixtureDef.shape = &shape;
            }
            body->CreateFixture(&fixtureDef);
        }
    }

最後に kickメソッドを schedule登録。

    this->schedule(schedule_selector(HelloWorld::kick), 5.0f);

エミュレーターで試してみると、画面端で跳ね返った ^^
次はタップ操作でとりあえず完結みたい。また明日がんばろう。^^


Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です