Credits 界面
基本信息
| 属性 | 值 |
|---|---|
| 源码类 | net.noiraude.gtnhcredits.client.gui.credits.CreditsScreen(final,继承 ModularUI2 的 CustomModularScreen) |
| 侧别限制 | @SideOnly(Side.CLIENT)(CreditsScreen.java:38),纯客户端界面 |
| ModularUI 屏幕 ID | gtnhcredits(super(GTNHCredits.MODID),CreditsScreen.java:60) |
| 面板 ID | credits(CreditsScreen.java:74) |
| 打开入口 | ① 原版主菜单按钮 ② Custom Main Menu 的 sendIMC 动作 |
| 退出方式 | 左下角 Back 按钮、ESC、以及 CMM 按钮的关闭 |
| 是否暂停游戏 | 是,pausesGame(true)(CreditsScreen.java:62) |
| 关闭后返回 | openParentOnClose(true) —— 返回打开它的父界面(CreditsScreen.java:61) |
| 容器类 | 无 —— 不使用 GuiContainer / TileEntity,纯 GuiScreen 逻辑 |
功能
界面分三段:顶栏 logo + 标题、中部左侧分类列表 + 右侧正文、底部两个按钮。
- 顶栏:左上角贴 logo(
config/gtnh-credits/gtnh-credits.cfg的credits_screen.logo指定),紧接其右是gui.credits.title标题,缩放 2.0 倍、深金色加粗(§6§l,CreditsScreen.java:111)。logo 高度固定为HEADER_HEIGHT - 4,宽度按贴图原始宽高比等比缩放(CreditsScreen.java:84-97),保证高度 32 px 时不拉伸变形。 - 分类列表:左侧固定宽 140 px 的可滚动列表(
CreditsBodyPanel.java:32),每项高 20 px,文本左对齐居中(CreditsCategorySelector.java:26)。选中项画0x30FFFFFF底 +0x80FFFFFF内边框,悬停项画0x18FFFFFF底,未选中文字色0xAAAAAA、选中0xFFFFFF(CreditsCategorySelector.java:61,71-79)。 - 正文区:可滚动的富文本,标题为当前分类显示名(1.5 倍缩放、金色
0xFFAA00),正文灰色(CachedRichTextWidget.java:35-38)。正文内容由class标记决定,见下方「分类 class 渲染规则」。 - 筛选框:右下角 120×20 的文本框,占位提示
gui.credits.filter.hint(灰色0x888888),最大长度 256 字符(CreditsScreen.java:44-46,225)。切换 GUI 缩放或窗口尺寸时重建文本框并保留已有文本(CreditsScreen.java:214-229)。 - 筛选模式按钮:底部右起第一个按钮,在
Exact/Fuzzy之间循环切换,悬停时两行 tooltip 分别说明两种模式(CreditsScreen.java:156-199)。
分类 class 渲染规则
分类能显示什么完全由 credits.json 中该分类的 class 数组决定(CreditsContentRenderer.java:55-69):
| class 值 | 效果 |
|---|---|
detail |
渲染分类描述(来自 lang 文件),分类名始终作为居中标题显示在描述上方 |
person |
渲染归属该分类的人员列表,按名字母序排序并去重 |
role |
在人名旁一并渲染其在该分类下担任的角色 |
未知的 class 值被静默忽略(credits.schema.md 的 Category.class 条目)。若 class 含 person 但筛选后列表为空,正文什么都不画(CreditsContentRenderer.java:62)。人员渲染有两种排版:含 role 时一人一行 名字 - 角色1, 角色2;不含 role 时逗号分隔流式折行(CreditsContentRenderer.java:64-68)。
筛选逻辑
两种模式在同一个文本框上切换,区别只在人名匹配算法(CreditsController.java:130-131):
| 模式 | 算法 | 细节 |
|---|---|---|
Exact(默认) |
正则表达式 find() |
以 CASE_INSENSITIVE | UNICODE_CASE 编译(CreditsController.java:80-81)。若输入不是合法正则(PatternSyntaxException),静默降级为不区分大小写的字面子串 contains 匹配(CreditsController.java:82-84,166-169) |
Fuzzy |
Damerau-Levenshtein 加权评分 | 评分越低越匹配;只有评分 <= credits_screen.fuzzyThreshold(默认 30.0)的人名才进入结果 |
模糊评分的四级规则(libCredits/util/FuzzyFinder.java:144-177):
| 匹配类型 | 评分公式 |
|---|---|
| 完全相同 | 0 |
| 前缀匹配 | 0.1 + 0.01 × (用户名长度 − 搜索词长度) |
| 子串匹配 | 5.0 + 0.5 × 子串起始下标 + 0.01 × (用户名长度 − 搜索词长度) |
| 都不匹配 | 10.0 + 3.0 × 前缀距离 + 0.5 × 全串距离 |
其中「前缀距离」只对用户名的前 min(用户名长度, 搜索词长度 + 5) 个字符计算(FuzzyFinder.java:40,167-173),全串距离用完整的 Damerau-Levenshtein(支持增删改与相邻换位,FuzzyFinder.java:66-106)。模糊模式的结果按名字母序重排后输出(CreditsController.java:181),即输出顺序仍是字母序而非评分序。
同一分类下同名的多条记录会被合并,其角色取并集并保留首次出现顺序(CreditsController.java:107-128)。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
顶栏高度 HEADER_HEIGHT |
36 px | CreditsScreen.java:41 |
底栏高度 FOOTER_HEIGHT |
36 px | CreditsScreen.java:42 |
| logo 渲染高度 | 32 px(HEADER_HEIGHT - 4) |
CreditsScreen.java:84 |
| 分类列表宽度 | 140 px | CreditsBodyPanel.java:32 |
| 分类列表项高度 | 20 px | CreditsCategorySelector.java:26 |
| 筛选框尺寸 | 120 × 20 px | CreditsScreen.java:44-45 |
| 筛选框边距 | 8 px | CreditsScreen.java:46 |
| 筛选框最大字符数 | 256 | CreditsScreen.java:225 |
| 返回按钮尺寸 | 100 × 20 px,距左/下各 8 px | CreditsScreen.java:127-129 |
| 筛选模式按钮尺寸 | 100 × 20 px,距右 136 px、距下 8 px | CreditsScreen.java:156-158(8 + FILTER_WIDTH + FILTER_MARGIN) |
| 正文区内边距 | 上 18 / 下 9 / 左右各 12 px | CreditsView.java:22-33 |
| 中部面板内容边距 | 10 px | CreditsBodyPanel.java:19 |
| 分类标题缩放 | 1.5 倍,色 0xFFAA00,与正文间距 10 px |
CachedRichTextWidget.java:34,36,38 |
| 中部面板底色 | 垂直渐变 0xC0101010 → 0xD0101010 |
CreditsBodyPanel.java:26 |
| 首次打开选中分类 | 索引 0 | CreditsController.java:29 |
| 首次打开筛选模式 | EXACT |
CreditsScreen.java:63 |
交互
| 触发 | 行为 |
|---|---|
| 点击左侧分类项 | 切换当前分类,滚动位置重置到顶部,正文标记为脏并重排(CreditsView.java:46-52) |
| 在筛选框输入 | 立即重算人员列表,滚动位置重置到顶部(CreditsView.java:54-60) |
| 点击筛选模式按钮 | Exact ⇄ Fuzzy 循环切换(CreditsScreen.java:189-199);左键(0)与右键(1)均可触发 |
点击 Back 按钮 |
关闭并返回父界面;左键(0)与右键(1)均可触发(CreditsScreen.java:148-154) |
| 按 ESC | 关闭界面(CreditsScreen.java:250-252) |
| 界面打开/关闭 | 开屏时 Keyboard.enableRepeatEvents(true),关屏时恢复为 false(CreditsScreen.java:203-211) |
依赖
- ModularUI2
2.3.45-1.7.10(build.properties:2)—— 硬依赖,声明为api配置(dependencies.gradle中api "com.github.GTNewHorizons:ModularUI2:..."),运行时缺失则界面无法构建。 - Custom Main Menu
1.14.0(build.properties:3)—— 仅编译期依赖(compileOnly),只有走 IMC 入口时才需要运行时存在。 - libCredits —— 同仓库子模块,以
shadowImplementation打进 mod jar 并重定位(dependencies.gradle:39;gradle.properties:133,140的usesShadowedDependencies = true/relocateShadowedDependencies = true)。
相关条目
- 主菜单 Credits 按钮 - 打开本界面的两个入口
- GTNH Credits 配置 -
logo与fuzzyThreshold的取值来源 - credits.json 数据文件 - 分类与人员数据的格式与加载顺序
- lang 语言文件 - 分类名、描述与角色名的翻译键体系