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 注册总表。

相关条目