每当我单击精灵时,屏幕状态都会恢复

本文关键字:状态 屏幕 恢复 单击 精灵 | 更新日期: 2023-09-27 18:35:58

我正在尝试在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);
    }

每当我单击新游戏按钮时,它都会显示难度级别。
问题是当我单击新手按钮时,它不会转到看起来像纯蓝屏的屏幕。它会通过它,并在几秒钟内返回难度级别菜单。你能帮帮我吗?我被困在这里大约一天了,我已经搜索了与此类似的问题,但仍然不起作用。

每当我单击精灵时,屏幕状态都会恢复

这是因为您在更新中两次使用相同的调用。

看看你的困难陈述:

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

您始终必须在鼠标侦听器的Released事件上选中按下的按钮。用这个更改你的代码:

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

这将确保仅检测到一次点击。


作为建议,不要使用这样的东西:

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

请改用 Rectangle 结构,该结构提供了称为 Rectangle.Contains() 的有用方法。

请参阅MSDN。