XNA 菜单






4.48/5 (7投票s)
如何使用 XNA 轻松创建菜单。易于使用的类,用于显示菜单。
引言
这段代码允许您非常轻松地显示具有无限选项的菜单。
Using the Code
有两个类和一个 XML 文件是每个新菜单的关键。这两个类是 Menu.cs 和 MenuItem.cs。要使用这些类,您首先需要创建一个菜单 XML 文件。要创建菜单,您需要在游戏项目的 Content 部分创建一个名为 Menus 的文件夹。在该文件夹内,创建一个具有以下结构的 XML 文件
<?xml version="1.0" encoding="utf-8" ?>
<Menu>
<MenuName>Main Menu</MenuName>
<MenuItem>
<MenuItemText>Option 1</MenuItemText>
<MenuItemEvent>ShowMessageBox</MenuItemEvent>
<EventParams>Option 1</EventParams>
</MenuItem>
<PositionX>10</PositionX>
<PositionY>10</PositionY>
<SelectedItemNum>0</SelectedItemNum>
</Menu>
此结构需要 MenuName
作为您希望菜单被识别的名称,PositionX
和 PositionY
是菜单显示时的左上角 x
和 y
坐标。您可以拥有任意数量的 MenuItem
集合。在 MenuItem
内,必须包含 MenuItemText
,即显示给用户的文本,MenuItemEvent
,即用户选择该项目时要调用的方法名称,并且您可以选择性地拥有 EventParams
,用作需要它们的参数的额外参数。
要使用菜单,您需要执行上述操作以及对代码进行另外 5 个操作
- 加载菜单
- 添加一个
EventHandler
- 可选地设置您当前的菜单
- 从菜单获取输入
- 绘制菜单
要加载菜单,您必须获取 Menus 文件夹中的 XML 文件列表,然后使用所选文件名创建并加载新菜单。我的代码基于您可以拥有多个菜单,因此在 LoadContent()
中加载所有可用菜单,并具有选择其中一个菜单的方法。加载代码如下所示
//Get a list of the xml files
string[] Files = Directory.GetFiles(Content.RootDirectory + "\\Menus\\");
//Loop through each one
foreach (string FileName in Files)
{
//Create a new menu
Menu AMenu = new Menu();
//Tell it load the file
AMenu.Load(FileName);
//Add it to the list
Menus.Add(AMenu);
//If it is the Main Menu set it as the current menu
if (AMenu.MenuTitle == "Main Menu")
{
CurrentMenu = AMenu;
}
foreach (MenuItem AnItem in AMenu.MenuItems)
{
AnItem.OnConfirmedEvent += new EventHandler(AnItem_OnConfirmedEvent);
}
}
我的代码获取文件列表,循环遍历它们,创建新菜单并加载它们。它还会检查刚刚加载的菜单是否为主菜单,然后将其设置为正在显示的 CurrentMenu
。要使用菜单,您还必须将事件处理程序添加到所有菜单项的 OnConfirmedEvent
。在添加它们时,您可以区分设置事件调用的方法,但我选择将它们全部设置为相同的方法。此方法如下
private void AnItem_OnConfirmedEvent(object sender, EventArgs e)
{
MenuItem TheItem = (MenuItem)sender;
switch (TheItem.EventName)
{
case "ShowMessageBox":
System.Windows.Forms.MessageBox.Show(TheItem.EventParams[0]);
break;
case "Quit":
this.Exit();
break;
default:
break;
}
}
它获取调用 MenuItem
的内容,然后查看方法名称,如果它等于 ShowMessageBox
,则显示一个包含第一个事件参数的消息框。我的菜单还具有 GetInput()
和 Draw()
方法。GetInput()
在更新中使用,当您希望允许用户选择菜单选项时。
就是这样!实际上没什么,但自己做起来可能会出乎意料地困难。我花了一段时间才让它工作。
关注点
我很高兴地弄清楚了一个合理的 XML 文件标准,它涵盖了我想要做的一切,从而具有灵活性,这出乎意料地困难!
历史
- 2010 年 8 月 28日:初始发布