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