You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过net.minecraft.client.font.TextRenderer修改模组菜单按钮文字大小?

解决ModMenu模组按钮文字大小修改的MatrixStack问题

问题核心

直接全局修改MatrixStack缩放会牵连按钮的碰撞盒、背景渲染等所有元素,导致画面错乱;且错误的矩阵操作时机/方式会破坏TextRenderer的渲染状态,引发异常。

正确实现方案

1. 定位按钮渲染逻辑

找到ModMenu中负责模组按钮渲染的类(通常是ModListEntry或同层级类),在其渲染方法中仅针对文字渲染环节做局部矩阵变换,不影响按钮其他元素。

2. 局部矩阵缩放的正确写法

在调用TextRenderer.draw()前后,通过push()/pop()隔离矩阵状态,避免污染后续渲染:

// 按钮渲染方法内的文字渲染片段
matrixStack.push(); // 保存当前矩阵状态
float textScale = 0.8f; // 自定义文字缩放比例
// 仅缩放XY轴,Z轴保持1.0避免深度渲染问题
matrixStack.scale(textScale, textScale, 1.0f);
// 注意:文字坐标需除以缩放比例,否则会偏离按钮位置
textRenderer.draw(matrixStack, modName, x / textScale, y / textScale, 0xFFFFFF);
matrixStack.pop(); // 恢复原矩阵,不影响按钮背景、边框等渲染

3. 异常规避要点

  • 必须保证push()和pop()成对出现,否则会导致矩阵栈失衡,抛出IllegalStateException。
  • 不要在按钮渲染的全局矩阵上直接缩放,只针对文字渲染做局部变换。
  • 若使用事件系统拦截渲染,需精准命中文字渲染阶段,而非整个按钮渲染流程。

4. 替代方案:静态修改字体大小

如果不需要动态调整,可通过替换TextRenderer的字体资源实现全局文字大小修改(需配合资源包配置):

// 示例:创建自定义字体的TextRenderer(适配Fabric/Forge环境)
TextRenderer customTextRenderer = new TextRenderer(
    client.getTextureManager(),
    client.getResourceManager(),
    client.getWindow().getScaleFactor(),
    false,
    false
);

常见错误排查

  • 画面错乱:检查是否误将缩放应用到了按钮的背景、边框渲染环节,需严格隔离文字渲染的矩阵操作。
  • 矩阵异常:核对push()与pop()的数量是否匹配,确保矩阵栈状态正确。

内容的提问来源于stack exchange,提问作者elinsanodemc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:55:18