0

ここ数日、私は卓球のようなゲームを作ろうとしてきました。私は2つのパドルとボールを持っています。すべての動的スプライト。私が抱えている1つの問題を除いて、すべてがうまくいっています。ボールはある時点で同じ角度で跳ね返る傾向があります。そのため、プレーヤーが特定の部分でパドルを動かすだけで、ゲームがしばらく続くか、永遠に続く場合があります。これは、パドルのどの部分に当たってもボールの角速度が変わらないためです。 . 直線速度と角速度の組み合わせを使用して、ボールを次のように動かし続けています。

if(_isPaused == FALSE)
{
    _world->Step(dt, 10, 10);
    for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
        if (b->GetUserData() != NULL) {
            CCSprite *sprite = (CCSprite *)b->GetUserData();
            if(sprite.tag == 2)
            {
                b2Vec2 dir = b->GetLinearVelocity();
                dir.Normalize();
                float currentSpeed = dir.Length();
                int maxSpeed = 60;
                float accelerate = vel;

                if(currentSpeed <= maxSpeed)
                {
                    b->SetLinearVelocity(accelerate * dir);
                }

                sprite.position = ccp(b->GetPosition().x * PTM_RATIO,
                                      b->GetPosition().y * PTM_RATIO);
                sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());

                //Keep sprite from bouncing in a straight angle
                b->SetAngularVelocity(_body->GetAngle());
            }}}

私の質問は、角速度を操作して、パドルと衝突するたびにボールがさまざまな角度でバウンドし続けるようにするにはどうすればよいかということです。現在の角速度を取得し、それに何らかの値を掛けるようなことを考えていますが、それが私が抱えている問題にアプローチする正しい方法であるかどうかはわかりません。任意の提案やアイデアをいただければ幸いです。ありがとうございます。

4

2 に答える 2

1

私の見方では、次の 2 つのオプションがあります。

  1. 衝突の場所を確認します。パドルの上端/下端に近い場合は、その時点での表面の「曲率」に比例する角度で、出力速度を偏向させます。もちろん、これは不正行為ですが、アートワークとコードが一致していれば、正しいように見えます。そしてグラフィックは「引っ掛からずごまかす技」。
  2. パドルの現在の速度とボールの速度を考慮することができます。例: ボールが右下に移動し、パドルが下に移動している場合、線形運動量の保存を使用して外向きの方向を計算できます。水平軸に沿ったパドルの運動量の変化がゼロになるように制限してください。

最後に、上記の手法を組み合わせることができますが、正確な衝突検出を使用する必要があります (上記の (1) で説明したハックではありません)。

それが役立つことを願っています!

于 2013-03-08T06:51:40.297 に答える