原文地址 https://www.iddevnet.com/doom3/guis.php
(历史原因,可能无法访问,毕竟太久了,时间有点....有的doom比如ui其实现在看,
有的代码有的地方也未必需要全部的研究,看,
现在看,包括Quake3代码,我现在看,有的制作关卡,自己有的使用,写脚本,做关卡等
,国产的一些游戏如果使用者引擎,有的我觉得需要改进,比如汉化,
有的比如脚本更换为Python,其他的网络代码增加,改进?ui改进?
渲染器稍微改进,很多确实是以前的引擎了,关卡编辑器编辑地图,
有时候就崩溃了,一旦地图的物体多了)
(此篇有无价值,我也不知道,总之我也是翻译的,很多ui代码基本没看过,
所以很多不确定,只是过去我下载的ui网页,我翻译的,这个待定....随读者自己决定吧)
gui编辑器是一个真正的救星,用于制作小而简单的guis。
Raven Software最初创建了Quake 4的GUI编辑器
(这就是标题栏中的“Quake IV GUI Editor”)的原因。
Doom 3中的GUI编辑器在一两年内还没有更新,因此当它随机崩溃时,不是他们的错。
在使用Doom 3 GUIs一段时间后,你们都会爱上和讨厌他们。
GUI当然代表图形用户界面。
GUI系统用于游戏中的每个单个菜单,
以及HUD和您看到的各种随机控制面板。
Doom 3中的系统非常简单,因为没有很多命令,但是那些命令非常强大。
整个系统基于嵌套的窗口和事件(如javascript)。
有一个名为“桌面”的顶级窗口,然后一个或多个窗口是桌面的“孩子”,
然后是零个或多个窗口,这些窗口是孩子的孩子等等
这是一个非常简单的GUI的例子,
可以用作计算机屏幕上的显示器或某些东西(因为它不是真正的交互式):
windowDef Desktop {
rect 0,0,640,480
背景颜色0,0,0,1
windowDef Text1 {
rect 35,50,285,200
背景色0.5,0.6,0.6,0.3
bordercolor 0.5,0.6,0.6,1
边界化1
文字“这是一些文字!”
字体“字体/银行”
textscale 0.5
textalign 1
阴影1
前色0.7,0.7,0.4,1
可见1
windowDef Text2 {
rect 5,80,275,20
背景色0.0,0.0,0.0,0.3
bordercolor 1,1,1,1
边界化1
文字“这是更多的文字!”
字体“字体/银行”
textscale 0.5
textalign 1
textaligny -13
前色0.4,0.7,0.7,1
可见1
}
}
windowDef Text3 {
rect 350,400,285,200
文字“惊人”
textalign 1
}
}
rect 0,0,640,480
背景颜色0,0,0,1
windowDef Text1 {
rect 35,50,285,200
背景色0.5,0.6,0.6,0.3
bordercolor 0.5,0.6,0.6,1
边界化1
文字“这是一些文字!”
字体“字体/银行”
textscale 0.5
textalign 1
阴影1
前色0.7,0.7,0.4,1
可见1
windowDef Text2 {
rect 5,80,275,20
背景色0.0,0.0,0.0,0.3
bordercolor 1,1,1,1
边界化1
文字“这是更多的文字!”
字体“字体/银行”
textscale 0.5
textalign 1
textaligny -13
前色0.4,0.7,0.7,1
可见1
}
}
windowDef Text3 {
rect 350,400,285,200
文字“惊人”
textalign 1
}
}
要查看这些内容,请将上述代码粘贴到mod的“guis”子目录中的“mygui.gui”文件中,
然后在控制台中键入“testGUI guis / mygui.gui”。如果要更改某些内容并查看结果,
则不必退出游戏。您可以在控制台中输入“reloadGuis”,并立即显示更改。
对于更高级的guis,您可能需要使用“reloadGuis”后再次尝试使用“testGui”。
现在我们来吧,让它更有趣。将 Text3 的 定义 更改 为:
windowDef Text3 {
rect 350,400,285,200
文字“惊人”
textalign 1
onTime 0 {
过渡直线“350,400,285,200”“350,300,285,200”“2000”;
过渡前景“1 1 1 1”“1 0 0 1”“1000”;
}
onTime 1000 {
过渡前景“1 0 0 1”“0 0 1 1”“1000”;
}
onTime 2000 {
“350,300,285,200”“350,400,285,200”“2000”;
过渡前景“0 0 1 1”“1 1 0 1”“1000”;
}
onTime 3000 {
过渡前景“1 1 0 1”“1 1 1 1”“1000”;
}
onTime 4000 {
resetTime 0;
}
}
rect 350,400,285,200
文字“惊人”
textalign 1
onTime 0 {
过渡直线“350,400,285,200”“350,300,285,200”“2000”;
过渡前景“1 1 1 1”“1 0 0 1”“1000”;
}
onTime 1000 {
过渡前景“1 0 0 1”“0 0 1 1”“1000”;
}
onTime 2000 {
“350,300,285,200”“350,400,285,200”“2000”;
过渡前景“0 0 1 1”“1 1 0 1”“1000”;
}
onTime 3000 {
过渡前景“1 1 0 1”“1 1 1 1”“1000”;
}
onTime 4000 {
resetTime 0;
}
}
确实令人惊讶 这个简单的变化使得惊人的文字在改变颜色的同时上下颠倒。
这段代码基本上说:
- 在时间0:在2秒内开始将矩形从“350,400,285,200”转换到“350,300,285,200”,并开始将前景颜色从白色转换为红色超过1秒。
- 时间1000(1秒):从红色变为蓝色超过1秒。
- 时间2000(2秒):将矩形向下移动超过2秒,并将颜色从蓝色转换为黄色。
- 3秒钟:从黄色回到白色超过1秒。
- 在4秒钟后,重新开始。
内置的定时器和转换命令是非常强大的工具。
应该注意的是,每个窗口保持自己的定时器,
所以'resetTime 0'只能复位当前窗口的时间。
如果我们想重置另一个窗口的时间,我们可以说“resetTime Text1 0”,
如果我们想要转换不同窗口的属性,我们会说“transition Text1 :: foreground ...”
另外需要注意的是 ,在脚本块内的每一行末尾都需要一个分号。
我们将在一秒钟内了解脚本块,但以“on”开头的任何内容可能都是脚本块。
我们的gui目前非常迷人,但是我们不能做任何事情。
“testGUI”命令有一个小问题。
你会注意到,当你测试GUI时你没有光标,
但是如果你把游戏中的这个gui应用到一个曲面上,光标就会出现。
这是因为世界guis处理与菜单guis有点不同。
为了测试的目的,我们将把我们的世界gui变成菜单gui,
所以我们可以用'testGUI'命令使用光标。在桌面窗口中设置“menugui 1”,
当您测试GUI时,您将看到光标(注意:关闭gui的游标,设置“nocursor 1”)。
即使你可以移动你的光标,你仍然不能点击的东西。
为什么我们现在不去解决。
将“notime 1”添加到Text3,并用“onTime 4000”替换:
onTime 4000 {
不定时1;
}
onAction {
不设0;
resetTime 0;
}
不定时1;
}
onAction {
不设0;
resetTime 0;
}
假设一切顺利,每一次点击它,惊人的文字应该是小跳舞。惊人。
如果输入文字真的不是你的东西,那就有一个gui编辑器。
在控制台上键入' editGuis '启动它。
一句警告:它往往会崩溃。很多。
它不会处理非常复杂的guis与很多的转换太好了
(它只显示窗口在他们的初始状态)。
我用它来描述我想要的基本想法,
然后进入.gui文件来修复它并添加脚本。
窗口类型
windowDef | 标准窗口 |
animationDef | 不可见的窗口。在Doom 3中并没有真正使用,所以可能不行 |
editDef | 用户可以在其中键入文本的窗口(“服务器名称”框) |
choiceDef | 一个允许用户在几个不同选择之间切换的窗口。是/否窗口是选择defs,创建服务器菜单中的游戏类型窗口也是 |
sliderDef | 一个类似于滚动条的窗口。音量控制是一个滑块定义,多行编辑窗口和列表窗口中的滚动条也是一样 |
bindDef | 允许用户将键绑定到命令的窗口 |
listDef | 显示项目列表的窗口,需要代码才能正常工作 |
markerDef | Doom 3中没有使用,可能不工作 |
fieldDef | Doom 3中没有使用,可能不工作 |
renderDef | 显示渲染3d场景的窗口 |
事件处理程序
onTime <time> | 在T + <time>毫秒时间运行事件。时间线不是静态的,可以通过'resetTime'命令重置 |
onNamedEvent <event> | 允许代码触发自定义事件。“覆盖保存游戏”窗口使用命名事件实现 |
的OnAction | 当用户使用窗口执行某些操作时运行事件。对于大多数窗口,这意味着“鼠标左键”,但是当文本在editDef中更改或者在选项ID中更改时也会触发 |
onActionRelease | 当操作完成时运行事件。对于大多数窗口,这意味着“鼠标左键”,但是editDef和choiceDef的行为奇怪 |
OnMouseEnter在 | 当鼠标进入窗口矩形时运行事件。请注意,这个事件是不可靠的,因为z排序和快速老鼠的问题 |
onMouseExit | 当鼠标退出窗口矩形时运行事件。注意这个事件也是不可靠的。很可能得到一个鼠标进入,但没有鼠标退出消息 |
onActivate | 当gui被首次激活时(对于world guis,当用户首先将其光标放在gui上时)运行事件。这应该放在桌面窗口中 |
onDeactivate | 当guis被禁用时(在onActivate的对面)运行事件 |
onEsc | 当用户按下键盘上的转义按钮时,运行此事件 |
的onEvent | 每帧运行此事件。这里的脚本应该很小,因为.. ..它们是运行每一帧。在内部这被称为onFrame,但是我们不得不把它当作onEvent,以便不会破坏现有的guis |
onTrigger | 当其附加的实体被触发时,运行此事件。应该放在桌面窗口中 |
的OnEnter | 当用户按下EnterDef或editDef(当用户双击一个listdef时也调用),运行此事件。 |
onEnterRelease | 当用户放开回车键时,运行此事件。listDef不使用此事件 |
脚本命令
set [window ::] <variable> <value> | 将某些变量设置为某个值 |
setFocus <window> | 将焦点设置到某个窗口 |
结束游戏 | 结束游戏(将g_nightmare设置为true并调用断开连接) |
resetTime [window] [time] | 重置一些窗口的时间轴一段时间。如果指定窗口,则必须指定时间。如果您没有指定任何内容,则将当前窗口重置为0 |
showCursor <bool> | 显示或隐藏光标 |
resetCinematics | 将在窗口中播放的动画重置为0 |
transition [window ::] <variable> <from> <to> <time> [<accel> <decel>] | 随着时间(以毫秒为单位),将变量从一个值线性内插到另一个值。加速和减速是指定加速或减速时间的一小部分(默认为0)的值<1。如果加速+减速> 1,则将其归一化。 |
localSound <声音> | 播放声音 |
runScript <function> | 在游戏脚本中运行指定的函数 |
evalRegs | 重新刷新窗口寄存器(变量)。不应该再需要了 |
窗口寄存器
这些可以在运行时使用set命令(或vecs和float的转换)进行更改
变量 | 类型 | 默认 | |
---|---|---|---|
矩形 | rect(vec4) | 0,0,0,0 | x,y,窗口的宽度,高度尺寸。x,y相对于父 |
可见 | 布尔 | 真正 | 显示或隐藏窗口 |
noevents | 布尔 | 假 | 禁用窗口的所有事件 |
前景色 | 颜色(vec4) | 1,1,1,1 | 文字颜色 |
hovercolor | 颜色(vec4) | 1,1,1,1 | 当光标在其上时,文字颜色 |
背景色 | 颜色(vec4) | 0,0,0,0 | 坚实的背景颜色 |
BORDERCOLOR | 颜色(vec4) | 0,0,0,0 | 边框颜色 |
matcolor | 颜色(vec4) | 1,1,1,1 | 背景材料的颜色 |
规模 | VEC 2 | 没用过 | |
翻译 | VEC 2 | 没用过 | |
回转 | 浮动 | 0 | 旋转窗口中的所有东西 |
textscale | 浮动 | 1 | 均匀地缩放文本的大小 |
文本 | 串 | 要在窗口中显示的文字 | |
背景 | 串 | 使用背景材料 | |
varbackground | 串 | 没用过 | |
的runScript | 串 | 没用过 | |
CVAR | 串 | 请参阅:editDef | |
选择 | 串 | 参见:choiceDef | |
choiceVar | 串 | 参见:choiceDef | |
捆绑 | 串 | 请参阅:bindDef | |
modelRotate | vec4 | 请参阅:renderDef | |
modelOrigin | vec4 | 请参阅:renderDef | |
lightOrigin | vec4 | 请参阅:renderDef | |
浅色 | vec4 | 请参阅:renderDef | |
viewOffset | vec4 | 请参阅:renderDef |
可以使用'definevec4','definefloat'和'float'命令来定义附加的用户变量。
注意,您不能设置变量的初始值(它将始终为0)。
Doom 3中有guis指定一个初始值,但它被忽略。例:
windowDef Desktop {
string |
rect 0, 0, 640, 480
backcolor 0, 0, 0, 1
float myfloat;
definefloat myotherfloat
definevec4 myvec4
}
窗口变量
这些可以在文件中更改,但不能在运行时更改
变量 | 类型 | 默认 | |
---|---|---|---|
showtime | 布尔 | 假 | 显示窗口时间(调试) |
showcoords | 布尔 | 假 | 显示窗口坐标(调试) |
forceaspectwidth | 浮动 | 640 | 强制绘制表面宽度(在桌面窗口上使用) |
forceaspectheight | 浮动 | 480 | 强制绘制表面高度(在桌面窗口上使用) |
matscalex | 浮动 | 1 | 在x方向调整背景材料 |
matscaley | 浮动 | 1 | 在y方向刻度背景材料 |
bordersize | 浮动 | 0 | 设置边框的大小,请注意,必须将其设置为除0以外的其他值才能使borderColor执行任何操作 |
NOWRAP | 布尔 | 假 | 不要包装不适合矩形的文本 |
阴影 | 布尔 | 假 | 绘制文字时使用黑色的阴影 |
textAlign设置 | INT | 0 | 指定文本生成(0 = left; 1 = center; 2 = right) |
textalignx | float | 0 | 偏移相对于窗口的文本的x值 |
textaligny | float | 0 | 偏移相对于窗口的文本的y值 |
shear | VEC 2 | 0,0 | “剪切”矩形,将其变成平行四边形。范围是0到1 |
wantenter | 布尔 | 假 | 当用户按Enter键时,将窗口发送到窗口 |
naturalmatscale | 布尔 | 假 | 使用背景材料的真实尺寸 |
nocilp | bool | 假 | 不要夹住位于窗口矩形之外的绘图操作 |
nocursor | bool | 假 | 隐藏光标(在桌面窗口中使用) |
menuguibool | 假 | 这个gui是全屏幕(在桌面窗口上使用) | |
modal | 布尔 | 假 | 如果活动的话,这个窗口会使用它们,用于弹出框 |
invertrect | 布尔 | 假 | 这个窗口是倒置的 |
name | char | <名称> | 设置窗口名称,这将覆盖打开大括号之前指定的名称 |
play | char | 打印一条警告信息,告诉您不要使用它 | |
comment | char | 免费表格评论区 | |
font | char | 设置字体。选择是“fonts / micro”“fonts / bank”或“fonts / an” |
窗口变量(editDef)
变量 | 类型 | 默认 | |
---|---|---|---|
MAXCHARS | INT | 128 | 可以键入的最大字符数 |
数字 | bool | 假 | 此控件只接受数字 |
包 | bool | 假 | 大于控件宽度的文本被包装,如果文本超出高度,则会创建一个滚动条(滑块) |
只读 | bool | 假 | 无法编辑文字 |
forceScroll | bool | 假 | 控件被强制滚动到底部 |
资源 | string | 文件从中读取初始文本 | |
密码 | bool | 假 | 控件显示星号(***)而不是文本 |
CVAR | string | 附加的cvar。它显示cvar的值,并在用户更改文本时更改cvar | |
的LiveUpdate | bool | 真正 | 如果设置,cvar将随文本更改而更改,并且文本随cvar更改而更改。否则只有发送“cvar read”或“cvar write”时才会更改 |
cvarGroup | string | Cvar组这个项目属于。这使得可以使用cvar读/写命令更新组中的所有cvar。例如,“cvar read audio”将会将cvarGroup设置为audio的所有控件进行更新 |
窗口变量(choiceDef)
变量 | 类型 | 默认 | |
---|---|---|---|
choicetype | INT | 0 | 0 = cvar包含一个基于0的索引,1 = cvar包含一个值字符串 |
currentchoice | INT | 0 | 当前选择的选择 |
选择 | char | 分号分开的选择列表(是;否) | |
值 | <选择> | 分号分隔值列表(应该具有与“选择”相同数量的项目) | |
GUI | string | 要附加的GUI parm将包含currentchoice作为数字 | |
CVAR | string | 请参阅:editDef | |
的LiveUpdate | bool | 真正 | 请参阅:editDef |
cvarGroup | string | 请参阅:editDef |
窗口变量(sliderDef)
变量 | 类型 | 默认 | |
---|---|---|---|
低 | float | 0 | 最小值 |
高 | float | 100 | 最大值 |
步长 步 | float | 1 | 当使用箭头键时要更改的量 |
垂直 | bool | 假 | 滑块上下移动 |
滚动条 | bool | 假 | 此滑块用作滚动条 |
thumbshader | string | 用于“拇指”(移动的部分)的材料 | |
CVAR | string | 请参阅:editDef | |
的LiveUpdate | bool | 真正 | 请参阅:editDef |
cvarGroup | string | 请参阅:editDef |
窗口变量(bindDef)
变量 | 类型 | 默认 | |
---|---|---|---|
捆绑 | string | 命令绑定到 |
窗口变量(listDef)
变量 | 类型 | 默认 | |
---|---|---|---|
横 | bool | false | 该列表从左到右(未测试) |
列表名称 | bool | 列表的名称。代码使用它来填充列表中的项目 | |
制表位 | string | 多列列表的像素偏移的逗号分隔列表 | |
tabaligns | string | 逗号分隔列表“textalign”为每列 | |
multipleSel | bool | false | 可以选择多个项目(需要代码支持) |
窗口变量(renderDef)
变量 | 类型 | 默认 | |
---|---|---|---|
模型 | string | 模型(文件,不def)渲染 | |
阿尼姆 | string | 动画玩 | |
animClass | string | entityDef从中获取动画 | |
lightOrigin | vec4 | -128,0,0,1 | 灯的位置 |
浅色 | color(vec4) | 1,1,1,1 | 光的颜色 |
modelOrigin | vec4 | 0,0,0,0 | 模型的位置 |
modelRotate | vec4 | 0,0,0,0 | x,y,z旋转 |
viewOffset | vec4 | -128,0,0,1 | 相机的位置 |
needsRender | 布尔 | 真正 | 脏标志,如果某些更改则将其设置为true,以便再次呈现场景 |
string |