Zoom(滚轮缩放)
基本信息
| 属性 | 值 |
|---|---|
| 类 | com.gtnewhorizons.angelica.zoom.Zoom |
| 路径 | src/main/java/com/gtnewhorizons/angelica/zoom/Zoom.java |
| 行数 | 121 |
| 目录 | zoom/ 共 2 个文件 |
| mixin | early/angelica/zoom/ 3 个 |
| 初始化 | ClientProxy.java:186-188,条件 AngelicaConfig.enableZoom |
全部常量(源码实值)
| 常量 | 值 | 行 |
|---|---|---|
ZOOM_MIN |
1.0F |
:18 |
ZOOM_MAX |
64.0F |
:19 |
ZOOM_STEP |
1.2F |
:20 |
ZOOM_DEFAULT |
4.0F |
:21 |
ZOOM_SMOOTH_SNAP_EPSILON |
0.001F |
:26 |
字段:
| 字段 | 初值 | 行 |
|---|---|---|
zoom |
ZOOM_DEFAULT(即 4.0) |
:24 |
currentZoom |
1.0F |
:29 |
zoomLerpLastNano |
0L |
:30 |
zoomEnabled |
false |
:35 |
zoomKey |
new KeyBinding("angelica.keybind.zoom", 0, KEY_CATEGORY) |
:33 |
注意 zoom 初值是 4.0(放大 4 倍),而 currentZoom 初值是 1.0(未缩放)。两者是「目标值」与「当前插值值」的关系。
缩放范围
| 方向 | 倍率 |
|---|---|
| 最小 | 1.0(不缩小) |
| 默认 | 4.0 |
| 最大 | 64.0 |
| 滚轮一格 | × 1.2 |
滚轮处理
:46-49:
public static void modifyZoom(int eventDWheel) {
if (eventDWheel == 0) return;
zoom = MathHelper.clamp_float(
(float) (zoom * Math.pow(ZOOM_STEP, Integer.signum(eventDWheel))),
ZOOM_MIN, ZOOM_MAX);
}
用 Math.pow(ZOOM_STEP, signum(dwheel)) 计算倍率:滚轮上滚(signum = 1)放大 1.2×,下滚(-1)缩小 1.2×(等效 1/1.2 ≈ 0.833×),最后 clamp_float 到 [1.0, 64.0]。
生命周期
| 方法 | 行 | 行为 |
|---|---|---|
init() |
:37-40 |
ClientRegistry.registerKeyBinding(zoomKey) + 把 new Zoom() 注册到 FML bus |
isZoomedIn() |
:42-44 |
返回 zoomEnabled |
modifyZoom(int) |
:46-49 |
见上 |
resetZoom() |
— | 由 ClientProxy.java:381 在打开任意 GUI 时调用(onGuiOpen,event.gui != null 时) |
resetZoom() 的触发点在 ClientProxy.onGuiOpen:
if (AngelicaConfig.enableZoom && event.gui != null) Zoom.resetZoom();
即打开任何界面(含背包、聊天、设置)都会强制复位缩放。源码注释写为「force reset zoom when a GUI is opened」。
平滑插值
zoom(目标)与 currentZoom(当前)分离,配合 zoomLerpLastNano 做时间插值;ZOOM_SMOOTH_SNAP_EPSILON = 0.001F 是判定「已足够接近目标、可直接吸附」的阈值。
平滑相关配置由 NotFine 的 Settings 枚举提供:ZOOM_SMOOTH、ZOOM_SMOOTH_SPEED(见 NotFine)。
IMouseFilterExt:鼠标过滤器的复位钩子(zoom/IMouseFilterExt.java,5 行)
zoom/ 共 2 个文件,本条目覆盖其 2 个中的第 2 个:
package com.gtnewhorizons.angelica.zoom; // :1
public interface IMouseFilterExt { // :3
void angelica$reset(); // :4
}
5 行,一个方法。⚠️ 与 StateAwareTessellator(见 客户端渲染服务)同一模式:angelica$ 前缀标注「这是 mixin 注入的方法,不是原版 API」。
IMouseFilter 是 1.7.10 原版接口(net.minecraft.client.MouseFilter),本接口是 Angelica 自己的扩展接口,由 mixin 实现。angelica$reset() 的调用方是 Zoom.resetZoom()——即上文「打开任何界面都会强制复位缩放」的机制里,除了复位 Zoom 自身的状态,还要通知鼠标过滤器复位。
⚠️ angelica$reset() 的实现方在本仓库的 mixin 侧(src/mixin/java,属 mixin/ 维度,不在本条目范围),本条目不可判定。⚠️ 本接口无 Javadoc、无 @FunctionalInterface、无默认实现。
已知问题:接口方法名带 angelica$ 前缀但接口名不带 —— 与 StateAwareTessellator 一致(接口名无前缀、方法名带前缀)。这是 Angelica 的统一约定,不是遗漏。
按键
1 个按键 angelica.keybind.zoom,默认键码 0(未绑定),分类 key.categories.angelica。见 KeyBinding 注册总表。
相关条目
- FpsReducer - 另一个可选的按需功能
- AngelicaModulesConfig -
enableZoom - KeyBinding 注册总表 -
angelica.keybind.zoom - Proxy -
init()与resetZoom()调用点 - NotFine -
ZOOM_SMOOTH/ZOOM_SMOOTH_SPEED选项 - 客户端渲染服务 -
StateAwareTessellator是同款「无前缀接口名 +angelica$方法名」约定的对照 - Angelica mixin 分组 -
IMouseFilterExt的实现方