1

box2dでcocos2d-xでタンクを作ろうとしています。すべてが正常に機能しますが、タンクを描くと、写真でわかるようにバレルが真ん中にあります。

ここに画像の説明を入力

タンクを描画するには、位置を画面の中央に設定します。タンク本体が描画された後、バレルを描画したいので、画面の中央 + ジョイントの同じオフセットを指定します (ジョイントは右側にあります)位置)。両方のアンカー ポイント、タンクとバレルがオン (0.5, 0.5) で、ジョイントと同じオフセットを使用しているため、バレルが正しい場所に描かれると予想していましたが、そうではありません。

私のコード:

// Create sprite and add it to the layer
    CCSprite *tank = CCSprite::create();
    //tank->initWithFile("Tanks/001/tank.png");
    tank->setPosition(pos);
    tank->setTag(1);
    this->addChild(tank);

    // Create ball body
    b2BodyDef tankBodyDef;
    tankBodyDef.type = b2_dynamicBody;
    tankBodyDef.position = toMeters(&pos);
    tankBodyDef.userData = tank;

    b2Body *tankBody = _world->CreateBody(&tankBodyDef);

    // Create shape definition and add body
    shapeCache->addFixturesToBody(tankBody, "001/tank");


    // Create sprite and add it to the layer
    CCSprite *barrel = CCSprite::create();
    //barrel->initWithFile("Tanks/001/barrel.png");
    barrel->setPosition(CCPointMake(pos.x + 77, pos.y+117));
    barrel->setTag(2);
    this->addChild(barrel);

    // Create barrel body
    barrelBodyDef.type = b2_dynamicBody;
    barrelBodyDef.userData = barrel;
    barrelBodyDef.position = b2Vec2(tankBodyDef.position.x + 2.40625, tankBodyDef.position.y + 3.65625); // = same offset as joint!?!?!
    b2Body *barrelBody = _world->CreateBody(&barrelBodyDef);

    // Create shape definition and add body
    shapeCache->addFixturesToBody(barrelBody, "001/barrel");



    // Create a joint
    //
    b2RevoluteJointDef armJointDef;
    //armJointDef.Initialize(tankBody, barrelBody, b2Vec2(400.0f/PTM_RATIO, 450/PTM_RATIO));
    armJointDef.bodyA = tankBody;
    armJointDef.bodyB = barrelBody;
    armJointDef.localAnchorA.Set(2.40625, 3.65625);
    armJointDef.localAnchorB.Set(-2.90625, -0.125);

    armJointDef.enableMotor = true;
    armJointDef.enableLimit = true;
    armJointDef.motorSpeed  = 10;
    armJointDef.referenceAngle = CC_DEGREES_TO_RADIANS(0); // begin graden
    armJointDef.lowerAngle  = CC_DEGREES_TO_RADIANS(-50); // max graden naar beneden
    armJointDef.upperAngle  = CC_DEGREES_TO_RADIANS(00); // max graden naar boven
    armJointDef.maxMotorTorque = 48;

    armJoint = (b2RevoluteJoint*)_world->CreateJoint(&armJointDef);

誰かが答えてくれることを願っています:)

4

1 に答える 1

0

問題は解決しました:)、バレルアンカーのオフセットも追加する必要がありましたが、今では正しい位置にあります。

于 2013-07-02T08:30:53.200 に答える