- creepebucket2026-08-1163551
我写的一个mc模组需要一个ui, 我就让大肥鱼试试写的怎么样 眩晕瘫坐了

代码```
package org.creepebucket.programmable_magic.gui.machines.buffer;import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import org.creepebucket.programmable_magic.gui.lib.api.DynamicValue;
import org.creepebucket.programmable_magic.gui.lib.widgets.*;
import org.creepebucket.programmable_magic.gui.machines.api.MachineScreen;
import org.creepebucket.programmable_magic.gui.machines.api.MachineWidgets;
import org.creepebucket.programmable_magic.utils.ModColors;import java.util.List;
import static net.minecraft.network.chat.Component.literal;
import static org.creepebucket.programmable_magic.gui.lib.api.Coordinate.*;
import static org.creepebucket.programmable_magic.gui.lib.api.ThemeTemplate.*;public class ManaBufferScreen extends MachineScreen<ManaBufferMenu> {
public ManaBufferScreen(ManaBufferMenu menu, Inventory playerInv, Component title) {
super(menu, playerInv, title);
}@Override
public void buildWidget() {
super.buildWidget();root.mainColor(ModColors.MAIN_COLOR_M);
var dividerColor = root.mainColor().withAlpha(0x3f);// ================= 魔力存储窗口 ================= //
var storageWindow = addWidget(new MachineWidgets.InformationWindowWidget(fromCenter(-90, -75), fromTopLeft(280, 150), literal("魔力存储"), 0, 0));
storageWindow.addChild(new TextWidget(fromTopLeft(7, 18), literal("总当前存储 / J")).applyTheme(LABEL_TEXT));
storageWindow.addChild(new NumberDisplayWidget(fromTopLeft(7, 29), DynamicValue.fromSupplier(() ->
menu.radiationStorageJ.get() + menu.temperatureStorageJ.get() + menu.momentumStorageJ.get() + menu.pressureStorageJ.get()), 7, 1, true).mainColor(-1));
storageWindow.addChild(new TextWidget(fromTopRight(-7, 18), literal("总缓存上限 / J")).rightAlign().applyTheme(LABEL_TEXT));
storageWindow.addChild(new NumberDisplayWidget(fromTopRight(-7, 29), DynamicValue.fromSupplier(() ->
menu.radiationCacheJ.get() + menu.temperatureCacheJ.get() + menu.momentumCacheJ.get() + menu.pressureCacheJ.get()), 7, 1, true).rightAlign().mainColor(-1));storageWindow.addChild(new RectangleWidget(fromTopLeft(7, 42), custom(1, -14, 0, 1)).mainColor(dividerColor));
var names = List.of(literal("辐射"), literal("温度"), literal("动量"), literal("压力"));
var colors = List.of(ModColors.MAIN_COLOR_R, ModColors.MAIN_COLOR_T, ModColors.MAIN_COLOR_M, ModColors.MAIN_COLOR_P);
var currents = List.of(menu.radiationStorageJ, menu.temperatureStorageJ, menu.momentumStorageJ, menu.pressureStorageJ);
var caches = List.of(menu.radiationCacheJ, menu.temperatureCacheJ, menu.momentumCacheJ, menu.pressureCacheJ);
for (int i = 0; i < 4; i++) {
int y = 48 + i * 16;
storageWindow.addChild(new RectangleWidget(fromTopLeft(7, y + 1), fromTopLeft(2, 8)).mainColor(colors.get(i)));
storageWindow.addChild(new TextWidget(fromTopLeft(13, y), names.get(i)).applyTheme(GENERAL_TEXT));
storageWindow.addChild(new ProgressBarWidget(fromTopLeft(45, y), custom(1, -52, 0, 9), currents.get(i), caches.get(i)).mainColor(colors.get(i)).bgColor(colors.get(i).withAlpha(0x1f)));
}storageWindow.addChild(new RectangleWidget(fromTopLeft(7, 110), custom(1, -14, 0, 1)).mainColor(dividerColor));
storageWindow.addChild(new TextWidget(fromTopLeft(7, 118), literal("基础存储 / J")).applyTheme(LABEL_TEXT));
storageWindow.addChild(new NumberDisplayWidget(fromTopLeft(7, 128), menu.baseStorage, 6, 1, true).mainColor(-1));
storageWindow.addChild(new TextWidget(fromCenterTop(0, 118), literal("基础扩容量 / J")).applyTheme(LABEL_TEXT));
storageWindow.addChild(new NumberDisplayWidget(fromCenterTop(0, 128), menu.baseExpansion, 6, 1, true).centerAlign().mainColor(-1));
storageWindow.addChild(new TextWidget(fromTopRight(-7, 118), literal("扩容功率 / W")).rightAlign().applyTheme(LABEL_TEXT));
storageWindow.addChild(new NumberDisplayWidget(fromTopRight(-7, 128), menu.baseExpansionPower, 6, 1, true).rightAlign().mainColor(-1));// ================= 充能窗口 ================= //
var chargeWindow = addWidget(new MachineWidgets.InformationWindowWidget(fromCenter(160, -70), fromTopLeft(180, 135), literal("充能"), 0, 0));
chargeWindow.addChild(new TextWidget(fromTopLeft(7, 18), literal("充能槽位")).applyTheme(LABEL_TEXT));
int slotCount = menu.slots.size() - 36;
int slotsW = slotCount * 20 - 4;
int slotsX = (180 - slotsW) / 2;
for (int i = 0; i < slotCount; i++) {
chargeWindow.addChild(new OutlineWidget(fromTopLeft(slotsX + i * 20, 29), fromTopLeft(16, 16)).mainColor(0x1fffffff));
chargeWindow.addChild(new SlotWidget(menu.slots.get(36 + i), fromTopLeft(slotsX + i * 20, 29)));
}chargeWindow.addChild(new RectangleWidget(fromTopLeft(7, 52), custom(1, -14, 0, 1)).mainColor(dividerColor));
chargeWindow.addChild(new TextWidget(fromTopLeft(7, 60), literal("充能功率 / W")).applyTheme(LABEL_TEXT));
chargeWindow.addChild(new NumberDisplayWidget(fromTopLeft(7, 71), DynamicValue.fromSupplier(() -> menu.maxChargePower.get() * menu.powerFact.get()), 7, 1, true).mainColor(-1));
chargeWindow.addChild(new TextWidget(fromTopRight(-7, 60), literal("扩容功率 / W")).rightAlign().applyTheme(LABEL_TEXT));
chargeWindow.addChild(new NumberDisplayWidget(fromTopRight(-7, 71), DynamicValue.fromSupplier(() -> menu.baseExpansionPower.get() * menu.powerFact.get()), 7, 1, true).rightAlign().mainColor(-1));chargeWindow.addChild(new RectangleWidget(fromTopLeft(7, 88), custom(1, -14, 0, 1)).mainColor(dividerColor));
chargeWindow.addChild(new TextWidget(fromTopLeft(7, 96), literal("超频倍率")).applyTheme(GENERAL_TEXT));
chargeWindow.addChild(new NumberDisplayWidget(fromTopLeft(44, 92), menu.powerFact, 4, 1.5, true).mainColor(-1));
for (int i = 1; i < 5; i++) {
chargeWindow.addChild(new TextWidget(custom((double) i / 5, (int) Math.floor(-14 * (double) i / 5 + 7), 1, -13), literal(String.valueOf(i))).scaled(0.5).centerAlign().applyTheme(DIM_TEXT));
}
chargeWindow.addChild(new TextWidget(custom(0, 7, 1, -13), literal("0")).scaled(0.5).applyTheme(DIM_TEXT));
chargeWindow.addChild(new TextWidget(custom(1, -6, 1, -13), literal("5")).scaled(0.5).rightAlign().applyTheme(DIM_TEXT));
chargeWindow.addChild(new ThinSlideBarWidget(fromBottomLeft(7, -9), custom(1, -14, 0, 5), 0, 5, menu.powerFact).step(0.05).bgColor(-1));// ================= 机器控制窗口 ================= //
addWidget(new MachineWidgets.MachineControlWindow(fromCenter(160, 85), fromTopLeft(180, 40), menu));
}
}4pro的  代码``` package org.creepebucket.programmable_magic.gui.machines.buffer; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import org.creepebucket.programmable_magic.gui.lib.api.Coordinate; import org.creepebucket.programmable_magic.gui.lib.api.DynamicValue; import org.creepebucket.programmable_magic.gui.lib.api.Widget; import org.creepebucket.programmable_magic.gui.lib.api.widgets.Lifecycle; import org.creepebucket.programmable_magic.gui.lib.api.widgets.Renderable; import org.creepebucket.programmable_magic.gui.lib.widgets.*; import org.creepebucket.programmable_magic.gui.machines.api.MachineScreen; import org.creepebucket.programmable_magic.gui.machines.api.MachineWidgets; import org.creepebucket.programmable_magic.utils.ModColors; import static net.minecraft.network.chat.Component.literal; import static org.creepebucket.programmable_magic.gui.lib.api.Coordinate.*; import static org.creepebucket.programmable_magic.gui.lib.api.ThemeTemplate.GENERAL_TEXT; import static org.creepebucket.programmable_magic.gui.lib.api.ThemeTemplate.LABEL_TEXT; public class ManaBufferScreen extends MachineScreen<ManaBufferMenu> { public ManaBufferScreen(ManaBufferMenu menu, Inventory playerInv, Component title) { super(menu, playerInv, title); } @Override public void buildWidget() { super.buildWidget(); root.mainColor(ModColors.MAIN_COLOR_T); addWidget(new RectangleWidget(fromTopLeft(0, 0), fromBottomRight(0, 0)) .mainColor(0x7f000000)); var titleWidget = new TextWidget(fromCenterTop(0, 12), literal("魔力缓冲器")) .scaled(2.2).noShadow().mainColor(-1); addWidget(titleWidget.centerAlign()); var powerSwitch = new SwitchWidget(fromTopRight(-56, 12), fromTopLeft(50, 19), literal("关闭"), literal("开启"), menu.enabled) .onSwitch(enabled -> menu.powerSwitch.trigger(enabled)); addWidget(powerSwitch.rightAlign().mainColor(-1)); buildManaWindow(); buildParamWindow(); buildSlotWindow(); buildInventoryWindow(); } private void buildManaWindow() { addWidget(new MachineWidgets.InformationWindowWidget(fromTopLeft(8, 40), fromTopLeft(240, 260), literal("魔力网络"), 200, 200) { @Override public void onInitialize() { super.onInitialize(); String[] names = {"辐射", "温度", "动量", "压力"}; int[] colors = { ModColors.MAIN_COLOR_R.toArgb(), ModColors.MAIN_COLOR_T.toArgb(), ModColors.MAIN_COLOR_M.toArgb(), ModColors.MAIN_COLOR_P.toArgb()}; addManaRow(this, 0, names[0], colors[0], menu.radiationStorageJ, menu.radiationCacheJ, menu.radiationPowerW); addManaRow(this, 1, names[1], colors[1], menu.temperatureStorageJ, menu.temperatureCacheJ, menu.temperaturePowerW); addManaRow(this, 2, names[2], colors[2], menu.momentumStorageJ, menu.momentumCacheJ, menu.momentumPowerW); addManaRow(this, 3, names[3], colors[3], menu.pressureStorageJ, menu.pressureCacheJ, menu.pressurePowerW); } }); } private void addManaRow(Widget panel, int idx, String name, int color, DynamicValue<Double> storage, DynamicValue<Double> cache, DynamicValue<Double> power) { int rowY = 16 + idx * 62; panel.addChild(new RectangleWidget(fromTopLeft(4, rowY + 2), fromTopLeft(3, 44)) .mainColor(color)); panel.addChild(new TextWidget(fromTopLeft(11, rowY + 4), literal(name)) .noShadow().mainColor(0xffbfbfbf)); panel.addChild(new NumberDisplayWidget(fromTopLeft(11, rowY + 16), storage, 7, 1, true).mainColor(-1)); panel.addChild(new TextWidget(fromTopLeft(54, rowY + 17), literal("J")) .applyTheme(GENERAL_TEXT)); panel.addChild(new ProgressBarWidget( fromTopLeft(11, rowY + 28), fromTopRight(-50, 8), storage, cache) .mainColor(color) .bgColor(0x0f000000 | (color & 0x00ffffff))); panel.addChild(new NumberDisplayWidget(fromTopRight(-48, rowY + 16), power, 6, 1, true).rightAlign().mainColor(-1)); panel.addChild(new TextWidget(fromTopRight(-12, rowY + 17), literal("W")) .rightAlign().applyTheme(GENERAL_TEXT)); } private void buildParamWindow() { addWidget(new MachineWidgets.InformationWindowWidget(fromTopLeft(254, 40), fromTopLeft(238, 188), literal("机器参数"), 150, 120) { @Override public void onInitialize() { super.onInitialize(); addParamRow(this, 0, "基础储量", menu.baseStorage, ""); addParamRow(this, 1, "基础扩张", menu.baseExpansion, ""); addParamRow(this, 2, "扩张功率", menu.baseExpansionPower, " W"); addParamRow(this, 3, "最大充电功率", menu.maxChargePower, " W"); int powerRowY = 16 + 4 * 22; addChild(new TextWidget(fromTopLeft(7, powerRowY), literal("功率因子")) .applyTheme(LABEL_TEXT)); addChild(new NumberDisplayWidget(fromTopLeft(7, powerRowY + 11), menu.powerFact, 4, 1.1, true).mainColor(-1)); menu.powerFact.whenFirstDataArrivesDo(() -> addChild( new ThinSlideBarWidget(fromTopLeft(40, powerRowY + 11), fromTopRight(-14, 7), 0, 4, menu.powerFact) .step(0.05).mainColor(-1).bgColor(-1))); int countRowY = powerRowY + 22; addChild(new TextWidget(fromTopLeft(7, countRowY), literal("充电槽数")) .applyTheme(LABEL_TEXT)); addChild(new NumberDisplayWidget(fromTopLeft(7, countRowY + 11), DynamicValue.fromSupplier(() -> (double) menu.chargeSlotCount.get()), 3, 1.1, true).mainColor(-1)); } }); } private void addParamRow(Widget panel, int idx, String label, DynamicValue<Double> value, String unit) { int rowY = 16 + idx * 22; panel.addChild(new TextWidget(fromTopLeft(7, rowY), literal(label)) .applyTheme(LABEL_TEXT)); panel.addChild(new NumberDisplayWidget(fromTopLeft(7, rowY + 11), value, 7, 1, true).mainColor(-1)); if (!unit.isEmpty()) panel.addChild(new TextWidget(fromTopLeft(50, rowY + 12), literal(unit)).noShadow().mainColor(-1)); } private void buildSlotWindow() { addWidget(new MachineWidgets.InformationWindowWidget(fromTopLeft(254, 234), fromTopLeft(238, 100), literal("充电槽"), 150, 60) { @Override public void onInitialize() { super.onInitialize(); var slots = menu.slots; int startIdx = 36; int cols = 7; for (int i = startIdx; i < slots.size(); i++) { int idx = i - startIdx; int col = idx % cols; int row = idx / cols; int x = 16 + col * 19; int y = 18 + row * 19; addChild(new RectangleWidget( fromTopLeft(x - 1, y - 1), fromTopLeft(18, 18)) .mainColor(0x1fffffff)); addChild(new SlotWidget(slots.get(i), fromTopLeft(x, y))); } } }); } private void buildInventoryWindow() { addWidget(new MachineWidgets.InventoryWindow(fromTopLeft(8, 306), fromTopLeft(240, 88))); } public static class Panel extends Widget implements Lifecycle, Renderable { public Component title; public Panel(Coordinate pos, Coordinate size, Component title) { super(pos, size); this.title = title; } @Override public void onInitialize() { addChild(new RectangleWidget(fromTopLeft(0, 0), fromTopRight(0, 11)) .mainColor(0xbf000000)); addChild(new TextWidget(fromTopLeft(7, 2), title).applyTheme(LABEL_TEXT)); addChild(new RectangleWidget(fromTopLeft(0, 11), fromBottomRight(0, -11)) .mainColor(0x3f000000)); } @Override public void render(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTick) { graphics.outline(left(), top(), w(), h(), 0x7fffffff); } } } ```我说无论是在输出质量上 代码质量上都是无敌了 而且4flash一次过的编译, 4pro和编译器斗智斗勇了好半天主楼 - a0yark2026-08-1116149
终于不是吃白饭的蓝色大肥鱼了喵 ^-^
- 坏天气要有好心情2026-08-1124142
佬可以分享一下提示词么 我的怎么只会硬 ^-^
- creepebucket2026-08-1163551
没提示词 我就让他怎么好看怎么来 ^-^
- 坏天气要有好心情2026-08-1124142
- 风情2026-08-1114908
这东西挺抽奖的,不过提示词解决大半,审美好的模型确实牛一点。
