1

私は2つのボディを結合しようとしているアプリを作成しています.1つのボディを移動すると、2番目のボディは最初のボディ内で移動する必要があります。

ボディを作成するコードは次のとおりです。

    - (b2Body *)addBoxBodyForDynamicSprite:(CCSprite *)sprite {

    b2BodyDef spriteBodyDef;
    spriteBodyDef.type = b2_dynamicBody;
    //spriteBodyDef.position.Set(sprite.position.x/PTM_RATIO, sprite.position.y/PTM_RATIO);
    CGPoint asolutePoint = [sprite.parent convertToWorldSpace:sprite.position];
    spriteBodyDef.position.Set(asolutePoint.x/PTM_RATIO, asolutePoint.y/PTM_RATIO);
    spriteBodyDef.userData = (__bridge void*)sprite;
    b2Body *spriteBody = world->CreateBody(&spriteBodyDef);

    b2PolygonShape spriteShape;
    spriteShape.SetAsBox(sprite.contentSize.width/PTM_RATIO/2,
                         sprite.contentSize.height/PTM_RATIO/2);
    b2FixtureDef spriteShapeDef;
    spriteShapeDef.shape = &spriteShape;
    spriteShapeDef.density = 0.3;
    spriteShapeDef.isSensor = true;
    spriteBody->CreateFixture(&spriteShapeDef);

    return spriteBody;
}

一方のボディはキネマティックで、もう一方のボディはダイナミックです。以下を使用してこれらのボディを移動しています。

theBody->SetTransform(locationWorld, theBody->GetAngle());

ここに直線的な力を適用すると、ボディは動かず、それらを固定するために使用したジョイントはb2WeldJoint.

b2JointDef jointDef;
    jointDef.bodyA = another;
    jointDef.bodyB = leftHandFixBody;
    aJoint = (b2Joint *)world->CreateJoint(&jointDef);

ダイナミック ボディは移動しますが、キネマティック ボディはその位置に留まります。両方の体を一緒に動かしたい。どんな助けでも本当に感謝します。ありがとう!

4

1 に答える 1

1

また、マニュアルによると、キネマティック ボディは、力を加えることではなく、速度を設定することによって動かされます。

キネマティック ボディは、その速度に従ってシミュレーションで移動します。キネマティック ボディは力に反応しません。これらはユーザーが手動で動かすことができますが、通常、キネマティック ボディはその速度を設定することによって動かされます。キネマティック ボディは無限の質量を持っているかのように動作しますが、Box2D は質量と逆質量に対してゼロを格納します。キネマティック ボディは、他のキネマティック ボディまたはスタティック ボディと衝突しません。

また、 SetTransform(...) を使用して体を移動することは効果的ではないことがわかりました。体をある場所から別の場所にジャンプするためのポータルを作成しましたが、それは機能しました。しかし、シミュレーション サイクルごとに更新すると、ボディは他のボディと衝突しなくなりました。これは単なる注意事項です。

これは役に立ちましたか?

于 2013-11-12T12:38:40.173 に答える