关闭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游戏可以通过调用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类的引用