文档章节

如何实现一个UI系统

rise-worlds
 rise-worlds
发布于 2016/06/20 13:38
字数 1911
阅读 1
收藏 0

如何为我的游戏实现一个UI系统,这个问题我想了很久,不过我现在可不像开始的时候那样一点思路也没有。如果你也被这个问题所困扰,我十分乐意与你分享这几天来的学习成果。嘿嘿,我是不是有点得意忘形了?

在开始之前,我要提醒你,学而不思则惘。在看这篇文章的时候,请时刻保持头脑清醒,如果有什么不太明白的话,请停下一两分钟,好好想想,这篇文章可不是囫囵吞枣就能看懂的哦!此外这篇文章是建立在部分实例和猜测的基础上的,可能存在着大量的不科学的想法和严重的错误,如果你在实践的过程中出现了问题欢迎提问,如果你发现了其中的错误请你指出来,如果将来你发现被误导了(当然我会尽力减小这种可能),请不要埋怨,因为是否继续往下看是你自己的决定。

1、窗口
UI系统的表现形式是什么?在开始前我们有必要弄清这个问题。
我们需要对话框、按钮、单选按钮、复选按钮、滚动条、下拉列表……好了好了,想不到你一口气竟能说出这么多种窗口。是的,这些都是不同形式的窗口,UI系统正是靠着形形色色的窗口展示自己,请记住这一点。如果你还是不明白,就看一看MSDN中的Hierarchy Chart。

2、理解windows的UI系统
windows这样一套经典的图形操作系统,我如果不拿它做例子,实在是有点儿对不住比尔大叔啊。
窗口都是矩形的,不要跟我说不规则窗口,其实那也是一个矩形的,只不过有些地方没有画而已。既然是矩形,只要知道它的长和宽(Width,Height,有点儿不一样是吧?windows里叫宽和高),它就确定了。然后,你把它放在某个位置上,所以它又有了坐标(xPos,yPos)。你的UI系统至少也要有这些数据,不然就没法画了。
然后是各式各样的事件,当鼠标经过的时候,按钮变亮了;当你按下Alt+F的时候,弹出了一个菜单。不管在windows里是哪个设备驱动把这些信息告诉了UI系统,我们的确需要它,不是吗?
一个菜单被按下然后一个对话框弹了出来,是谁的结果?是鼠标吗?怎么可能!当然是UI系统干的。UI系统不仅要接受各种输入设备的信息改变相应的外观,它还要根据不同的操作产生消息。菜单按下时,windows会主动地往消息队列里发送一个WM_COMMAND消息。至于对话框是否会弹出来,就要看你是否对这个消息进行处理了。

还有别的什么吗?
当然有啦,只是我也不很清楚,毕竟才研究了三四天嘛。不过我可以告诉你是什么:那么多不同类型的窗口,windows是怎么区分的?这个问题很关键啦,窗体如何绘制,事件如何激发全都需要判断的。比如说一个普通按钮和一个单选按钮,一个按下之后要弹起来,另一个要有一个圆点,明显的不同。既然都是窗口,windows是怎么做到的呢?我在winuser.h里面看到了大量关于STYLE的宏,我猜是用了CASE判断,可是为每一个窗口都作判断也太麻烦了吧,还在研究中。。。

3、窗口类的封装
封装是为了更好的使用,但不是必需的。就像使用MFC我们可以方便开发项目。(不要跟我讨论你对MFC的感情,那是你自己的事)然而如果没有他,只用SDK我们一样可以完成上司的任务。但是为了方便我建议你这样做,封装你的窗口类。我没有对此作太多的研究,我想把更多的时间放到研究UI系统本身上。如果你想了解得更多,请看这里http://blog.csdn.net/mythma

4、消息映射及命令绕行
和封装窗口类一样,这也只是一个辅助性的工作。这也是MFC的做法,如果你的游戏不需要如此复杂的方法,或是你对此方法有成见的话就不要做了。也许,我真的有点偏离我的初衷,不像是在给我的游戏实现一个UI系统了。如果你想为类似DOS的系统添加一个GUI的话,嘿嘿,X-Window那样子的。按本文的UI系统做也许会有点小用。

对于消息映射和命令绕行,我说不好,看了两天《深入浅出MFC》,才稍微有点明白,建议你自己去看。我只说一点不同之处,游戏中MFC的方法不是完全适用的。MFC是一个应用程序框架,MFC命令绕行的过程控制的是程序的全部,而游戏的UI系统只是一个辅助部分,不是全部,甚至可以去掉(我是说做到游戏里去,我猜95仙剑的菜单就是和游戏一体的)。UI系统要根据鼠标键盘做出不同的反应,绘制不同的界面,它又不是程序的全部,所以你需要把每一个可用(有用)的消息都传给UI系统。(不一定是全部的消息,比如说我的UI只使用鼠标操作,那就只传递WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE、WM_LBUTTONDBLCLK等等)
while(1)
{
    if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)
    {
        if(!GetMessage(&msg,NULL,0,0))
            break;
        if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        // 在这里添加你向UI系统传递消息的代码
            UI_DecipherMessage(&msg);
    }
    else
    {
        // 在这里添加你游戏的主要逻辑代码
        GameMain();
    }
}
然后,做一个仅使用在UI系统内部的消息映射和命令绕行,它处理的是UI系统自己产生的消息,或是改变一些窗口的显示与关闭,或是向游戏主要逻辑做出如使用物品、退出游戏之类的信号。是的,UI系统需要自己产生很多消息,不要指望windows会主动因为你的控件被按下而向消息队列里传送WM_COMMAND消息,你得自己做这些,使用PostMessage函数就可以了。有时候工作会更多,因为你面对的是windows的消息队列和UI系统自身的消息队列。

5、一个例子
HOHOv5中的UI系统作为这篇文章的例子再合适不过了,可以说我的思路可能是被它干扰了。

在下一篇中,我可能会讲讲本文未能说清楚的问题和一个不用消息映射及命令绕行的实例。

参考:
(1)HOHOv5的UI系统头文件(没办法,我没有任何一个版本的源文件,也没厚着脸皮去找人家要。嘿嘿,关键是没法要。写这篇文章的时候我的网还没有办下来,怎么到我这里就预留接口不足,气死了)
(2)《深入浅出MFC》第一章的讯息映射的雏形、第三章的讯息映射和命令绕行、第九章的全部
(3)MSDN和winuser.h
(4)窗口之父CXWnd的封装

本文转载自:http://www.cnblogs.com/flying_bat/archive/2007/10/30/943525.html

rise-worlds

rise-worlds

粉丝 2
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
面试官: 你为什么使用前端框架?

面试官系列(5): 你为什么使用前端框架? 往期 面试官系列(1): 如何实现深克隆 面试官系列(2): Event Bus的实现 面试官系列(3): 前端路由的实现 面试官系列(4): 基于Proxy 数据劫持的双向绑定优...

寻找海蓝96
2018/06/06
0
0
巧用设计模式构建可配置Vue前端应用-活动页生成系统实践

背景 活动页,是各个互联网公司一个头疼的问题。为了跟上对手的脚步,需要时不时就要搞点花样。频繁重复的作业对于前端团队来讲是一件非常头疼的事情。活动发布系统是迫切需要的,让运营人员...

YaHuiLiang(Ryou)
2018/12/04
0
0
基于原生的移动跨平台研究和实践

基于原生主要是针对基于webview+h5比较来说的,基于H5的我不想再讨论了,我想尝试的是从UI到功能都是原生,而不是用H5模拟的所谓原生体验。 背景 我们从开发角度来考虑,但凡想从事长远的开发...

voxer
2017/03/26
133
0
iOS10 UI教程视图的边界与视图的框架

iOS10 UI教程视图的边界与视图的框架 iOS10 UI视图的边界 在视图的几何形状中我们提到了视图属性中的一部分属性可以将定义的视图绘制在屏幕上。其中典型的3个属性为边界属性、框架属性以及中...

大学霸
2016/11/23
23
0
用户体验设置和 UI 设计的 10 个不同点

在这个技术的世界,UX和UI这两个词条在几乎所有公司都很流行,无论大小,都在寻找招聘UX/UI设计师。这两个缩写词条使得整个技术工业为之疯狂,因为它们是最先进的前沿技术。那这两个词条实际...

oschina
2014/08/22
5.6K
13

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
10
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
23
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部