0

Xna 4.0 でゲームを作成しようとしていますが、ゲーム メニューに行き詰まっています。

    protected override void Update(GameTime gameTime)
    {
        MouseState ms = Mouse.GetState();

        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        if (ms.LeftButton == ButtonState.Pressed && ((ms.X >= 280 && ms.X <= 540) && (ms.Y >= 150 && ms.Y <= 200)))
            current_screen = ScreenState.Difficulty;

        if (current_screen == ScreenState.Title)
        {
            if (ms.LeftButton == ButtonState.Pressed && ((ms.X >= 280 && ms.X <= 540) && (ms.Y >= 360 && ms.Y <= 410)))
                this.Exit();
        }

        if (current_screen == ScreenState.Difficulty)
        {
            if (ms.LeftButton == ButtonState.Pressed && ((ms.X >= 300 && ms.X <= 520) && (ms.Y >= 100 && ms.Y <= 130)))
                current_screen = ScreenState.Title;
            if ((ms.LeftButton == ButtonState.Pressed && oldMouseState.LeftButton == ButtonState.Released) && ((ms.X >= 280 && ms.X <= 540) && (ms.Y >= 150 && ms.Y <= 200)))
            {
                current_screen = ScreenState.MainGameNovice;
            }
        }

        base.Update(gameTime);
        oldMouseState = ms;
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);
        switch (current_screen)
        {
            case ScreenState.Title:
                spriteBatch.Draw(mybg, GraphicsDevice.Viewport.Bounds, Color.White);
                spriteBatch.Draw(new_game_button, new Vector2(280, 150), Color.White);
                spriteBatch.Draw(load_game_button, new Vector2(280, 220), Color.White);
                spriteBatch.Draw(how_to_play_button, new Vector2(280, 290), Color.White);
                spriteBatch.Draw(quit_game_button, new Vector2(280, 360), Color.White);
                break;

            case ScreenState.Difficulty:
                spriteBatch.Draw(diff_bg, GraphicsDevice.Viewport.Bounds, Color.White);
                spriteBatch.Draw(novice_button, new Vector2(280, 150), Color.White);
                spriteBatch.Draw(inter_button, new Vector2(280, 220), Color.White);
                spriteBatch.Draw(expert_button, new Vector2(280, 290), Color.White);
                break;

            case ScreenState.LoadGame:
                break;

            case ScreenState.HowtoPlay:
                break;

            case ScreenState.MainGameNovice:
                //main game
                spriteBatch.Draw(expert_button, new Vector2(580, 290), Color.White);
                break;

            case ScreenState.MainGameIntermediate:
                ///main game
                break;

            case ScreenState.MainGameExpert:
                ////Main game
                break;
        }

        spriteBatch.End();

        base.Draw(gameTime);
    }

新しいゲームのボタンをクリックするたびに、難易度が表示されます。
問題は、初心者ボタンをクリックすると、プレーンな青い画面のように見える画面に移動しないことです。それを通過すると、ほんの数秒で難易度メニューに戻ります。手伝ってくれませんか?私はここで約 1 日立ち往生しています。これに似た問題を検索しましたが、まだ機能しません。

4

2 に答える 2

1

Releasedマウスリスナーのイベントで押されたボタンを常にチェックする必要があります。これでコードを変更します:

if (ms.LeftButton == ButtonState.Released && oldMouseState.LeftButton == ButtonState.Pressed)

これにより、クリックが 1 回だけ検出されるようになります。


また、提案として、次のようなものは使用しないでください。

(ms.X >= 280 && ms.X <= 540) && (ms.Y >= 360 && ms.Y <= 410)

Rectangle代わりに、 と呼ばれる便利なメソッドを提供する構造体を使用してくださいRectangle.Contains()

MSDNを参照してください。

于 2013-10-17T19:57:24.180 に答える
1

これは、更新で同じ呼び出しが 2 回行われているためです。

あなたの難易度ステートメントを見てください:

if (ms.LeftButton == ButtonState.Pressed && ((ms.X >= 280 && ms.X <= 540) && (ms.Y >= 150 && ms.Y <= 200)))
    current_screen = ScreenState.Difficulty;

そして、あなたの初心者ゲームステートメントで:

if ((ms.LeftButton == ButtonState.Pressed && oldMouseState.LeftButton == ButtonState.Released) && ((ms.X >= 280 && ms.X <= 540) && (ms.Y >= 150 && ms.Y <= 200)))
    {
        current_screen = ScreenState.MainGameNovice;

    }

current_screen を MainGameNovice に設定するボタンをクリックすると、最後の更新以降にマウス ボタンが離されたかどうかを確認しないため、すぐに実行を妨げるものがないため、難易度ボタンがクリックされたとすぐに見なされます。あなたの問題があります。難易度ボタンに次の項目も含まれていることを確認してください。

oldMouseState.LeftButton == ButtonState.Released
于 2013-10-17T15:00:54.437 に答える