0

私はちょうど XNA を学んでいて、簡単な Break The Blocks ゲームの作成から始めました。画面上部のブロックを表すために 2 次元配列を使用しています

    bricks = new Bricks[18,16];
        for (int y = 0; y < 16; y++)
        {               
            for(int x = 0; x < 18; x++)
            {
                bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Red);
                if (y == 2 || y == 3)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Blue);
                }
                if (y == 4 || y == 5)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Green);
                }
                if (y == 6 || y == 7)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.White);
                }
                if (y == 8 || y == 9)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Pink);
                }
                if (y == 10 || y == 11)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Purple);
                }
                if (y == 12 || y == 13)
                {
                    bricks[x, y] = new Bricks(BrickTexture, new Rectangle(x * BrickTexture.Width, y * BrickTexture.Height, 38, 18), Color.Navy);
                }
            }
        }      

これがブロックの構築方法であり、foreach ループで画面に描画されます。

    foreach (Bricks brick in bricks)
            {
                brick.Draw(spriteBatch);

            }

私の Update メソッドでは、ループごとに別のループを使用して、ボールがそれらのいずれかと衝突したかどうか、および画面からレンガを削除する必要があるかどうかを確認します。for そのため、衝突方法は次のとおりです。

    foreach (Bricks brick in bricks)
            {
                brick.CheckBrickBallCollision(ball);

            } 

    public void CheckBrickBallCollision(Ball ball)
    {
        if (isVisible && ball.Ball2.Intersects(position))
        {
            isVisible = false;
            ball.direction.X *= 0.85f;
            ball.direction.Y *= -1;
        }
    }

私の問題は、すべてのレンガがなくなるとゲームに勝ち、ゲームの状態を変更することで勝った画面が表示されるようにする方法です。

どんなアイデアも本当に役に立ちます

4

2 に答える 2

1

コードを実際に変更せずにこれを行うには、表示されているレンガの数を数えるだけです。

int visibleCount = 0;

foreach (Bricks brick in bricks)
{
    brick.CheckBrickBallCollision(ball);

    if (brick.isVisible)
    {
        visibleCount++;
    }
} 

//If there are no visible bricks then the player won!
if (visibleCount == 0)
{
    //Win the Game!
}

別の方法として、アクティブなブリックのリストを管理するのではなく、それらの可視性を管理することができます。ブリックがヒットすると、リストから削除できます。リストが空の場合、プレーヤーが勝ったことがわかります。

于 2013-04-11T22:36:34.930 に答える
0

何らかの理由で上記の答えを見ると、これが最終的に機能し、共有すると思いました

    foreach (Bricks brick in bricks)
            {
                brick.CheckBrickBallCollision(ball);
                if (brick.isVisible == true)
                {
                    brokenBlocks -= 1;
                }                                     
            }
            if (brokenBlocks == 40)
            {
                currentGameState = GameState.Won;
            }
于 2013-04-11T23:02:14.637 に答える