关闭XNA游戏窗口矩形点击

本文关键字:窗口 XNA 游戏 关闭 | 更新日期: 2023-09-27 17:52:54

我是XNA的新手,我正在尝试创建一个简单的游戏菜单,我使用矩形作为菜单项。我有一个叫做Game1.cs的主类和一个叫做_exitGame.cs的用于矩形的不同类,它应该在点击时关闭游戏。到目前为止,我得到了这个-

在主类中初始化一个类变量:

_exitGame exitGame;

加载纹理和矩形:

exitGame = new _exitGame(Content.Load<Texture2D>("exitGame"), new Rectangle(50, 250,300,50));
我已经为类创建了一个更新代码:
exitGame.Update(gameTime);

然后画矩形:

exitGame.Draw(spriteBatch);

在我的_exitGame类我有这个:

class _exitGame
    {
        Texture2D texture;
        Rectangle rectangle;
        public _exitGame(Texture2D newTexture, Rectangle newRectangle)
        {
            texture = newTexture;
            rectangle = newRectangle;
        }
        public void LoadContent()
        {
        }
        public void Update(GameTime gametime)
        {
            var mouseState = Mouse.GetState();
            var mousePosition = new Point(mouseState.X, mouseState.Y);
            var recWidth = rectangle.Width;
            var recHeight = rectangle.Height;
            if (rectangle.Contains(mousePosition))
            {
                rectangle.Width = 310;
                rectangle.Height = 60;
            }
            else
            {
                rectangle.Width = 300; 
                rectangle.Height = 50;
            }
        }
        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(texture, rectangle , Color.White);
        }
    }

现在我有一个矩形它在鼠标悬停时改变大小。早些时候,我使用代码this.Close();来关闭键盘按钮点击游戏,但由于我不能在这种情况下使用它,我有点困惑如何实现这个功能。有什么建议吗?

关闭XNA游戏窗口矩形点击

关闭XNA游戏可以通过调用game类中的Exit()方法来实现。

在您的例子中,您可以在_exitGame类中引发事件

class _exitGame
{
    public event EventHandler ExitRequested = delegate {};
    Texture2D texture;
    Rectangle rectangle;
    public _exitGame(Texture2D newTexture, Rectangle newRectangle)
    {
        texture = newTexture;
        rectangle = newRectangle;
    }
    public void LoadContent()
    {
    }
    public void Update(GameTime gametime)
    {
        var mouseState = Mouse.GetState();
        var mousePosition = new Point(mouseState.X, mouseState.Y);
        var recWidth = rectangle.Width;
        var recHeight = rectangle.Height;
        if (rectangle.Contains(mousePosition))
        {
            rectangle.Width = 310;
            rectangle.Height = 60;
            if (mouseState.LeftButton == ButtonState.Pressed)
            {
                ExitRequested(this, EventArgs.Empty);
            }
        }
        else
        {
            rectangle.Width = 300; 
            rectangle.Height = 50;
        }
    }
    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(texture, rectangle , Color.White);
    }
}

并在Game类中订阅该事件

exitGame = new _exitGame(Content.Load<Texture2D>("exitGame"), new Rectangle(50, 250,300,50));
exitGame.ExitRequested += (s, e) => Exit();

注意事项:

  • 为了在引发事件时不总是执行null检查,通常使用空委托public event EventHandler ExitRequested = delegate {};
  • 比较方便。
  • mouseState.LeftButton == ButtonState.Pressed表达式将返回true,只要鼠标左键按下,而不仅仅是在第一次点击。只要你用它来退出游戏就可以,但对于更新周期将继续运行的其他场景,你应该存储上一个更新周期的鼠标状态,并额外检查鼠标状态是否在上一个周期中没有被按下,并且在当前按下以捕获点击事件。

指引你正确的方向:

首先,exitGame对我来说就像是一个游戏组件。所以为什么不把它做成gameComponent呢?因为你想要执行绘图,所以它必须是一个drawableGameComponent。你可以使用Components.Add(new MyDrawableGameComponent);

为游戏添加一个组件

一个gameComponent包含游戏,就像你的Game1类。所以现在只需输入Game.Close()来关闭你的游戏。

祝你好运,做一些搜索gamecomponents和drawableGameComponents

事件通常是这样做的好方法。现在,既然你已经找到了一种方法来知道按钮何时被点击,我们可以通过调用Game对象的Close函数来关闭游戏。因此,对于这个解决方案,你基本上需要一个Game或任何你称为Game类的引用