HUD 与 Scaleform UI
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 时获取 IScaleformUI | game/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),相关功能不完整,见 审计。