текстура оверлей плохо отображается

Версия Minecraft
1.12.2
API
Forge
51
8
5
Привет, я делал интерфейс для своего мода и столкнулся с проблемой. Мой оверлей с красной стрелкой ужасно отображается поверх оверлея с приборами и тд, как мне это исправить? Причем без оверлея с приборами все нормально выглядит

Вот оверлей со стрелкой:

Java:
package net.mcreator.falloutarmor.gui.overlay;

import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraft.world.World;
import net.minecraft.util.ResourceLocation;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.Minecraft;
import org.lwjgl.opengl.GL11;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.IOException;
import net.mcreator.falloutarmor.ElementsFalloutArmorMod;

@ElementsFalloutArmorMod.ModElement.Tag
public class OverlayPadisplay extends ElementsFalloutArmorMod.ModElement {
    
    private static int radius = 20;
    private static boolean displayCircle = true;
    private static float[] arrowColor = {176.0F, 0.0F, 0.0F, 1.0F};
    private static int arrowWidth = 2;
    private static int arrowHeight = 19;
    private static int relativePosX = 3;
    private static int relativePosY = 19;
    private static float initialDegrees = 0;
    private static float maxRotationDegrees = 360;

    public OverlayPadisplay(ElementsFalloutArmorMod instance) {
        super(instance, 232);
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void init(FMLInitializationEvent event) {
        MinecraftForge.EVENT_BUS.register(new GUIRenderEventClass());
    }

    public static class GUIRenderEventClass {
        
        @SubscribeEvent(priority = EventPriority.LOWEST)
        @SideOnly(Side.CLIENT)
        public void eventHandler(RenderGameOverlayEvent event) {
            if (!event.isCancelable() && event.getType() == RenderGameOverlayEvent.ElementType.HELMET) {
                EntityPlayer entity = Minecraft.getMinecraft().player;
                if (entity != null) {
                    int posX = (event.getResolution().getScaledWidth() * relativePosX / 37);
                    int posY = (event.getResolution().getScaledHeight() * relativePosY / 22);
    
                    float health = entity.getHealth();
                    float maxHealth = entity.getMaxHealth();
                    float rotationDegrees = initialDegrees + ((maxHealth - health) / maxHealth) * (maxRotationDegrees - initialDegrees);
    
                    if (displayCircle) {
                        drawCircle(posX, posY, radius);
                    }
    
                    drawArrow(posX, posY, rotationDegrees);
                }
            }
        }

        private void drawCircle(int x, int y, int radius) {
            GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
            GL11.glBegin(GL11.GL_LINE_LOOP);
            for (int i = 0; i < 360; i++) {
                double angle = Math.toRadians(i);
                double dx = x + Math.cos(angle) * radius;
                double dy = y + Math.sin(angle) * radius;
                GL11.glVertex2d(dx, dy);
            }
            GL11.glEnd();
        }

        private void drawArrow(int x, int y, float rotationDegrees) {
            GlStateManager.pushMatrix();
            GlStateManager.translate(x, y, 0);
            GlStateManager.rotate(-rotationDegrees, 0.0F, 0.0F, 1.0F);
            GlStateManager.color(arrowColor[0], arrowColor[1], arrowColor[2], arrowColor[3]);

            int arrowOffsetX = -arrowWidth / 2;
            int arrowOffsetY = -arrowHeight;

            Minecraft.getMinecraft().ingameGUI.drawModalRectWithCustomSizedTexture(
                arrowOffsetX, arrowOffsetY, 0, 0, arrowWidth, arrowHeight, arrowWidth, arrowHeight
            );

            GlStateManager.popMatrix();
        }
    }
}
Вот оверлей с приборами:

Java:
package net.mcreator.falloutarmor.gui.overlay;

import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.client.event.RenderGameOverlayEvent;

import net.minecraft.world.World;
import net.minecraft.util.ResourceLocation;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.Minecraft;

import net.mcreator.falloutarmor.procedure.ProcedurePadisplayDisplayOverlayIngame;
import net.mcreator.falloutarmor.ElementsFalloutArmorMod;

import com.google.common.collect.ImmutableMap;

@ElementsFalloutArmorMod.ModElement.Tag
public class OverlayHpArrow extends ElementsFalloutArmorMod.ModElement {
    public OverlayHpArrow(ElementsFalloutArmorMod instance) {
        super(instance, 231);
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void init(FMLInitializationEvent event) {
        MinecraftForge.EVENT_BUS.register(new GUIRenderEventClass());
    }
    public static class GUIRenderEventClass {
        @SubscribeEvent(priority = EventPriority.LOW)
        @SideOnly(Side.CLIENT)
        public void eventHandler(RenderGameOverlayEvent event) {
            if (!event.isCancelable() && event.getType() == RenderGameOverlayEvent.ElementType.HELMET) {
                int posX = (event.getResolution().getScaledWidth()) / 2;
                int posY = (event.getResolution().getScaledHeight()) / 2;
                EntityPlayer entity = Minecraft.getMinecraft().player;
                World world = entity.world;
                int x = (int) entity.posX;
                int y = (int) entity.posY;
                int z = (int) entity.posZ;
                if (ProcedurePadisplayDisplayOverlayIngame.executeProcedure(ImmutableMap.of("entity", entity))) {
                    GlStateManager.disableDepth();
                    GlStateManager.depthMask(false);
                    GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA,
                            GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
                    GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
                    GlStateManager.disableAlpha();
                    Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation("fallout_armor:textures/pa_display.png"));
                    Minecraft.getMinecraft().ingameGUI.drawModalRectWithCustomSizedTexture(0, 0, 0, 0, event.getResolution().getScaledWidth(),
                            event.getResolution().getScaledHeight(), event.getResolution().getScaledWidth(), event.getResolution().getScaledHeight());
                    GlStateManager.depthMask(true);
                    GlStateManager.enableDepth();
                    GlStateManager.enableAlpha();
                    GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
                }
            }
        }
    }
}
 

Вложения

  • 1736534742992.png
    1736534742992.png
    903.3 KB · Просмотры: 18
  • image_2025-01-10_21-40-29.png
    image_2025-01-10_21-40-29.png
    700.5 KB · Просмотры: 17
Решение
А почему два ивента?
Предпологаю, проблема в z-наложении. Попробуй сместить стрелочку по z - GlStateManager.translate(0, 0, 1);.
я решил проблему, я добавил GlStateManager.pushMatrix(); и GlStateManager.disableTexture2D(); это гарантируют, что любые изменения, внесенные в состояние OpenGL, локализуются в этой операции рисования и не влияют на другие наложения. Вот как я это сделал:
Java:
package net.mcreator.falloutarmor.gui.overlay;

import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.event.FMLInitializationEvent...
А почему два ивента?
Предпологаю, проблема в z-наложении. Попробуй сместить стрелочку по z - GlStateManager.translate(0, 0, 1);.
я решил проблему, я добавил GlStateManager.pushMatrix(); и GlStateManager.disableTexture2D(); это гарантируют, что любые изменения, внесенные в состояние OpenGL, локализуются в этой операции рисования и не влияют на другие наложения. Вот как я это сделал:
Java:
package net.mcreator.falloutarmor.gui.overlay;

import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraft.world.World;
import net.minecraft.util.ResourceLocation;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.Minecraft;
import org.lwjgl.opengl.GL11;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.IOException;
import net.mcreator.falloutarmor.ElementsFalloutArmorMod;

@ElementsFalloutArmorMod.ModElement.Tag
public class OverlayPadisplay extends ElementsFalloutArmorMod.ModElement {

    private static int radius = 20;
    private static boolean displayCircle = true;
    private static float[] arrowColor = {176.0F, 0.0F, 0.0F, 1.0F};
    private static int arrowWidth = 2;
    private static int arrowHeight = 19;
    private static int relativePosX = 3;
    private static int relativePosY = 19;
    private static float initialDegrees = 0;
    private static float maxRotationDegrees = 360;

    public OverlayPadisplay(ElementsFalloutArmorMod instance) {
        super(instance, 232);
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void init(FMLInitializationEvent event) {
        MinecraftForge.EVENT_BUS.register(new GUIRenderEventClass());
    }

    public static class GUIRenderEventClass {

        @SubscribeEvent(priority = EventPriority.LOWEST)
        @SideOnly(Side.CLIENT)
        public void eventHandler(RenderGameOverlayEvent event) {
            if (!event.isCancelable() && event.getType() == RenderGameOverlayEvent.ElementType.HELMET) {
                EntityPlayer entity = Minecraft.getMinecraft().player;
                if (entity != null) {
                    int posX = (event.getResolution().getScaledWidth() * relativePosX / 37);
                    int posY = (event.getResolution().getScaledHeight() * relativePosY / 22);

                    float health = entity.getHealth();
                    float maxHealth = entity.getMaxHealth();
                    float rotationDegrees = initialDegrees + ((maxHealth - health) / maxHealth) * (maxRotationDegrees - initialDegrees);

                    GlStateManager.pushMatrix();
                    GlStateManager.disableTexture2D();

                    if (displayCircle) {
                        drawCircle(posX, posY, radius);
                    }

                    drawArrow(posX, posY, rotationDegrees);

                    GlStateManager.enableTexture2D();
                    GlStateManager.popMatrix();
                }
            }
        }

        private void drawCircle(int x, int y, int radius) {
            GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
            GL11.glBegin(GL11.GL_LINE_LOOP);
            for (int i = 0; i < 360; i++) {
                double angle = Math.toRadians(i);
                double dx = x + Math.cos(angle) * radius;
                double dy = y + Math.sin(angle) * radius;
                GL11.glVertex2d(dx, dy);
            }
            GL11.glEnd();
        }

        private void drawArrow(int x, int y, float rotationDegrees) {
            GlStateManager.pushMatrix();
            GlStateManager.translate(x, y, 0);
            GlStateManager.rotate(-rotationDegrees, 0.0F, 0.0F, 1.0F);
            GlStateManager.color(arrowColor[0], arrowColor[1], arrowColor[2], arrowColor[3]);

            int arrowOffsetX = -arrowWidth / 2;
            int arrowOffsetY = -arrowHeight;

            Minecraft.getMinecraft().ingameGUI.drawModalRectWithCustomSizedTexture(
                arrowOffsetX, arrowOffsetY, 0, 0, arrowWidth, arrowHeight, arrowWidth, arrowHeight
            );

            GlStateManager.popMatrix();
        }
    }
}
 

Вложения

  • 1736538895178.png
    1736538895178.png
    1.3 MB · Просмотры: 16
Назад
Сверху