在过去的几年中,主流UI工具包已经取得了一些非常有趣的突破。游戏用户界面也在不断发展,但步伐有所放缓。这可能是因为开发功能齐全的UI子系统本身就是一项重大任务,并且很难证明资源投资的合理性。
我个人最喜欢的UI系统是Windows Presentation Foundation(WPF)。确实,UI差异化的潜力将进一步提升。以下是一些更有趣的功能:
默认情况下,控件是“无外观的”。控件的逻辑和外观通常是分离的。每个控件附带默认样式和模板,以描述其默认视觉外观。例如,按钮可以表示为带有外部笔划,纯色或渐变背景以及内容提示器(以显示标题)的圆角矩形。开发人员(或设计人员)可以创建自定义样式模板,这些模板可以更改控件的外观和(在一定程度上)行为。样式可用于覆盖控件的简单属性,例如前景色/背景色,模板等。模板会更改实际的视觉结构。
样式和模板可能包含“触发器”。触发器可以侦听某些事件或属性值(或值的组合),并有条件地更改样式或模板的各个方面。例如,当鼠标悬停在按钮上时,按钮模板通常会在“ IsMouseOver”属性上具有触发器,以更改背景颜色。
UI元素有几种不同的“级别”,从功能最少的轻量级元素到功能齐全的重量级控件。这使您在构造UI方面具有一定的灵活性。最简单的UI元素类,UIElement
没有样式或模板,仅支持最简单的输入事件。对于状态指示器之类的简单元素,此功能可能就是您所需要的。如果您需要更广泛的输入支持,则可以从FrameworkElement
(扩展到UIElement
)获得。传统的小部件通常从衍生而来Control
,它扩展FrameworkElement
并添加了自定义样式和模板支持(以及其他功能)。
WPF使用保留的,可伸缩的,与分辨率无关的矢量图形模型。在Windows上,使用Direct3D渲染和组合WPF应用程序。
WPF的引入包括称为Xaml的新的声明式编程语言。基于Xml的Xaml是用于声明UI“场景”的首选语言。它实际上很漂亮,尽管乍看起来看起来很相似,但与XUL等现有语言(功能更强大)有根本的不同。
WPF具有非常高级的文本子系统。它支持大多数(如果不是全部)OpenType字体功能,双向ClearType抗锯齿,子像素定位等。
“好,太好了,这与游戏开发有什么关系?”
当WPF仍在开发中时(当时称为“ Avalon”),我在佐治亚理工学院上了视频游戏设计课程。我的最后一个项目是回合制策略游戏,我想要一个功能强大的UI。WPF / Avalon似乎是一条不错的选择,因为它具有一整套功能齐全的控件,并且使我能够完全改变这些控件的外观和感觉。结果是一款具有漂亮而清晰的用户界面的游戏,其功能级别通常只在功能完善的应用程序中才能看到。
现在,在游戏中使用WPF的问题在于它的重量很大,并且在其自己的“沙盒”中进行渲染。通过这种方式,我的意思是在Direct3D或OpenGL游戏环境中没有支持WPF的托管方式。可以在WPF应用程序中托管Direct3D内容,但是您将受到WPF应用程序帧率的限制,该帧率通常低于您想要的帧率。对于某些类型的游戏,例如2D策略游戏(我当前的WPF游戏项目的屏幕截图),它仍然可以正常工作。对于其他事情,没有那么多。但是您仍然可以在开发自己的UI框架时应用WPF的一些更引人注目的架构概念。
还有一个WPF的开源,不受管理的C ++ / Direct3D实现,称为“ WPF / G(游戏的WPF)”](http://wpfg.codeplex.com/),它专门设计用于在Win32和Win32上的游戏中使用和Windows Mobile。主动开发似乎已经停止,但是上一次我检出它时,它是一个相当完整的实现。与Microsoft的WPF实施相比,文本子系统是真正缺少的一个领域,但是对于游戏来说,这并不是一个大问题。我可以想象将WPF / G与基于Direct3D的游戏引擎集成起来将相对简单。走这条路线可以为您提供功能强大,与分辨率无关的UI框架,并广泛支持UI定制。
只是为了让您了解基于WPF的游戏UI的外观,这是我的宠物项目的屏幕截图: