现在的位置: 首页 > 综合 > 正文

DirectX 9 UI设计学习笔记之一:开场白+第一章User Interfaces

2018年04月09日 ⁄ 综合 ⁄ 共 5350字 ⁄ 字号 评论关闭

       大家好!我叫哈大锤,万万没想到我竟然开始学习UI 编程了!学完之后,我就能够设计出一款不错的游戏引擎,然后找到工作,妈妈再也不用担心我的学习了!用不了多久,我就能升职加薪,打败纳德拉,追上比尔·盖茨,赢取小度娘,走上人生巅峰!嘿嘿,想想还真有点小激动呢!

       此文由哈利_蜘蛛侠原创,转载请注明出处!有问题欢迎联系本人!

       邮箱:2024958085@qq.com

 

开场白

======================================================================

       可能有人要问了:你丫还有三个坑没填呢,怎么又开新坑啦?在此先对大家说声抱歉,之前的几个坑短期内不会很快更新了(不过如果回复数比较多的话,我可能会改变主意的,嘿嘿!)。这里我要开始一个新的系列,讲的是使用DX 9 进行游戏的UI 设计与实现的。

       大家一定会问为何要学习这个?这个说来话长。

       比较关注本人的同学应该知道,我有一个终极目标,就是用DX 9 开发出一款值得一玩的RPG!不过这个目标毕竟太难以实现了。我先是参考了Jim Adams 的《Programming Role Playing Games with DirectX 9: 2nd edition》这本书,但是这本书毕竟很老了,而且讲得不太科学(比如说单单是第2章就涵盖了“龙书”第二版花了10章才讲完的内容……),内容不是很好懂,所以我就暂时将它扔在一边了。可能以后适当的时候会参考的——虽然里面的游戏貌似很粗糙,但是涵盖的范围还是挺广的。

       然后我基本上就一直在继续学习“龙书”第二版了。不过到了网格那里的时候,遇到了两个问题,一个是跟纹理间的赋值有关的,另外一个是跟网格的Clear 有关的。第一个问题花了我几个星期才搞定,其实是COM 组件的特殊性所导致的;而另一个问题至今没有解决。所以我就对“龙书”第二版有了些许失望,然后我就一拍脑门买了“龙书”的第四版,然后学起了DX 11 编程。

       这两个多星期的学习还是挺顺利的。毕竟有了“龙书”第二版的基础,虽然DX 11 相对于DX 9.0c 变化了许多,但是吸收起来是不难的。

       不过到了纹理映射那一章,我发现一个不太复杂的、有山有水的、有光线有动态顶点缓存有纹理贴图的场景的帧数只有80多帧了。我学习DX 9.0c 的时候没有载入过这么大的场景,也不确定如果换成DX 9.0c 的话会不会这样慢;但是我对于DX 11 有点不放心了起来。虽然我的电脑比较新,完全支持DX 11,但是毕竟被我玩坏过几次,还是个笔记本,所以我有点不太敢继续往下学了。毕竟,开发游戏的过程中,也许对硬件的要求比到时候实际运行游戏的时候还要高!

       所以我又有点想回归DX 9了。另外一个方面是,学了这么久还没有做出来过一个特别好玩的东西,未免有点不耐烦。于是前几天我有了一个大胆的想法,就是开发出一个游戏引擎!

       当然,绝对不是虚幻3 那样的引擎了。实际上做一个游戏的同时基本上也就是做一个引擎了,只要你的程序具有某种通用性。我现在最想知道的就是在进行游戏编程的时候,如果对角色和物体的位置进行调节?比如说有一栋三层建筑,如何把一个敌人准确地放置到2楼上?又如果正在做一个迷宫的关卡的话,如何让敌人在某些角落里出现?

       用纯粹的数字坐标去指定的话显然不靠谱,因为要修改起来太麻烦了;最好就是有一个可视化的界面,能够让你用一种面对面的方式对载入的模型进行仿射变换(平移、旋转和放缩),就像Blender 等建模软件的界面那样;或者,像孢子冒险编辑器那样的给力的东东。

       我如果能够做出来这样的一个东西就好了!我先是看了会《Game Engine Architecture》这本书。好吧,我承认我被这本书的第一章给打败了——尼玛太复杂了啊!看来我能够实现上面的那个小小的愿望就十分了得了!

       不过一口气吃个胖子肯定是不行的。我得先了解一些游戏引擎才行啊!其实前面提到的孢子冒险编辑器也是一个游戏引擎了,不过它的限制条件太多。我根据书上的介绍,找到了两个候选的:ORGE 和XNA。我先是打算学习ORGE 的。可是为何连个贴吧都没有?而且下载源文件的时候也不知所措。于是我打算学习XNA 了。这东西有教材,而且据说很简单,嘿嘿!

       不过这东西是用C# 来开发游戏的。我只知道C++(很久以前还接触过C,但是忘得差不多了),看来得重新学一门语言了。不过C# 据说特别简单。好吧,那我就放心了!

       我学了这三天,发现确实还不错。一开始给的那个Windows Form 程序让我很惊讶,因为这让我想到了很久以前接触到的MFC。其实我也可以为这个专门开辟一个系列的,不过那样的话我的压力太大了,所以就从略了;况且C# 应该也只是我的编程生涯中的一个小插曲而已。另外我发现C# 中竟然没有指针,这让我很诧异,不知道没有指针的它是如何完成各种神奇的操作的。

 

       好了,觉得很累?没关系,前面的都是废话,你可以不看。现在开始说正题!

 

       前面提到,那个Windows Form 的程序让我联想到了MFC,而MFC 与各种控件有关。这时我突然想到了今年9月初我看过几天的一本书,叫做:《DirectX 9 User Interfaces: Design and Implementation》,是Alan Thorn写的。(你猜得没错,就是我们要研究的这本书!)这本书讲的是用DX 9 制作各种UI 界面的,而在游戏编程中,各种UI 界面也是必不可少的。于是我又把这本老书重拾,准备仔细研读了。这一系列博客就是本人研读的心得。

       为什么现在要学习UI 界面的设计?你猜对了:一方面,它比较简单,没有用到太多DX 9 中的概念;另一方面,它很有用,不论是在游戏编程还是在游戏引擎设计中;最后,它很有趣!

       下面是这本书的封面:

       这本书的下载地址很容易找到,本人就不发了。实在找不到的同学请联系我。

        这本书比较老了,是2004年的,不过里面的内容并没有过时……吧。书上有些语言比较晦涩难懂,貌似不是面向全世界的,比如说前言部分;不过幸好正文大部分还是很好懂的,至少从我读过的这几章来看是这样。不过这本书就像《Programming Role Playing Games with DirectX 9 2nd edition》一样,网上找不到源代码!(不过,由于本人的慷慨,后者的源代码现在已经有了。)书上的代码自然是不全的,所以读起来有一些困难。所以本人尽量把书上的代码用自己的语言(其实是参考了几本“龙书”的经验)写出来供大家研究。

       注意本系列博客并不是这本书的全文翻译。我只是将一些要点和注意事项提出来,更多的还是得大家自己去读书。我在这里的主要任务恐怕还是弄代码了。


       还有一件值得注意的事情是,我用的是最新版DX,也就是DirectX SDK June 2010
版,可能有一些东西跟书上的不同。

======================================================================

 

第1章 User Interfaces(用户界面)

======================================================================

       这一章向我们介绍了UI 的基本概念。既然要设计UI,不对它有一个基本的了解怎么行?老实说,我也是读了这一章之后才知道有这么多种UI 的。推荐大家过一遍。

       我把这一章要回答的几个问题列在这里:

1What is a user interface?(啥是UI
呀?)

2What is a control?(啥是控件?)

3What types of controls are there?(有哪些类型的控件?)

4What are interface flow diagrams?(什么是界面流程图?)

5What is interface design?(什么是界面设计?)

6Why is interface design important?(为何界面设计很重要?)

7Which interface design guidelines are recommended to follow?(我们建议遵循什么样的界面设计准则?)

 

第1.1 节 User Interfaces---- What Are They?(用户界面——它们是啥?)

       这一节讲了UI 的基本概念。想必用过Windows操作系统(或者很多其他操作系统)的同学都知道UI 是什么。这里就不赘述了。

 

第1.2 节 Controls---- Gadgets and Gizmos

       这一节介绍了组成用户界面的基本单元——控件(Controls)。这里面一共列举了如下几种控件:

1Text Boxes(文本框)。顾名思义。比如说某些游戏一开始让你输入角色名字的小框框。

2Text Edits(文本编辑器)。是Text Boxes
的升级版。

3Buttons(按钮)。游戏中不常见。但是用过计算器程序的都知道是怎么回事;对的,就是那些数字键(还有其他的键)。

4Labels(标签)。最简单的控件之一。就是一些说明类的、不可更改的文本。比如说游戏的技能表中的技能名字。

5List Boxes(列表框)。提供一列可选择条目的框框。这些条目可以选择任意多个。比如说游戏中的装备列表。

6Drop-Down Lists(下拉菜单)。和List Boxes
很像,不过有几个主要区别:列表中只能够选择一项,选择完毕后只显示当前所选择的项,并且右端有一个向下的箭头,点击可以展开所有项目。

7Check Boxes(单选框)。就是一个只能位于两种状态——选中和未选中——之一的条目。可以组成List Boxes

8Menus(菜单)。菜单本质上就是程序选项的一个有结构的列表。有两种形式:普通的下拉菜单和按鼠标右键弹出的弹出菜单。

9Page Controls(页面控件)/Tab Controls。它们用于将UI
分割成相对独立的几个部分。比如说游戏的选项菜单点开后,通常可以看到好几页不同的选项,分别对应画面、声音、输入等等。

10Windows and Other Containers(窗口和其他容器)。所谓的容器,本质上就是在其边界内包含着其他控件的控件。这里面有父控件(parent
controls
)和子控件(child controls)的概念。例子比如退出游戏时提示是否要保存进度的消息窗口。

 

第1.3 节 InterfaceFlow Diagrams ---- Interfaces on Paper

       这里讲到用流程图来表示一个程序的用户界面的组成是很重要的!

 

第1.4 节 InterfaceDesign ---- Tips and Tricks

       这一节讲了设计UI 时的一些建议和窍门:

1Be Consistent(一致性)。UI
的设计要让用户有一种熟悉感,也就是一是用起来要符合大家的习惯,二是同一个程序中的界面风格要统一。

2Know Your Audience(了解你的受众)。如果你的用户以菜鸟为主,那么你的程序的UI
要设计地简单易用;如果你的用户有很多高智商人群的话,那么可以加入一些高级选项。

3Justification and Alignment(对齐)。相互关联的控件在行或列的方向要对齐。此外间距要得当。

4Grouping Data(对数据分组)。将相关的数据放在同一个地方。Page Controls
在此时就有用武之地了。

5Error Handling(错误处理)。程序的错误在所难免;当程序出错时,以适当的方式告知用户。

6Disabling Program Features(禁用程序功能)。将程序目前不可用的功能所对应的控件“变灰”,从而将其禁用。

7Graphics, Colors, Icons, and Art(图形、颜色、图标和艺术)。总之,图片尽量少用;颜色可以稍微多用一点,但是要用得适当;图标比较好,但是要有一致性,不能够用同一个图标去代表两个不同的操作。

8Balancing Text and Symbols(让文本与符号平衡)。简言之:保持文本描述简短,并且使用描述性的图形(即图标)。

9Paths and Navigation(路径和导航)。这里讲了界面流程的重要性。要保证四件事:界面流程符合逻辑;只有在有必要的时候才会从一个界面跳到另一个界面;界面屏幕总是可以退出;除非告知了用户并得到同意,否则不会进行毁灭性操作。

10Keyboard Support(键盘支持)。虽然大多数界面的操作是由鼠标完成的,而且也更符合直观,但是不应该以牺牲键盘支持为代价。

11Tool Tips(工具提示)。就是当你的鼠标悬浮于某控件时,会弹出小提示,而鼠标离开的时候,提示会消失。这种功能很有必要(虽然在游戏中几乎没有运用过)。

 

======================================================================

 

       好啦,这一期就到这里了!希望大家能够喜欢!下一期我们正式讲述DX !

抱歉!评论已关闭.