• creepebucket

    我写的一个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的
    
    ![图片](https://cdn3.ldstatic.com/optimized/4X/4/2/a/42ac75866f86dd074612a07f3e042d352e017cef_2_690x374.jpeg)
    
    代码```
    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和编译器斗智斗勇了好半天
    主楼
  • a0yark

    终于不是吃白饭的蓝色大肥鱼了喵 ^-^

    #1
  • 坏天气要有好心情

    佬可以分享一下提示词么 我的怎么只会硬 ^-^

    #2
  • creepebucket

    没提示词 我就让他怎么好看怎么来 ^-^

    #3
  • 坏天气要有好心情

    图片

    #4
  • 风情

    这东西挺抽奖的,不过提示词解决大半,审美好的模型确实牛一点。

    #5

发表回复

登录后回复