doom3之GUI

原文地址 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文件来修复它并添加脚本。

GUI参考

窗口类型

windowDef标准窗口
animationDef不可见的窗口。在Doom 3中并没有真正使用,所以可能不行
editDef用户可以在其中键入文本的窗口(“服务器名称”框)
choiceDef一个允许用户在几个不同选择之间切换的窗口。是/否窗口是选择defs,创建服务器菜单中的游戏类型窗口也是
sliderDef一个类似于滚动条的窗口。音量控制是一个滑块定义,多行编辑窗口和列表窗口中的滚动条也是一样
bindDef允许用户将键绑定到命令的窗口
listDef显示项目列表的窗口,需要代码才能正常工作
markerDefDoom 3中没有使用,可能不工作
fieldDefDoom 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,0x,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
modelRotatevec4请参阅:renderDef
modelOriginvec4请参阅:renderDef
lightOriginvec4请参阅:renderDef
浅色vec4请参阅:renderDef
viewOffsetvec4请参阅: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设置INT0指定文本生成(0 = left; 1 = center; 2 = right)
textalignxfloat0偏移相对于窗口的文本的x值
textalignyfloat0偏移相对于窗口的文本的y值
shearVEC 20,0“剪切”矩形,将其变成平行四边形。范围是0到1
wantenter布尔当用户按Enter键时,将窗口发送到窗口
naturalmatscale布尔使用背景材料的真实尺寸
nocilpbool不要夹住位于窗口矩形之外的绘图操作
nocursorbool隐藏光标(在桌面窗口中使用)
menuguibool这个gui是全屏幕(在桌面窗口上使用)
modal布尔如果活动的话,这个窗口会使用它们,用于弹出框
invertrect布尔这个窗口是倒置的
namechar<名称>设置窗口名称,这将覆盖打开大括号之前指定的名称
playchar打印一条警告信息,告诉您不要使用它
commentchar免费表格评论区
fontchar设置字体。选择是“fonts / micro”“fonts / bank”或“fonts / an”

窗口变量(editDef)

变量类型默认
MAXCHARSINT128可以键入的最大字符数
数字bool此控件只接受数字
bool大于控件宽度的文本被包装,如果文本超出高度,则会创建一个滚动条(滑块)
只读bool无法编辑文字
forceScrollbool控件被强制滚动到底部
资源string文件从中读取初始文本
密码bool控件显示星号(***)而不是文本
CVARstring附加的cvar。它显示cvar的值,并在用户更改文本时更改cvar
的LiveUpdatebool真正如果设置,cvar将随文本更改而更改,并且文本随cvar更改而更改。否则只有发送“cvar read”或“cvar write”时才会更改
cvarGroupstringCvar组这个项目属于。这使得可以使用cvar读/写命令更新组中的所有cvar。例如,“cvar read audio”将会将cvarGroup设置为audio的所有控件进行更新

窗口变量(choiceDef)

变量类型默认
choicetypeINT00 = cvar包含一个基于0的索引,1 = cvar包含一个值字符串
currentchoiceINT0当前选择的选择
选择char分号分开的选择列表(是;否)
<选择>分号分隔值列表(应该具有与“选择”相同数量的项目)
GUI
string
要附加的GUI parm将包含currentchoice作为数字
CVAR     string请参阅:editDef
的LiveUpdatebool真正请参阅:editDef
cvarGroupstring请参阅:editDef

窗口变量(sliderDef)

变量类型默认
float0最小值
float100最大值
步长
float1当使用箭头键时要更改的量
垂直bool滑块上下移动
滚动条bool此滑块用作滚动条
thumbshaderstring用于“拇指”(移动的部分)的材料
CVARstring请参阅:editDef
的LiveUpdatebool真正请参阅:editDef
cvarGroupstring请参阅:editDef

窗口变量(bindDef)

变量类型默认
捆绑string命令绑定到

窗口变量(listDef)

变量类型默认
boolfalse该列表从左到右(未测试)
列表名称bool列表的名称。代码使用它来填充列表中的项目
制表位string多列列表的像素偏移的逗号分隔列表
tabalignsstring逗号分隔列表“textalign”为每列
multipleSelboolfalse可以选择多个项目(需要代码支持)

窗口变量(renderDef)

变量类型默认
模型string模型(文件,不def)渲染
阿尼姆string动画玩
animClassstringentityDef从中获取动画
lightOriginvec4-128,0,0,1灯的位置
浅色color(vec4)1,1,1,1光的颜色
modelOriginvec40,0,0,0模型的位置
modelRotatevec40,0,0,0x,y,z旋转
viewOffsetvec4-128,0,0,1相机的位置
needsRender布尔真正脏标志,如果某些更改则将其设置为true,以便再次呈现场景

string

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值