doom3的UI系统

doom3的UI系统是纯数据驱动的,例如

windowDef TextTitle2
{
     rect     20,341,600,55
     visible     1
     text     "#str_00073"
     forecolor     0.6,1,1,0
     textscale     0.8
     font     "fonts/micro"
     textalign     1
     notime     1

     onTime 0 {
          transition "forecolor" "1 1 1 0" "1 1 0.8 1" "500" ;
     }

     onTime 1000 {
          transition "forecolor" "1 1 0.8 1" "1 1 1 0" "500" ;
     }

     onTime 2000 {
          resetTime "0" ;
     }
}

这段文本定义了一个简单的窗口。windowDef说明这是一个普通窗口,后面跟着这个窗口的名字。

其他的窗口类型定义还有editDef,choiceDef,sliderDef,listDef,fieldDef等等,都是在普通窗口的

基础上增加了一些行为和属性,本文不打算详述。

后面紧接着是一些窗口属性值,这些属性可以分为两类,InternalVarWinVar

InternalVar是一些常量,定义后就不能改变,例如textalignx,texaligny,bordersize,font等

而WinVar属性,是在运行时可以被改变的属性,例如

visible,

backColor,

matColor,

foreColor,

hoverColor,

borderColor,

textScale,

rotate,

text

等。这些值可以在后面要提到的GUI脚本中被改变。

onTime是一个event,event会在某种条件下被调用。例如onTime event是在时间到达后面的值(毫秒)时被调用。

调用执行的内容是中括号中描述的GUI脚本

event的类型有

onTime,

onMouseEnter ,

onMouseExit ,

onAction ,

onActivate ,

onDeactivate ,

onESC ,

onEvent ,

onTrigger ,

onActionRelease ,

onEnter ,

onEnterRelease

transition是一个GUI脚本命令,它描述了一个WinVar跟据时间被平滑的插值的过程

transition "forecolor" "1 1 1 0" "1 1 0.8 1" "500" ;

表示前景色forecolor在500毫秒内从 "1 1 1 0"过渡到"1 1 0.8 1"

到这里你应该已经能够看出来,这段文本数据描述了一个以两秒为周期不断变换颜色的文字lable。

好,我们再来看一个复杂一点的例子

windowDef Desktop
{
     rect     0 ,0 ,640 ,480
     backcolor     0, 0, 0, 0.9
     windowDef CircleClamp
     {
          rect     7, 7, 626, 466
          visible     1
          windowDef Circle0
          {
               rect     -95,-174,820,820
               visible     1
               background     "gui/spin1"
               matcolor     0.5, 0, 0, 0.5
          }
     }
     windowDef TextButton2
     {
          rect     0,0,0,0
          text     "#str_00010"
          textscale     1.2
          forecolor     1,1,1,0
          visible     1
          textalign     1
          font     "fonts/micro"
          noevents     1

          onMouseEnter {
               transition "forecolor" "1 1 1 0.6" "1 1 1 1" "300" ;
               transition "btn2_top::matcolor" "1 1 1 1" "0.8 1 1 0.7" "300" ;
               transition "btn2_corner1::matcolor" "1 1 1 1" "0.4 1 1 0.7" "300" ;
               transition "btn2_corner2::matcolor" "1 1 1 1" "0.4 1 1 0.7" "300" ;
               transition "btn2_bottom::matcolor" "1 1 1 1" "0.4 1 1 0.7" "300" ;
               transition "btn2_corner3::matcolor" "1 1 1 1" "0.4 1 1 0.7" "300" ;
               transition "btn2_corner4::matcolor" "1 1 1 1" "0.4 1 1 0.7" "300" ;
               transition "btn2_right::matcolor" "1 1 1 1" "0.4 1 1 0.7" "300" ;
               transition "btn2_left::matcolor" "1 1 1 1" "0.4 1 1 0.7" "300" ;
               transition "btn2_fill::backcolor" "1 1 1 0.465" "0.4 1 1 0.32" "300" ;
          }

          onMouseExit {
               transition "forecolor" "1 1 1 1" "1 1 1 0.6" "200" ;
               transition "btn2_top::matcolor" "0.8 1 1 0.7" "1 1 1 0.5" "300" ;
               transition "btn2_corner1::matcolor" "0.4 1 1 0.7" "0.4 1 1 0.5" "300" ;
               transition "btn2_corner2::matcolor" "0.4 1 1 0.7" "0.4 1 1 0.5" "300" ;
               transition "btn2_bottom::matcolor" "0.4 1 1 0.7" "0.4 1 1 0.5" "300" ;
               transition "btn2_corner3::matcolor" "0.4 1 1 0.7" "0.4 1 1 0.5" "300" ;
               transition "btn2_corner4::matcolor" "0.4 1 1 0.7" "0.4 1 1 0.5" "300" ;
               transition "btn2_right::matcolor" "0.4 1 1 0.7" "0.4 1 1 0.5" "300" ;
               transition "btn2_left::matcolor" "0.4 1 1 0.7" "0.4 1 1 0.5" "300" ;
               transition "btn2_fill::backcolor" "0.4 1 1 0.32" "0.4 1 1 0.232" "300" ;
          }

          onAction {
               if ("gui::gui_parm4" == 1) {
                    set     "cmd" "play guisounds_error" ;
                    resetTime "AccessDenied" "0" ;
                    set "noevents" "1" ;
               } else {
                    set     "cmd" "activate ; play guisounds_click" ;
                    resetTime "AccessLocked" "0" ;
                    set "noevents" "1" ;
               }
          }

     }
     windowDef Static
     {
          rect     -10 ,-10 ,-660 ,500
          visible     1
          background     "gui/static"
          matcolor     1, 1, 1, pdhalffade[ time * 0.001 ] / 8
     }
}

首先,ui的定义是嵌套的,实际上,游戏中的用到的ui都是比较复杂的层次结构。任意多层的各种组件嵌套组合起来,理论上

可以形成任意复杂的UI效果。

然后我们看到了更多的event的使用,onMouseEnter,和onMouseExit实现了鼠标移入移出时的变化效果。

在onAction event中我们看到GUIScript中是可以带逻辑的,不过GUIScript中也只有“if”这一种逻辑。

GUI脚本中的命令有

set,

setFocus,

endGame,

resetTime,

showCursor,

resetCinematics,

transition,

localSound,

runScript,

evalRegs,

set命令可以直接设置某个WinVar。比如

set "Circle7::visible" "0" ;

将窗口Circle7的WinVar visible的值设为0,即隐藏这个窗口。

但如果set的参数是cmd,则其功能是让触发这个GUI event的对象执行后面的GUI command,可谓“脚本套脚本”,例如

一个player对象(某个玩家或NPC),触发了这个onEvent,event中调用了

set     "cmd" "activate ; play guisounds_click" ;

则这个player对象执行GUI command

activate

play guisounds_click

效果是,这个player作为activator激活了这个GUI所在的entity,并播放音效guisounds_click

常用的GUI command有

activate

runScript

play

setkeyval

setshaderparm等

最后.....

matcolor     1, 1, 1, pdhalffade[ time * 0.001 ] / 8

WinVar的值可以是一个表达式并且还能查表有木有

总结

doom3引擎的UI系统通过WinVar,GUI event,GUI Script,GUI Command等几个核心抽象,用最少的代码,

实现了极其灵活而强大的功能。

时间: 2024-10-26 10:59:39

doom3的UI系统的相关文章

Unity3D 4.6 新的UI系统

在Unity3D 4.6版本中,终于增加了新的UI系统.虽然从功能,效果等方面来讲,跟NGUI还有一定的差距,但NGUI毕竟是收费插件,对于游戏商用来说有一定的制约. 下面我们来看看,Unity3D 4.6中新的UI系统吧. 如上图所示,我们可以看到在GameObject菜单中,已将3D Object,2D Object和UI分类了. UI中,我们可以看到Panel,Button,Text,Image,RawImage,Slider,Scrollbar,Toggle,InputField,Can

全面理解 Unity UI 系统

[狗刨学习网] 随着 Unity 4.6 发布,新 UI 系统终于与大家见面了. RectTransform Unity UI 系统使用 RectTransform 实现基本的布局和层次控制.RectTransform 继承于 Transform,所以 Transform 的所有特征 RectTransform 同样拥有.在 Transform 基础上,RectTransform 增加了 轴心(pivot).锚点(实际上是用 anchorMin.anchorMax 两个点定义的矩形区域).和 尺

界面UI系统雏形

最近一直在做界面的灵活性,界面UI的设计可以说是一个永不褪色的话题,怎么说呢?首先给用户第一直观感受的肯定是你这款软件的界面设计好坏与否?所以界面UI应该予以重视. 界面UI系统的流程图: 第一步:页面模板,即动态生成页面 为什么需要动态生成页面呢?我们都知道一个JSP页面包括很多的信息,包括HTML表头.系统div块.显示数据的表格.添加/编辑的弹框.而这些都是每一个页面中都需要重复的.如何避免这些重复的代码,减少开发人员的工作量呢?这就引出了动态生成页面,即动态的创建业务页面,不需要手写HT

Unity3D 4.6 新的UI系统啊

在Unity3D 4.6版本中,终于增加了新的UI系统.虽然从功能,效果等方面来讲,跟NGUI还有一定的差距,但NGUI毕竟是收费插件,对于游戏商用来说有一定的制约. 下面我们来看看,Unity3D 4.6中新的UI系统吧. http://travel.tianya.cn/travelPlan/showPlan?planId=8413297 http://travel.tianya.cn/travelPlan/showPlan?planId=8413298 http://travel.tiany

Unity4.6新UI系统初探(uGUI)

一.引言 Unity终于在即将到来的4.6版本内集成了所见即所得的UI解决方案(视频).事实上从近几个版本开始,Unity就在为这套系统做技术扩展,以保证最终能实现较理想的UI系统.本文试图通过初步的介绍和试用,让读者对这套系统有大体的了解,以便更进一步评估这套UI系统好不好用,适合用在什么项目.为了避免坑挖太深,更进一步的试用和评估我将在<用uGUI开发自定义Toggle Slider控件>中进行论述.为论述方便,下文将这套New UI System简称为uGUI,并且以X-UI指代现有第三

理解和使用 Unity UI 系统

随着 Unity 4.6 发布,新 UI 系统终于与大家见面了.这篇文章将不会介绍如何使用按钮.滚动条之类的UI控件,这些内容可以参考Unity Manual:这篇文章的重点是,如何理解 UI 系统的设计,以便更好的在实际中使用.自定义和扩展. EventSystem 如果你使用 UI 系统,那么 EventSystem 对象会自动创建.这个对象负责监听用户输入.默认情况下,在电脑上可以使用键盘和鼠标输入,在移动设备上可以使用触摸输入.但是如果你要为surface这样的设备开发,你也可以同时启用

Cocos2D-X2.2.3学习笔记5(UI系统)

前言: 1.字体 2.标签 3.菜单 4.进度条 5.计时器 Cocos2d-x中得UI控件没有几个.在游戏制作的过程中也不须要什么UI.即使有些复杂的UI,那都得我们自己来封装的.比方.关卡选择. 它不像做IOS或Android.winform一大堆的UI控件 以下我们来介绍一下比較经常使用的UI 1.字体 Cocos2d-x中有三种字体.TTF/BMFNT/Arial, 它们都是CCLable下得一个子类,CCLable看名字当然知道是标签了,所以我们把标签和字体一起来解说 OK,我们先来看

动作卡牌游戏-系统设计-场景和UI系统

熟悉coco2dx的人,可能都知道在引擎内部提供CCScene类,这是一个场景概念的类,而cocos2dx本身提供了切换场景的方法. CCScene t_scene; CCDirector::sharedDirector()->runWithScene(t_scene); 其实,我们要做而非去怎么改引擎.而是在引擎外部进行封装.抽象出各个系统,然后通过各个系统中调用引擎的功能,来实现我们的需求. 需求: 要实现一个场景,场景是动态的,上面漂浮着各种各样的小岛,场景当中有飞鸟,流水.上面有一层GU

unity3D 实战 《小十传奇》系列之一:构建UI系统

今天开始学习慕课网上的unity3D教程,在学习的过程中记录下来,帮助自己和网友们梳理下unity3D做游戏的流程. 游戏玩法 小十传奇讲的是一个方块下落,若周围数字相加等于10就自动消除的游戏. 游戏截图 稍后补上 准备工作 去慕课网下载需要的素材和一个GDgeek工具包,下载地址: 走你 GDgeek工具包在assets目录下面,在自己的Project 中新建一个Plugins目录,讲GDGeek粘贴进去. unity3D的版本需要在4.6版本以上(好像是这个版本以上才有UI这个工具条的)