2014/01/22

liquidFunとSpriteKitでボールを使う

前回の記事「liquidfunをSpriteKit上で動かしてみる」の続きです。

今回は軽め記事として、ボールを追加できるようにしてみます。

ボックスとボールは共通部分があるのでコードをまとめて、せっかくのObjective-C++なので、ラムダ式を使ってみました。

auto createFixtureWithValues = [](b2Body* body, const b2Shape* shape, float density, float friction, float restitution) {
    b2FixtureDef def;
    def.shape = shape;
    def.density = density;
    def.friction = friction;
    def.restitution = restitution;
    body->CreateFixture(&def);
};

auto createDynamicBody = [self](const CGPoint& pos) -> b2Body* {
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(pos.x / DISPLAY_SCALE, pos.y / DISPLAY_SCALE);
    return _world->CreateBody(&bodyDef);
};

auto addBall = [self,createDynamicBody,createFixtureWithValues](const CGPoint& pos, float radius) {
    const float r = radius * DISPLAY_SCALE;

    SKShapeNode* node = SKShapeNode.alloc.init;
    UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(-r, -r, r*2, r*2)];
    node.path = ovalPath.CGPath;
    node.fillColor = UIColor.whiteColor;
    node.lineWidth = 0;
    node.position = pos;
    [self addChild:node];

    b2Body* body = createDynamicBody(pos);
    b2CircleShape ballShape;
    ballShape.m_radius = radius;
    createFixtureWithValues(body, &ballShape, 1.0f, 0.8f, 0.8f);
    body->SetUserData((__bridge void*) node);
};

auto addBall = [self,createBody,createFixtureWithValues](const CGPoint& pos, float radius) {
    const float r = radius * DISPLAY_SCALE;
    UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(-r, -r, r*2, r*2)];
    b2CircleShape ballShape;
    ballShape.m_radius = radius;

    SKShapeNode* node = SKShapeNode.alloc.init;
    node.path = ovalPath.CGPath;
    node.fillColor = UIColor.whiteColor;
    node.lineWidth = 0;
    node.position = pos;
    [self addChild:node];

    b2Body* body = createBody(pos);
    createFixtureWithValues(body, &ballShape, 1.0f, 0.3f, 0.4f);
    body->SetUserData((__bridge void*) node);
};

これで、次のようにすると、ボックスとボールとそれぞれ作成できます。

addBox(location, 0.5f, 0.5f);
addBall(location, 0.5);

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。