CD Code Digest Hub /CS:GO

HUD 与 Scaleform UI

9 分钟阅读 6 个章节 1 张图

CS:GO 这一快照的菜单与 HUD 基于 Scaleform(Flash 运行时):引擎侧有一个 scaleformui 模块封装 SDK,client.dll 中的 Scaleform/ 目录实现具体面板,并通过“游戏 API”回调与 Flash 影片双向通信。VGUI 仍存在,主要用于引擎/工具与专用服务器界面。

相关页面:玩家 · 实体复制 · 实体系统(用户消息) · 构建与物理组织

相关源码文件#

  • 运行时封装:scaleformui/scaleformuiimpl/scaleformuiimpl.h、scaleformui/scaleformuiimpl/scaleformuiinitimpl.cpp、scaleformui/scaleformuiimpl/scaleformuihighlevelimpl.cpp、scaleformui/scaleformui.vpc
  • HUD:game/client/cstrike15/Scaleform/HUD/(40 个文件),代表 game/client/cstrike15/Scaleform/HUD/sfhudmoney.cpp、game/client/cstrike15/Scaleform/HUD/sfhudflashinterface.h
  • 菜单与对话框:game/client/cstrike15/Scaleform/*.cpp、game/client/cstrike15/gameui/

1. 模块装配#

环节证据
ScaleformUIImpl 作为 tier3 AppSystem 实现 IScaleformUI 并暴露接口scaleformui/scaleformuiimpl/scaleformuiimpl.h:192、scaleformui/scaleformuiimpl/scaleformuiinitimpl.cpp:38
启动器在定义 INCLUDE_SCALEFORM 时加载 scaleformui(-sf3 时加载 scaleformui_3,该目录在仓库中不存在)launcher/launcher.cpp:784-810、vpc_scripts/projects.vgc:1199-1202
引擎在 Host_Init 中初始化全屏影片与光标engine/host.cpp:5645
引擎每帧用真实时间(除以时间缩放)驱动 RunFrame,注释说明这样菜单在暂停时也能工作engine/host.cpp:4511-4524、scaleformui/scaleformuiimpl/scaleformuihighlevelimpl.cpp:367
client.dll 在 Connect 时获取 IScaleformUIgame/client/cdll_client_int.cpp:1410

scaleformui 工程引用 thirdparty/scaleform/sdk42 的头文件与库,而该目录不存在:scaleformui/scaleformui.vpc:33-51。因此本仓库只能阅读接入层,无法构建 UI 运行时。

2. 一个 HUD 元素的结构:金钱面板#

证据:

  • HUD 元素以 DECLARE_HUDELEMENT 注册,并声明自己处理 AdjustMoney 用户消息:game/client/cstrike15/Scaleform/HUD/sfhudmoney.cpp:19-20。
  • 暴露给 Flash 调用的游戏 API 方法表:game/client/cstrike15/Scaleform/HUD/sfhudmoney.cpp:23-30。
  • 基类 SFHudFlashInterface 是 CHudElement 与 Scaleform 接入混入的组合:game/client/cstrike15/Scaleform/HUD/sfhudflashinterface.h:13-16。
  • 关卡初始化时按分屏槽位请求加载 Flash 元素:game/client/cstrike15/Scaleform/HUD/sfhudmoney.cpp:58-62。
  • 显示/隐藏通过 Value_InvokeWithoutReturn(m_FlashAPI, "showPanel"/"hidePanel") 调用 Flash 函数:game/client/cstrike15/Scaleform/HUD/sfhudmoney.cpp:108-120。
  • 每帧 ProcessInput 读取 HUD 观察对象的 GetAccount(),与缓存值比较后驱动加减动画:game/client/cstrike15/Scaleform/HUD/sfhudmoney.cpp:194-227。
  • 服务端在 AddAccount 中发送 CS_UM_AdjustMoney:game/server/cstrike15/cs_player.cpp:6034-6038。

3. HUD 元素清单#

Scaleform/HUD/ 下的实现文件覆盖:自动断线提示、聊天、击杀提示、无线电菜单、轮盘选择、队伍人数、特殊提示、发起投票、伤害方向、冻结镜头面板、血量护甲、信息面板、金钱、雷达、准星、试玩计时、投票、武器面板、胜负面板、武器选择等(以文件名为据,例如 game/client/cstrike15/Scaleform/HUD/sfhudradar.cpp、game/client/cstrike15/Scaleform/HUD/sfhudreticle.cpp、game/client/cstrike15/Scaleform/HUD/sfhudwinpanel.cpp、game/client/cstrike15/Scaleform/HUD/sfhud_deathnotice.cpp)。

菜单类界面(主菜单、开始画面、选队、选阵营模型、加载画面、选项、地图总览等)位于 Scaleform/ 根目录,例如 game/client/cstrike15/Scaleform/createmainmenuscreen_scaleform.cpp、game/client/cstrike15/Scaleform/teammenu_scaleform.cpp、game/client/cstrike15/Scaleform/loadingscreen_scaleform.cpp。

4. 客户端视觉效果(非 Scaleform)#

闪光致盲、夜视、烟雾遮罩等全屏效果由 CCSViewRender 在渲染管线中绘制,而不是 HUD:game/client/cstrike15/cs_view_scene.cpp:72、game/client/cstrike15/cs_view_scene.cpp:127、game/client/cstrike15/cs_view_scene.cpp:349,详见 客户端视图渲染管线。开发者控制台等引擎 VGUI 面板与 Scaleform 的分工见 VGUI 与本地化。

约束与边界#

  • Flash 影片(.swf/.gfx)与本地化文本是内容文件,不在仓库中;本页只能描述 C++ 一侧。
  • gameui/ 的 143 个文件、createmainmenuscreen_scaleform.cpp 中被注释的 GC 连接检查等只做存在性确认:game/client/cstrike15/Scaleform/createmainmenuscreen_scaleform.cpp:288。
  • 多个 Scaleform 文件含有 “Removed for partner depot” 标记(例如 game/client/cstrike15/Scaleform/HUD/sfhudfreezepanel.cpp),相关功能不完整,见 审计。