单击矩形关闭 XNA 游戏 window

Close XNA game window on rectangle click

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

在主class中我初始化了一个class变量:

_exitGame exitGame;

我加载纹理和矩形:

exitGame = new _exitGame(Content.Load<Texture2D>("exitGame"), new Rectangle(50, 250,300,50));

我已经为 class 创建了更新代码:

exitGame.Update(gameTime);

然后我画了矩形:

exitGame.Draw(spriteBatch);

在我的 _exitGame class 我有这个:

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(); 在键盘按钮单击时关闭游戏,但由于我不能在这种情况下使用它,所以我有点困惑如何实现此功能。关于如何做到这一点的任何提示?

只是为您指明了正确的方向:

首先,exitGame 在我看来像是一个游戏组件。那你为什么不把它变成一个 gameComponent。由于您要执行绘图,因此它必须是一个 drawableGameComponent。您可以使用 Components.Add(new MyDrawableGameComponent);

向您的游戏添加组件

gameComponent 就像您的 Game1 class 一样持有 gmae。所以现在只需 class Game.Close() 即可关闭您的游戏。

祝你好运,搜索 gamecomponents 和 drawableGameComponents。

事件通常是实现此目的的好方法。现在,由于您已经找到了一种以自己的方式知道按钮何时被单击的方法,我们可以通过调用 Game 对象的 Close 函数来关闭游戏。因此,对于此解决方案,您基本上需要引用 Game 或任何您称之为游戏 class.

的内容

关闭XNA游戏可以通过调用Exit() method in your Game class来实现。

对于您的情况,您可以在 _exitGame 中引发一个事件 class

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);
    }
}

并在您的游戏中订阅该活动class

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

一些注意事项:

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