GameUI

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)Deutsch (de)中文 (zh)Translate (Translate)
不要与 game_ui(en) 实体混淆

GameUI 是提供 VGUI(en) "前端" 的代码:广泛地说,主菜单还有加载界面的代码。

GameUI面板是其专用面板 ("GameUI Panel") 的子对象。 客户端的 RootPanel(en) 只用于游戏里的HUD元素。

起源2004 到 起源2013

Source 2009(en) 的GameUI。闭源。

在Source引擎的原始分支中 (从 Source 2004(en)橙盒(en)),GameUI是一个封闭的引擎库,只能通过编辑 res(en) 脚本文件进行有限地操作。这些脚本定义了宽度、高度、元素位置等属性,开发者可以添加新的非交互元素,并通过一定技巧隐藏现有元素。

开发者能够 创建新的VGUI面板(en) ,其行为与GameUI原生面板完全一致。从 Source 2013(en) 引擎开始 (该版本采用了 军团要塞2(en) 的组件),此类面板可通过 覆盖(en) 默认主菜单实现自定义—— IGameUI(en) 接口为此新增了四个专用函数。

求生之路 到 异形丛生 引擎分支

求生之路分支(en) 的GameUI。异形丛生的SDK提供了代码。

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

Tip.png提示:使用此版本代码,仍可创建与Source 2009极其相似的VGUI面板。

创建一个新的窗口

  1. 新建一个继承自 CBaseModFrame(en) 的类。
  2. game\resource\ui\basemodui\ 目录下创建对应的 "<class name>.res" 脚本。
  3. WINDOW_TYPE enum(【术语】枚举)中添加新条目。
  4. 修改 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(en)* caller
发起打开请求的父窗口,除其他作用外,新窗口的 ""back"" 按钮将指向该对象。
bool(en) hidePrevious
若为true则隐藏 caller 窗口。
KeyValues(en)* pParameters
传递给新窗口的参数集。

新窗口打开时会触发 OnOpen() 函数的调用。

启动

初始化顺序为:

  1. CGameUI::Initialize()
  2. CBaseModPanel::RunFrame()
  3. CBaseModPanel::OnGameUIActivated()
  4. CBaseModPanel::OpenFrontScreen()
  5. CBaseModPanel::OpenWindow()

CBaseModPanel 是单例对象; CBaseModFrame 是所有窗口的基类。