-1

ブレイクアウト ゲームのチュートリアルに従って、独自のボディを持つ 3 つのスプライト (ボールと 2 つのパドル) を作成しました。私の質問は非常に単純かもしれません。申し訳ありませんが、私はまだ学んでいます。とにかく、私の問題は例とは異なり、スプライトはスケーリングされます。

-(id)init {
    p1 = [CCSprite spriteWithFile:@"1.png"];
    p1.position = ccp(160, winSize.height * 0.08);
    p1.scaleX = 190 / 2 / p1.contentSize.width;
    p1.scaleY = 58 / 2 / p1.contentSize.height;

    b2BodyDef p1BodyDef;
    p1BodyDef.type = b2_dynamicBody;
    p1BodyDef.position.Set(160/PTM_RATIO, 40/PTM_RATIO);
    p1BodyDef.userData = p1;
    _p1Body = _world->CreateBody(&p1BodyDef);

    b2PolygonShape p1Shape;
    p1Shape.SetAsBox(p1.contentSize.width/PTM_RATIO/2, p1.contentSize.height/PTM_RATIO/2);

    b2FixtureDef p1ShapeDef;
    p1ShapeDef.shape = &p1Shape;
    p1ShapeDef.density = 0.3f;
    p1ShapeDef.friction = 1.0f;
    p1ShapeDef.restitution = 0.0f;
    _p1Fixture = _p1Body->CreateFixture(&p1ShapeDef);
}

ボディを作成した後、コンタクト リスナーを使用してパドルとボールの衝突を検出する update メソッドを作成しました。これは問題なく動作しますが、ゲームをテストしているときに、パドルの上部と側面の両方で約 2 ~ 3 cm ずれているように、実際のスプライトの位置と衝突していなくても、ボールがバウンドする場合があることに気付きました。これは、ポリゴンの形状とスプライトのスケール x とスケール y が異なるためだと思われます。私の質問は、ボディのサイズをスケーリングされたスプライトと同じにするにはどうすればよいですか? 私は次のようなものを試しました:

p1Shape.SetAsBox(190 / 2 / p1.contentSize.width/PTM_RATIO/2, 58 / 2 / p1.contentSize.height/PTM_RATIO/2);

しかし、あたかも物体がまったく存在しないかのように、衝突は無視されました。では、スケーリングされている場合、パドルの b2body をパドル スプライトと同じサイズにするにはどうすればよいでしょうか?

4

1 に答える 1

-1

100%確かではありませんが、さらに調査した結果、わかったと思います。体の形を設定する方法は次のとおりです。

p1Shape.SetAsBox(p1.contentSize.width/PTM_RATIO/2 * p1.scaleX, p1.contentSize.height/PTM_RATIO/2 * p1.scaleY);

デバッグ描画が有効になっていないため、これが正しい解決策であるとは断言できません。また、それを機能させる方法をまだ理解できていませんが、ゲームでいくつかのテストを実行しようとした後の衝突から判断すると、 、これは私の問題を解決したようです。これを行うより正しい方法があると思う人が他にいる場合は、お知らせください。ありがとう

于 2013-03-07T09:03:41.823 に答える