1.12.2 hud渲染问题


你使用的IDE:IntelliJ IDEA
你使用的IDE版本: 2019.3.3
Forge版本: 2876
Minecraft版本: 1.12.2

错误情况简述
通过mc.ingameGUI.drawTexturedModalRect 加载的png图片会炸 会自动填缺口(透明像素)
图片

相关代码

package cc.kunss.basics.hud;

import cc.kunss.basics.BasicsLibrary;
import cc.kunss.basics.message.BasicsMessage;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.RenderGameOverlayEvent;

public class HealthHud extends AbstractHud{

    public ResourceLocation hud = new ResourceLocation(BasicsLibrary.MOD_ID, "textures/gui/bar.png");
    private double health = 20;
    private double maxHealth = 20;

    @Override
    public void handle(RenderGameOverlayEvent e, Minecraft mc) {
        if (e.getType().equals(RenderGameOverlayEvent.ElementType.ALL) && e.isCancelable()) {
            mc.getTextureManager().bindTexture(hud);
            int width = (int) ((health / maxHealth) * 200);
            mc.ingameGUI.drawTexturedModalRect(5, 5, 0, 0, 168, 55);
        }
        if ((e.getType().equals(RenderGameOverlayEvent.ElementType.EXPERIENCE) || e.getType().equals(RenderGameOverlayEvent.ElementType.FOOD) || e.getType().equals(RenderGameOverlayEvent.ElementType.HEALTH) || e.getType().equals(RenderGameOverlayEvent.ElementType.ARMOR)) && e.isCancelable()) {
            e.setCanceled(true);
        }
    }

    @Override
    public void update(BasicsMessage basicsMessage) {
        animation(this,new String[]{"health"},new double[]{health},new double[]{basicsMessage.getInt("health")},basicsMessage.getDouble("time"));
        this.maxHealth = basicsMessage.getInt("maxHealth");
    }

}


FledgeXu


什么叫做「炸图」?
请修改标题和问题描述。



已改
。。


FledgeXu


GL11.glEnableBlend

渲染完记得 disable

—Seraph JACK


FledgeXu


你的AbstractHud定义在哪里的?



Abstract是个抽象类。。。



package cc.kunss.basics.hud;

import cc.kunss.basics.message.BasicsMessage;
import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.RenderGameOverlayEvent;

import java.lang.reflect.Field;

public abstract class AbstractHud {

    public abstract void handle(RenderGameOverlayEvent event, Minecraft mc);

    public abstract void update(BasicsMessage basicsMessage);

    public void animation(Object o,String[] strings,double[] old,double[] ints,double time){
        for (int i = 0; i < strings.length; i++) {
            String string = strings[i];
            double value = ints[i];
            try {
                Field field = o.getClass().getDeclaredField(string);
                field.setAccessible(true);
                double oldValue = old[i];
                double result = value-oldValue;
                double sub = result/(time*100);
                new Thread(() -> {
                    try {
                        for(double ii = 0 ; ii < time ; ii +=0.01) {
                            //20 (8-20)/0.5/100 , 20+ -12/
                            double oa = (double) field.get(o);
                            field.set(o,oa+sub);
                            Thread.sleep(10);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }).start();
            }catch (Exception e){
                e.printStackTrace();
            }

        }
    }

}



有三种方法 还需要参数


FledgeXu


请提问的时候把代码贴全。


FledgeXu


请去Github搜索,别人是怎么写的,模仿着来。
另外提问前,也请去Github搜索类似代码。


FledgeXu


提问模版中的相关资料不是一个摆设。


Snownee


GlStateManager


system


该主题在最后一个回复创建后7天后自动关闭。不再允许新的回复。