0

ここから Ray Wenderlich のコードを使用しています: http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone

これは、b2Body/Def/Fixture を CCSprite に追加するために使用しているコードです。

- (void)addBoxBodyForSprite:(CCSprite *)sprite {
    b2BodyDef spriteBodyDef;
    spriteBodyDef.type = b2_dynamicBody;
    spriteBodyDef.position.Set(sprite.position.x/CTM_RATIO, sprite.position.y/CTM_RATIO);
    spriteBodyDef.userData = sprite;
    b2Body *spriteBody = world->CreateBody(&spriteBodyDef);
    b2PolygonShape spriteShape;
    spriteShape.SetAsBox(sprite.contentSize.width/CTM_RATIO/2, sprite.contentSize.height/CTM_RATIO/2);
    b2FixtureDef spriteShapeDef;
    spriteShapeDef.shape = &spriteShape;
    spriteBody->CreateFixture(&spriteShapeDef);
}

PTM_Ratio の代わりに CTM_Ratio を選びました。とにかく、b2Bodies が CCSprites に適切に配置されていません。

したがって、私の問題を説明するために、スプライトは幅 50 ピクセル、高さ 100 ピクセルであると言います。そのスプライトの b2Body は、幅 60 ピクセル、高さ 110 ピクセルのようです。

Box2D がメートルを使用していることは知っていますが、ピクセルを使用して b2Body を私の CCSprite に完全にする方法はありますか?

ありがとう!

4

1 に答える 1

1

CTM_RATIOとは何ですか?今のところ、これは単にPTM_RATIOの異なる値であると想定しています。この場合、PTM_RATIOの値を変更するだけで済みます。

PTM_RATIOが存在する唯一の理由は、Box2Dがメーターを使用しているためではありません。これは、Box2Dが0.1から100.0の範囲の値で最適に機能するためです。したがって、すべての位置の値をその範囲内に縮小して元に戻す比率であれば問題ありません。Box2Dの位置をピクセル位置として、またはiOSデバイスの場合はより正確にポイント位置として扱うことができます。ただし、これにより、Box2Dのパフォーマンスとシミュレーションの問題が発生する可能性があります。たとえば、オブジェクトを貫通する場合などです。したがって、PTM_RATIOを使用しないことはお勧めしません。

私の推測では、PTM_RATIOの1つのオカレンスをCTM_RATIOに変更することを単に見落としていたため、ミスアライメントが発生しました。他の唯一の選択肢は、Box2Dオブジェクトの位置またはサイズ、またはボディの視覚的外観を表すスプライトのそれぞれのスケーリングを計算する際に、単に間違いを犯したことです。

于 2011-11-23T12:28:26.540 に答える