Alignment
九宫格对齐枚举:位掩码布局与偏移换算
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.github.lunatrius.ingameinfo.Alignment |
| 行数 | 131 |
| 类型 | enum,9 个常量 |
九个位置与默认偏移
| 常量 | 默认 X | 默认 Y |
|---|---|---|
TOPLEFT |
2 | 2 |
TOPCENTER |
0 | 2 |
TOPRIGHT |
-2 | 2 |
MIDDLELEFT |
2 | 0 |
MIDDLECENTER |
0 | 0 |
MIDDLERIGHT |
-2 | 0 |
BOTTOMLEFT |
2 | -2 |
BOTTOMCENTER |
0 | -45 |
BOTTOMRIGHT |
-2 | -2 |
⚠️ BOTTOMCENTER 的 Y 偏移是 -45,与其余八个(±2 / 0)不同。
这不是笔误:底部居中要避开聊天框区域,所以额外上移 45 像素。
但它是硬编码在枚举构造参数里的,且与 BOTTOMLEFT / BOTTOMRIGHT
不对称 —— 想改只能在配置界面里逐项覆盖 alignment 分类下的
bottomcenter 项。
位掩码布局
alignment 字段是 int,用两组掩码编码:
| 掩码 | 值 | 覆盖常量 |
|---|---|---|
MASK_X |
0x0C |
LEFT=0x04 / CENTER=0x0C / RIGHT=0x08 |
MASK_Y |
0x03 |
TOP=0x01 / BOTTOM=0x02 / MIDDLE=0x03 |
⚠️ MIDDLE = 0x03 同时占了 TOP(0x01) 与 BOTTOM(0x02) 两位,
所以先判 X 再判 Y、且 getY 的 switch 里 MIDDLE 必须在
TOP / BOTTOM 之后 —— 实际代码正是这个顺序(:87-92)。
九个常量的 alignment 值在 static 块(:120-130)里统一赋值,
因为枚举构造时还不能引用其他常量。
坐标换算
getX(screenwidth, textwidth)(:76-84):
| 分支 | 公式 |
|---|---|
LEFT |
x |
CENTER |
x + (screenwidth - textwidth) / 2 |
RIGHT |
x + screenwidth - textwidth |
getY(screenheight, textheight)(:86-94):
| 分支 | 公式 |
|---|---|
TOP |
y + textheight |
MIDDLE |
y + textheight + screenheight / 2 |
BOTTOM |
y + screenheight - textheight |
⚠️ MIDDLE 分支的公式 同时加了 textheight 和 screenheight/2,
而 CENTER 只减了 textwidth/2。两者不对称:
垂直居中会把文字整体下移一整行高度。
⚠️ 两个方法都用了 Java 14+ 的 switch 表达式(case LEFT ->)。
本 mod 目标是 1.7.10 / Java 8 字节码,依赖 GTNH 构建链的
enableModernJavaSyntax(Jabel 或 JVM Downgrader)来降级。
直接用原版 JDK 8 编译会失败。
parse(:48-74)
字符串 → 枚举:startsWith("top"/"mid"/"bot") 定垂直,
endsWith("left"/"center"/"right") 定水平,拼成 "TOPLEFT" 之类再 valueOf。
⚠️ 前后缀判定顺序敏感:"bottomcenter" 先 startsWith("bot") ✓,
再 endsWith("center") ✓ → BOTTOMCENTER。
但 "topcenter" 也会先命中 startsWith("top") ✓ —— 正确。
问题是没有校验前缀与后缀必须都匹配:若传 "topfoo",
前缀命中 top 得到 "TOP",后缀全不命中则 value 仍是 "TOP",
valueOf("TOP") 抛异常 → 被 catch → 返回 null(:69-73)。
状态与行容器
| 字段 | 说明 |
|---|---|
defaultX / defaultY |
构造参数,final,供配置界面显示 |
x / y |
实际生效偏移,可被 setXY 改写 |
lines |
Collection<InfoText>,由 InGameInfoCore.refreshInfoTexts 填充 |
VALUES |
values() 的公开副本,供两层循环遍历 |
setXY(String)(:104-114)按单个空格 split(" "),
且要求 parts.length == 2;解析失败静默 catch (Exception ignored) {}。
所以配置里写两个空格或用 tab 都会静默失败,偏移保持默认值。
相关
- InGameInfoCore - 遍历
VALUES做 tick 与渲染 - ConfigurationHandler - 9 条偏移配置的读写
- TextParser -
at="topleft"的解析入口