输入和用户界面
概览
本章将深入理解已经使用了很多次的Input类,接着讨论学习如何在XNA Shooter中实现一个良好的图形用户界面(GUI)。借助Input命名空间,在XNA中处理用户输入是非常简单的,通过以下三行代码您可以轻松地获得鼠标,键盘和游戏手柄的当前状态:
mouseState = Mouse.GetState(); keyboardState = Keyboard.GetState(); gamePadState = GamePad.GetState(PlayerIndex.One);
如果现在您还没有加入Input命名空间,只需将鼠标移至Mouse,Keyboard,或GamePad文字上并按下Ctrl ,就会自动将下面一行添加到using directives中:
using Microsoft.Xna.Framework.Input;
现在您可以使用这些states检查手柄是否被连接,空格键是否被按下,或鼠标的当前位置在哪等。这正是你在第一和第二章写第一个XNA游戏时所写的代码。
但随着游戏变得更加复杂,你会频繁地重复相同的代码。与引擎中的类做法类似,你通常不添加更多的功能,而是使现有功能更易使用。例如,Texture类用来储存的XNA纹理,纹理大小,是否Alpha,还包含了许多有用的方法,使纹理在SpriteHelper类的帮助下直接显示在屏幕上。
所有这一切都能在标准的XNA框架中实现,但你不得不写更多的代码。如果您只想把一个单一的纹理显示在屏幕上,那么写这么多辅助类是毫无意义的,但如果你要编写许多项目和使用数以百计的纹理,您将会感谢之前自己写的所有辅助类。只有简化了纹理,shader,以及材质才可能通过几行代码就实现复杂的图形代码,你可以在单元测试的图形类中看到这些代码。
同样的逻辑也适用于Input类。好处并不明显,但以后当你编写新的UI (用户界面)代码实现自定义按钮或菜单控制时,你会发现通过许多辅助类(包括Iuput类)做起来更容易。
你已经知道如何使用此Input类,因为你已经使用过很多次了。为了你下一个游戏XNA Shoot,你还将编写UI类和为更高级游戏显示的菜单逻辑。思路是重用现有Rocket Commander游戏的game screen类。有些类需要移除,您可能需要一写新的类,但总体程序逻辑是非常相同的。
游戏在Misson类显示用户界面(弹药,生命值,得分等等)。对于更复杂的游戏,如下一部分的赛车游戏,游戏逻辑和用户界面会分离成更多的类。你应该总是取保游戏代码尽可能简单,但不要太简单。如果你想要做的只是把“Hello World” 显示在屏幕上,编写30个辅助类是毫无意义的。
用户界面,特别是菜单界面是一个很大的议题。曾经有一段时间几乎每个游戏都有非常复杂的菜单动画甚至3D图形,但它很难使用。不仅对你,而且对用户而言,应尽量使事情保持简单。你将在本篇末学习一个很好的菜单设计。