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