XNA 如果我有一个按钮类,并且我有一个buttonManager类来管理根据当前游戏状态(主菜单,游戏等)绘制到屏幕的按钮,我该如何组织我的代码以便我点击一个按钮,它将用户带到另一个屏幕。 (例如选项菜单,游戏)。 更具体地说,如果我要检查用户是否点击了buttonManager中的按钮,我将如何切换游戏并运行实际游戏(这是一个完全不同的类)?
答案 0 :(得分:2)
这样做的一种方法是使用委托。另一种方法是拥有一个所有类用于确定状态的全局类。
如果您不熟悉游戏状态的概念,我在我的网站上有一个教程,让您轻松学习基础知识(该教程中的最后一个示例也使用了代理!)
http://www.xnadevelopment.com/tutorials/thestateofthings/thestateofthings.shtml
答案 1 :(得分:0)
您的屏幕类(menuScreen,optionsScreen,gameplayScreen等)需要保留其显示的每个按钮的功能。例如:
//in optionsScreen class' update method:
if(input.gamepad.Buttons.A == ButtonState.Pressed && cursorSpriteRect.Intersects(button[0].Rect)
{
//begin transition into gameplay screen... or whatever
}
答案 2 :(得分:0)
您的游戏必须具有或能够获得对按钮管理器的引用。通常你的游戏会创建并拥有buttonManager。
class Game
{
ButtonManager m_buttonManager;
...
}
您的按钮管理器可以公开OnButtonClicked等事件。
class ButtonManager
{
private Button m_playGameButton;
// delegate to define the type of the event handler
public delegate void ButtonClickedEventHandler(ButtonId buttonId);
// event object matching the type of the event handler
public event ButtonClickedEventHandler OnButtonClicked;
void Update()
{
...
if (m_playGameButton.Clicked)
{
// Launch the event when appropriate if there are any subscribers
if (OnButtonClicked != null)
{
OnButtonClicked(ButtonId.PlayGame)
}
}
}
}
然后您的游戏类可以订阅该事件并提供处理程序方法。
class Game
{
...
void Initialise()
{
m_buttonManager += ButtonClicked;
}
void ButtonClicked(ButtonId buttonId)
{
switch (buttonId)
{
case ButtonId.PlayGame:
PlayGame();
break;
case ButtonId.OptionsMenu:
OptionsMenu();
break;
}
}
...
}
或者游戏类可以轮询按钮管理器。
class Game
{
...
void Update()
{
if (m_buttonManager.IsPlayGameButtonHit)
{
PlayGame();
}
else if (m_buttonManager.IsOptionsMenuButtonHit)
{
OptionsMenu();
}
}
...
}