Zh/GameUI: Difference between revisions
< Zh
Jump to navigation
Jump to search
No edit summary |
mNo edit summary |
||
(7 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{ | {{LanguageBar}} | ||
''' | :''不要与 {{L|game_ui}} 实体混淆'' | ||
GameUI | '''GameUI''' 是提供 {{LCategory|VGUI|VGUI}} "前端" 的代码:广泛地说,主菜单还有加载界面的代码。 | ||
GameUI面板是其专用面板 ("GameUI Panel") 的子对象。 客户端的 {{L|RootPanel}} 只用于游戏里的HUD元素。 | |||
== {{src04|name}} 到 {{src13|name}} == | |||
[[File:Ep2_menu.jpg|thumb|{{L|Orange_Box_(engine_branch)#2009/MP|Source 2009}} 的GameUI。闭源。]] | |||
在Source引擎的原始分支中 (从 {{L|Source_2004|Source 2004}} 到 {{L|Source_2013|橙盒}}),GameUI是一个封闭的引擎库,只能通过编辑 {{L|res}} 脚本文件进行有限地操作。这些脚本定义了宽度、高度、元素位置等属性,开发者可以添加新的非交互元素,并通过一定技巧隐藏现有元素。 | |||
开发者能够 {{L|VGUI2: Creating a panel|创建新的VGUI面板}} ,其行为与GameUI原生面板完全一致。从 {{L|Source_SDK_Base_2013|Source 2013}} 引擎开始 (该版本采用了 ''{{L|Team Fortress 2|军团要塞2}}'' 的组件),此类面板可通过 {{L|Override GameUI|覆盖}} 默认主菜单实现自定义—— {{L|IGameUI}} 接口为此新增了四个专用函数。 | |||
== {{l4d|name}} 到 {{as|name}} 引擎分支 == | |||
[[File:Swarm menu.jpg|thumb|{{L|Left_4_Dead_engine_branch|求生之路分支}} 的GameUI。异形丛生的SDK提供了代码。]] | |||
{{tip| | {{L|Alien_Swarm/Authoring_Tools|异形丛生 SDK}} 包含了新版L4D风格GameUI的完整源代码,该UI系统已被移至客户端库中。其设计针对主机平台(无指向设备)进行了重构:所有功能被整合到同一套可导航菜单系统中,用户无法同时操作多个区域。其编程实现也大幅简化。 | ||
{{tip|使用此版本代码,仍可创建与Source 2009极其相似的VGUI面板。}} | |||
=== 创建一个新的窗口 === | === 创建一个新的窗口 === | ||
# | # 新建一个继承自 <code>{{L|CBaseModFrame}}</code> 的类。 | ||
# 在<code>game\resource\ui\basemodui\</code> | # 在 <code>game\resource\ui\basemodui\</code> 目录下创建对应的 "<class name>.res" 脚本。 | ||
# | # 在 <code>WINDOW_TYPE</code> enum(【术语】枚举)中添加新条目。 | ||
# | # 修改 <code>CBaseModPanel::OpenWindow()</code> 中庞大的switch语句,加入新枚举和类。 | ||
这种笨拙的枚举/switch indirection的设计,大概是为了让单个"窗口类型"值能根据UI状态打开不同窗口对象——遗憾的是Valve至今没有实际应用过! | |||
=== | === 窗口打开机制 === | ||
使用代码 <code>CBaseModFrame* CBaseModPanel::OpenWindow()</code>: | |||
<source lang=cpp> | <source lang=cpp> | ||
#include "gameui\swarm\basemodpanel.h" | #include "gameui\swarm\basemodpanel.h" | ||
Line 46: | Line 47: | ||
</source> | </source> | ||
参数说明如下: | |||
; <code>WINDOW_TYPE &wt</code> | ; <code>WINDOW_TYPE &wt</code> | ||
: | : 定义具体打开哪个窗口的[[W:Enumerated_type|枚举值]]。 | ||
; <code> | ; <code>{{L|CBaseModFrame}}* caller</code> | ||
: | : 发起打开请求的父窗口,除其他作用外,新窗口的 ""back"" 按钮将指向该对象。 | ||
; <code> | ; <code>{{L|bool}} hidePrevious</code> | ||
: | : 若为true则隐藏 <code>caller</code> 窗口。 | ||
; <code> | ; <code>{{L|KeyValues}}* pParameters</code> | ||
: | : 传递给新窗口的参数集。 | ||
<code>OnOpen()</code> | 新窗口打开时会触发 <code>OnOpen()</code> 函数的调用。 | ||
=== | === 启动 === | ||
初始化顺序为: | 初始化顺序为: | ||
Line 69: | Line 70: | ||
# <code>CBaseModPanel::OpenWindow()</code> | # <code>CBaseModPanel::OpenWindow()</code> | ||
<code>CBaseModPanel</code> | <code>CBaseModPanel</code> 是单例对象; <code>CBaseModFrame</code> 是所有窗口的基类。 | ||
{{ACategory|VGUI}} {{ACategory|Programming}} | |||
{{ACategory|VGUI}} {{ACategory|Programming}} |
Latest revision as of 04:36, 24 June 2025
- 不要与 game_ui 实体混淆
GameUI 是提供 VGUI "前端" 的代码:广泛地说,主菜单还有加载界面的代码。
GameUI面板是其专用面板 ("GameUI Panel") 的子对象。 客户端的 RootPanel 只用于游戏里的HUD元素。
起源2004 到 起源2013

Source 2009 的GameUI。闭源。
在Source引擎的原始分支中 (从 Source 2004 到 橙盒 ),GameUI是一个封闭的引擎库,只能通过编辑 res 脚本文件进行有限地操作。这些脚本定义了宽度、高度、元素位置等属性,开发者可以添加新的非交互元素,并通过一定技巧隐藏现有元素。
开发者能够 创建新的VGUI面板 ,其行为与GameUI原生面板完全一致。从 Source 2013 引擎开始 (该版本采用了 军团要塞2 的组件),此类面板可通过 覆盖 默认主菜单实现自定义—— IGameUI 接口为此新增了四个专用函数。
求生之路 到 异形丛生 引擎分支

求生之路分支 的GameUI。异形丛生的SDK提供了代码。
异形丛生 SDK 包含了新版L4D风格GameUI的完整源代码,该UI系统已被移至客户端库中。其设计针对主机平台(无指向设备)进行了重构:所有功能被整合到同一套可导航菜单系统中,用户无法同时操作多个区域。其编程实现也大幅简化。

创建一个新的窗口
- 新建一个继承自
CBaseModFrame
的类。 - 在
game\resource\ui\basemodui\
目录下创建对应的 "<class name>.res" 脚本。 - 在
WINDOW_TYPE
enum(【术语】枚举)中添加新条目。 - 修改
CBaseModPanel::OpenWindow()
中庞大的switch语句,加入新枚举和类。
这种笨拙的枚举/switch indirection的设计,大概是为了让单个"窗口类型"值能根据UI状态打开不同窗口对象——遗憾的是Valve至今没有实际应用过!
窗口打开机制
使用代码 CBaseModFrame* CBaseModPanel::OpenWindow()
:
#include "gameui\swarm\basemodpanel.h"
using namespace BaseModUI;
void openwindow()
{
CBaseModFrame* mainMenu = CBaseModPanel::GetSingleton().GetWindow( WT_MAINMENU );
CBaseModPanel::GetSingleton().OpenWindow( WT_GAMESETTINGS, mainMenu );
}
参数说明如下:
WINDOW_TYPE &wt
- 定义具体打开哪个窗口的枚举值。
CBaseModFrame * caller
- 发起打开请求的父窗口,除其他作用外,新窗口的 ""back"" 按钮将指向该对象。
bool hidePrevious
- 若为true则隐藏
caller
窗口。 KeyValues * pParameters
- 传递给新窗口的参数集。
新窗口打开时会触发 OnOpen()
函数的调用。
启动
初始化顺序为:
CGameUI::Initialize()
CBaseModPanel::RunFrame()
CBaseModPanel::OnGameUIActivated()
CBaseModPanel::OpenFrontScreen()
CBaseModPanel::OpenWindow()
CBaseModPanel
是单例对象; CBaseModFrame
是所有窗口的基类。