本帖最后由 TOPyangpeng 于 2012-10-30 21:43:27 编辑 摘要
以 XNA 为基础的游戏程序虽然可以很容易地显示图形和文字供用户检视,并附予各种特殊效果,丰富游戏的内容,以达到吸引游戏用户的最终目标。但是 XNA Framework 不像一般支持应用程序开发的 .NET Framework、.NET Compact Framework、或是 Silverlight Framework,对应用程序编程接口的开发提供完整的支持,XNA Framework 主要的支持在游戏功能的设计,在支持应用程序编程接口方面,例如窗口、对话框、菜单、工具栏、状态栏等和用户沟通的接口部分就需要多投入一点心力,才能建置具功能选单、场景切换、或是允许使用者设定游戏主角、游戏内容、和游戏难度的完整游戏。在这一篇文章中,我们将要介绍以 XNA 为基础的游戏程序的画面开关技巧,以及 XNA Framework 在与使用者沟通方面的支持。
游戏画面管理与开关
和一般的应用程序一样,以 XNA 为基础的游戏程序也需要功能选单供游戏用户选择喜好设定,包括游戏的背景图案、主角人物的图片、对战的对象、或是游戏的难度。每一种设定的设定画面都可能有更进一步的细部设定,造成游戏程序必须协助用户无障碍地在各种设定画面与游戏进行画面之间的切换,不会因为对游戏的使用者造成操作上的困扰。
游戏程序和一般的应用程序的定位不同,游戏程序通常不需要用户输入很多的数据,甚至允许用户不需要执行任何输入的动作就可以进入游戏程序设定的游戏场景,所以在支持画面设计与管理的功能方面较为薄弱,例如支持设计 Windows Phone 7 游戏程序开发的 XNA Framework 不像支持设计一般的 Windows Phone 7 应用程序的 Silverlight Framework 可以很容易地利用 XAML 文件与 PhoneApplicationPage 类别建立和供使用者操作的画面,和使用者进行沟通,或是读取用户设定或输入的数据,并利用 NavigationService 类别提供的 Navigate、GoForward、和 GoBack 等方法进行切换,开发以 XNA 为基础的游戏程序必须投入较多的心力在管理游戏程序的游戏画面、菜单画面、或是设定画面,以提供完整的游戏程序功能供用户使用。
认识 Game State Management 范例
要为以 XNA 为基础的游戏程序加上菜单选单,设定画面,或是场景切换功能,除了自行开发以外,也可以利用发表于 APP HUB 网站的 Game State Management 范例程序 (网址:http://create.msdn.com/en-US/education/catalog/sample/game_state_management),此范例程序提供三种游戏平台的范例,分别是 Windows Phone 7 平台的范例:GSMSample_4_0_PHONE.zip;Windows 平台和 XBOX 游戏机平台的范例:GSMSample_4_0_WIN_XBOX.zip,有兴趣的读者可以自行下载 Game State Management 范例程序提供的原始码,为上述三种平台的游戏程序加入游戏画面管理与切换的功能。如果读者有需要开发网络游戏程序,可以参考发表于 APP HUB 网站的 Network Game State Management 范例程序(网址:http://create.msdn.com/en-US/education/catalog/sample/network_game_state_management)。
[注意]
使用 Game State Management 范例程序提供的原始码必须遵守 Microsoft Permissive License 授权规范,详细的授权规定请参考 Microsoft Permissive License (Ms-PL) 文件的说明。
欲使用 Game State Management 范例程序提供的原始码,请先下载正确的范例版本,解压缩之后使用 Visual Studio 2010 Express 开启扩展名为 .sln 的方案档,您将可以在 [Solution Explorer] 窗口中看到名称为 GameStateManagementSample (Phone) 的游戏程序项目,以及名称为 Content 的 Content Pipeline 项目。
名称为 GameStateManagementSample (Phone) 的游戏程序项目中名称为 ScreenManager 的文件夹中有三个重要的原始程序档案,分别是负责管理游戏画面的 ScreenManager.cs,可以协助处理使用者输入的 InputState.cs,以及做为游戏程序画面基类的 GameScreen.cs。ScreenManager 文件夹底下的原始程序档案的用途可以参考表1的说明:
表1:ScreenManager 文件夹底下的原始程序档案的用途
[说明]
ScreenManager 类别继承自 XNA Framework 内建的 DrawableGameComponent 类别。XNA Framework 内建的 DrawableGameComponent 类别和 GameComponent 类别都是支持模块化游戏设计的基类,两者皆支持 Update 方法,以执行更新游戏状态的动作,DrawableGameComponent 另外支持 LoadContent、UnloadContent、以及 Draw 方法,做为加载游戏资源、释放资源、以及绘制游戏内容之用。以 XNA 为基础的游戏程序可以将游戏的人物和模块制作成继承自 DrawableGameComponent 类别或 GameComponent 类别的衍生类别,将更新游戏状态、加载/释放资源、与绘制游戏内容的工作封装在类别中,使游戏程序具备更优良的结构。
[提示]
每一个继承自 GameScreen 类别的衍生类别可以经由覆写 (override) LoadContent 方法加载画面需要用到的资源,覆写 UnloadContent 方法执行释放资源的动作,覆写 Update 方法以执行更新画面状态的动作,覆写 HandleInput 方法以处理使用者的输入操作,覆写 Draw 方法以显示画面的内容。除此之外,GameScreen 类别另外提供允许衍生类别覆写的 Serialize 方法和 Deserialize 方法,执行储存画面状态,或是读回之前储存的画面状态的动作。如果有需要控制画面转场的效果,可以设定 GameScreen 类别的 TransitionOnTime 属性和 TransitionOffTime 属性,将 TransitionOnTime 属性和 TransitionOffTime 属性设定成 0 代表画面切换不需要转场效果。如果画面要以突现的方式盖在目前的画面之上,可以将 GameScreen 类别的 IsPopup 属性设定成 true。