首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Windows Mobile >

游戏画面管理与切换控制【转载】解决方案

2013-01-26 
游戏画面管理与切换控制【转载】[说明]ScreenManager 类别继承自 XNA Framework 内建的 DrawableGameCompone

游戏画面管理与切换控制【转载】




[说明]

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。



除了名称为 ScreenManager 的文件夹以外,名称为 GameStateManagementSample (Phone) 的游戏程序项目中还有一个名称为 Screens 的文件夹,位于此文件夹底下的是 Game State Management 范例程序提供的现成游戏程序画面,您可以直接使用 GameStateManagementSample (Phone) 的游戏程序项目提供的游戏画面,或是自行开发继承自 GameScreen.cs 定义的 GameScreen 类别的衍生类别,定义所开发的游戏程序需要的画面。

Screens 文件夹底下的原始程序档案的用途可以参考表2 的说明:

表2:Screens 文件夹底下的原始程序档案的用途
游戏画面管理与切换控制【转载】解决方案




[提示]

请注意 ScreenManager 文件夹和 Screens 文件夹中的某些类别需要使用到 Content Pipeline 项目中的游戏资源,也就是您必须在 Content Pipeline 项目中准备好必要的游戏资源,否则光有类别的原始码还是无法制作出游戏程序需要使用的游戏画面。

需要使用到资源的源代码档案包括负责管理游戏画面的 ScreenManager.c 会用到 Content Pipeline 项目中名称为 blank 的图片和 menufont 字型定义文件;负责显示讯息窗口和用户沟通的 MessageBoxScreen.cs 会用到 Content Pipeline 专案中名称为 gradient 的图片;负责扮演游戏主窗口的 GameplayScreen.cs 会用到 Content Pipeline 项目中名称为 gamefont 字型定义文件,而当做背景窗口的 BackgroundScreen.cs 则需要用到 Content Pipeline 项目中名称为 background 的图片。请注意如果游戏程序需要改变上述置于 Content Pipeline 项目的游戏资源的名称,必须一并修改使用到这些资源的源代码,否则所开发的游戏程序将无法执行。

 使用 Game State Management 范例提供的原始码管理游戏程序的画面

了解 Game State Management 范例提供的原始程序档案的功能和用途之后,我们就可以利用范例制作好的类别来开发具备菜单与画面切换功能的游戏程序了。

首先请启动 Visual Studio 2010 Express for Windows Phone,建立一个 [Windows Phone Game(4.0)] 型态的项目,然后将 Game State Management 范例的游戏程序项目中的 ScreenManager 文件夹和 Screens 文件夹中的所有档案加入到所建立的游戏程序项目中,将 Game State Management 范例的 Content Pipeline 项目中的 background.png、blank.png、gradient.png、gamefont.spritefont、和menufont.spritefont 加入到所建立的游戏程序项目附属的 Content Pipeline 项目中。

做好之后请编辑 Game1 类别,于原始程序档案的最前面引入以下的名称空间:

然后于 Game1 类别中宣告以下的变量,负责管理游戏程序需要使用的所有画面:

再把 Game1 类别的建构函式编辑成以下的样子,负责设定游戏窗口的宽度和高度,建立负责管理游戏画面的 ScreenManager 类别的对象:

请注意,游戏程序执行时需要用到的所有画面都必须交给 ScreenManager 管理。

[提示]

因为 ScreenManager 类别继承自 DrawableGameComponent 类别,当 DrawableGameComponent 类别的衍生类别的对象加入到 Game1 类别的 Components 集合之后,每次 Game1 类别的 LoadContent 方法、Update 方法、和 Draw 方法被呼叫的时候,DrawableGameComponent 类别的衍生类别的对象的 LoadContent 方法、Update 方法、和 Draw 方法也会被呼叫,让 DrawableGameComponent 类别的衍生类别的对象能够加载游戏资源,更新状态,并绘制对象的内容。

编辑妥 Game1 类别的建构函式之后,请覆写 OnExiting 方法,在游戏程序结束执行时将画面的状态储存下来,以便下一次执行游戏程序的时候还原到上一次结束执行时的画面。请为 Game1 类别加入以下的 OnExiting 方法:

最后我们必须编辑 Game1 类别的 Update 方法中,将判断使用者是否按下 Windows Phone 7 智能型手机左下方的 Back 硬件按键的程序代码批注掉,因为加入画面控制功能的游戏程序在用户按下智能型手机左下方的 Back 硬件按键时,如果有上一个游戏画面,则必须回到上一个游戏画面,而不是结束游戏程序的执行,编辑妥的 Update 方法如下:

做好之后请执行游戏程序项目,您将会看到游戏程序提供的主菜单,如图1 所示:

图1:游戏程序提供的主菜单
游戏画面管理与切换控制【转载】解决方案

按下画面中的 [Options] 功能,您就会看到游戏程序的设定画面,点选设定画面中的菜单,可以看到仿真设定值改变的效果,如图2 所示:

图2:游戏程序的设定画面
游戏画面管理与切换控制【转载】解决方案

按下 Windows Phone 7 智能型手机左下方的 Back 硬件按键回到图1的画面,再点选 [Play Game] 功能,您就会看到一个简单的游戏执行的情形,如图3 所示:

图3:简单的游戏执行的情形
游戏画面管理与切换控制【转载】解决方案

按下 Windows Phone 7 智能型手机左下方的 Back 硬件按键可以回到主菜单,再按一次可以结束游戏程序的执行。

[Game State Management 范例使用要诀]

因为 Game State Management 范例提供的原始程序档案中,当做所有游戏画面基类的 GameScreen 类别内容储存/读回游戏画面状态的功能,所以在游戏画面管理和切换的功能尚未制作完善之前,先将制作好的游戏程序部署至 Windows Phone 7 Emulator (仿真器) 执行,如果功能不正确,则将仿真器关闭,丢弃储存的游戏画面状态,待程序修改妥后,再将修改后的程序重新部署到仿真器执行。



您可以视需要修改 MainMenuScreen.cs 的程序代码,提供不同的菜单供用户操作,不要忘了请一并编辑 Content Pipeline 项目中的 menufont.spritefont 字型定义文件,定义菜单需要显示的文字。如果需要为所开发的游戏程序提供中文菜单,请参考 [图形特效与文字显示] 一文的说明,于 Content Pipeline 项目中的 menufont.spritefont 字型定义文件定义好欲显示的中文字和字型规格。

欲修改游戏程序的主菜单,请编辑 MainMenuScreen.cs 源文件的 MainMenuScreen 类别的建构函式中建立 MenuEntry 类别的对象的语法,如下:

当然,修改建立 MenuEntry 类别的对象的语法必须一并修改 MenuEntry 类别的 Selected 事件的事件处理程序,如下:

请注意 [Options] 菜单的 Selected 事件的事件处理程序会直接显示 OptionsMenuScreen 类别定义的内容,而 [Play Game] 菜单的 Selected 事件的事件处理程序则会先显示 LoadingScreen 类别定义的内容,让使用者先看到 [Loading…] 的文字,然后才看到 GameplayScreen 类别定义的内容。

以 GameplayScreen 类别为例,其建构函式就有设定 TransitionOnTime 属性和 TransitionOffTime 属性,表示切换到 GameplayScreen 画面和切换离开 GameplayScreen 画面都要显示转场效果。GameplayScreen 类别的建构函式如下:

最后我们只要将游戏的功能制作在扮演游戏主画面的 GameplayScreen.cs 档案中,或置换掉 GameplayScreen.cs 档案的内容,就可以完成提供主菜单和游戏设定画面的游戏程序了。

 利用 Guide 类别与游戏使用者沟通

以 XNA 为基础的游戏程序除了可以利用主菜单和设定画面与用户沟通之外,也可以利用 Guide 类别提供的功能和用户沟通,包括显示讯息画面供用户检视和显示输入画面协助用户输入资料等常用的用户接口。

欲利用 Guide 类别提供协助用户输入数据的操作画面并显示讯息画面,请先于原始程序档案的最前面引入以下的名称空间:

然后于类别中宣告以下的变量

需要显示协助用户输入数据的操作画面的时候,只要透过下列的程序代码,就可以利用 Guide 类别的 BeginShowKeyboardInput 方法显示供用户输入数据的画面:

当使用者完成输入并按下输入画面中的 [OK] 键时,就会执行到名称为 GetTypedChars 的方法,由 GetTypedChars 方法呼叫 Guide 类别的 EndShowKeyboardInput 方法取得使用者输入的内容,做法如下:

 

做好之后请执行游戏程序,执行显示协助用户输入数据的功能,您就会看到如图4 所示的画面:

图4:协助用户输入数据的画面
游戏画面管理与切换控制【转载】解决方案

如果游戏程序需要显示讯息和用户沟通,要求使用者做决策,就可以利用 Guide 类别的 BeginShowMessageBox 方法显示讯息画面供用户做决策。例如以下就是 Guide 类别的 BeginShowMessageBox 方法的使用技巧:

当用户按下讯息画面中的按键时会呼叫到名称为 GetMBResult 的方法,由 GetMBResult 方法判断用户的按键选择。以下的 GetMBResult 方法会呼叫 Guide 类别的 EndShowMessageBox 方法取得用户的按键状态:

请注意呼叫 Guide 类别的 EndShowMessageBox 方法取得的结果是一个整数,其内容值为 0 代表用户按下第一个按键,其内容值为 1 代表用户按下第二个按键,其内容值为 2 代表用户按下第三个按键,以此类推。

做好之后请启动游戏程序,执行显示讯息和用户沟通的功能,您就会看到图5 的画面:

图5:利用 Guide 类别显示讯息和用户沟通的画面

游戏画面管理与切换控制【转载】解决方案

原文链接:http://msdn.microsoft.com/zh-cn/windowsphone/gg570356.aspx
[解决办法]
建议 LZ 提高一下结帖率,这样大家才对你的帐子有回复的兴趣
[解决办法]
不错不错,
虽然我没看懂
帮顶。

热点排行