0

シンプルなポンゲームを実装しようとしています。ボールのどちら側が打たれたかに応じて、ボールを X 方向または Y 方向に変更したい。

ボールは毎秒 3 ピクセルで移動し、幅は 22、高さは 22 です。パドルの幅と高さは 32 です。

ボールの衝突検出では、長方形を 1 つ作成し、中心点との衝突をチェックするだけでよいですか?

別の方法として、ボールがフレームごとに 3 ピクセルで移動することを前提として、適切な幅で側面を表すためにボールの周りに 4 つの長方形を作成することもできます。

もう 1 つのオプションは、ボールの移動方向に少なくとも 2 ピクセルの衝突をチェックするメソッドを作成することです。

ボールが右に移動し、x 位置が 16 の場合、次のフレームは 19 になります。x の 16、17、18 をチェックするメソッドを作成して、衝突があるかどうかを確認する必要があります。右側を打って、ボールが実際に立方体の中に入らないようにしますか?

@シグ

私は今、これを衝突検出として持っています

if(Rect.intersects(balls.get(j).ball, levelBlocks.blocks.get(i).rect))
            {
            //Bottom
            if(balls.get(j).yPos <= levelBlocks.blocks.get(i).yPos - (32/2))
            {
                balls.get(j).ySpeed = balls.get(j).ySpeed * -1;
            }

            //Top
            if(balls.get(j).yPos >= levelBlocks.blocks.get(i).yPos + (32/2))
            {   
                balls.get(j).ySpeed = balls.get(j).ySpeed * -1;
            }

            //Left
            if(balls.get(j).xPos < levelBlocks.blocks.get(i).xPos)
            {
                balls.get(j).xSpeed = balls.get(j).xSpeed * -1;
            }

            //Right
            if(balls.get(j).xPos > levelBlocks.blocks.get(i).xPos)
            {
                balls.get(j).xSpeed = balls.get(j).xSpeed * -1;
            }

これは機能しますが、100% ではなく、まだ少しずれているようです。ボールが2つのブロックに同時に当たった場合、反転が反転するため、方向が再び戻ります。

その後、これに変更しました

if(Rect.intersects(balls.get(j).ball, levelBlocks.blocks.get(i).rect))
            {
            //Bottom
            if(balls.get(j).yPos <= levelBlocks.blocks.get(i).yPos - (32/2))
            {
                collision = 2;
            }

            //Top
            if(balls.get(j).yPos >= levelBlocks.blocks.get(i).yPos + (32/2))
            {   
                collision = 2;
            }

            //Left
            if(balls.get(j).xPos <= levelBlocks.blocks.get(i).xPos + (32/2))
            {
                collision = 1;
            }

            //Right
            if(balls.get(j).xPos >= levelBlocks.blocks.get(i).xPos + (32/2))
            {
                collision = 1;
            }

            temp = levelBlocks.blocks.get(i);
            levelBlocks.blocks.remove(i);
            combo.blocksDestroied += 1;
            Assets.score += 10 * combo.comboMultiplier;
            }


        }

        if(collision == 1)
        {
            balls.get(j).xSpeed = balls.get(j).xSpeed * -1;
            collision = 0;
        }

        if(collision == 2)
        {
            balls.get(j).ySpeed = balls.get(j).ySpeed * -1;
            collision = 0;
        }

これは機能しますが、時々、ボールがブロックをランダムに通過し始めます。見るのは非常に奇妙で、なぜそれをしているのか本当に混乱していますが、フレームあたり3ピクセルが原因だと感じています

4

1 に答える 1

0

あなたが扱っている形はとてもシンプルなので、完璧にしないのはなぜですか? ヒット検出を実行するときは、パドルに長方形、ボールに円を使用します。フレームごとに衝突をチェックすることから始めます。作業している速度では、将来の衝突について「未来を調べる」必要はありません。

于 2013-06-10T02:07:26.827 に答える