65.9K
CodeProject 正在变化。 阅读更多。
Home

XNA 菜单

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.48/5 (7投票s)

2010年8月28日

CPOL

2分钟阅读

viewsIcon

39446

downloadIcon

1153

如何使用 XNA 轻松创建菜单。易于使用的类,用于显示菜单。

引言

这段代码允许您非常轻松地显示具有无限选项的菜单。

Using the Code

有两个类和一个 XML 文件是每个新菜单的关键。这两个类是 Menu.csMenuItem.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 个操作

  1. 加载菜单
  2. 添加一个 EventHandler
  3. 可选地设置您当前的菜单
  4. 从菜单获取输入
  5. 绘制菜单

要加载菜单,您必须获取 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:初始发布
© . All rights reserved.