0

CCSprite があります (b2body があります)。スコープは、ボディと一緒にある場所に移動して戻るスプライトを作成することです。

この方法で b2body を作成します。

 if (_body) 
    {
        _world->DestroyBody(_body);
    }


    b2BodyDef bd;
    bd.type = b2_kinematicBody;


    _body = _world->CreateBody(&bd);

    b2PolygonShape shape;

    b2Vec2 _p1, _p2 , _p1sub,_p2sub;

    _p1 = b2Vec2(point1.x/PTM_RATIO,point1.y/PTM_RATIO);
    _p2 = b2Vec2(point2.x/PTM_RATIO,point2.y/PTM_RATIO);


    shape.SetAsEdge(_p1, _p2);
    _body->CreateFixture(&shape, 0);

ボディを作成したら、アクションを初期化します。

id a1 = [CCMoveBy actionWithDuration:1 position:ccp(0,-self.position.y+destinationPoint.y)];
        id action2 = [CCRepeatForever actionWithAction:
                      [CCSequence actions: [[a1 copy] autorelease], [a1 reverse], nil]
                      ];
        [self runAction:action2];

各フレームで、体の位置を更新します

 _body->SetTransform(b2Vec2(self.position.x/PTM_RATIO,self.position.y/PTM_RATIO), 0);

問題は、両方とも描画されていますが、スプライトは正しい位置にありますが、ボディはそうではありません。動きは一貫している

参考までに、ゲーム全体で PTM_RATIO を使用しているため、これは問題ではありません

4

1 に答える 1

1

スプライトの位置は、親の位置からオフセットされることに注意してください。親がCCNode、CCScene、またはCCLayerでない場合(またはそれらの位置が0,0でない場合)、スプライトは親の位置によってオフセットされます。

たとえば、寸法(contentSize)が100,100のスプライト(Sと呼びましょう)は、位置0,0にあります。ここで、子ノードをSに追加します。子ノードは、親の実際の位置ではなく、親の左下隅に配置されるため、子ノードの位置(変更されていない場合)は-50、-50になります。これにより、経験豊富なcocos2dプログラマーでさえも不意を突かれることがよくあります。

于 2012-05-11T15:40:14.333 に答える