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)。

相关条目