Изменения HUD'a

Версия Minecraft
1.12.2
112
5
16
Добрый вечер , снова я. Здравствуйте.

Всё работает на силе божьей.


Java:
    @SubscribeEvent
    public void render(RenderGameOverlayEvent.Post event) {
        switch(event.getType()) {
        case ALL:{
            if(mc.player.isCreative() == false) {
            mc.getTextureManager().bindTexture(new ResourceLocation(Reference.MODID , "textures/items/hud_bar.png"));
            mc.ingameGUI.drawTexturedModalRect(0, 0,0, 0, 256,256);
            
            mc.getTextureManager().bindTexture(new ResourceLocation(Reference.MODID , "textures/items/hp_bar.png"));
            mc.ingameGUI.drawTexturedModalRect(0,0,0, 0, (int) (255*(mc.player.getHealth()/mc.player.getMaxHealth())),256);
            
            mc.getTextureManager().bindTexture(new ResourceLocation(Reference.MODID , "textures/items/food_bar.png"));
            mc.ingameGUI.drawTexturedModalRect(0,0,0, 0, 256*(mc.player.getFoodStats().getFoodLevel()/20),256);
            
            mc.getTextureManager().bindTexture(new ResourceLocation(Reference.MODID , "textures/items/hud_bar_og.png"));
            mc.ingameGUI.drawTexturedModalRect(0, 0,0, 0, 256,256);
            }
            
            break;
            }
        default:break;
        }
    }

4 слоя GUI.
У меня проблемы с полоской ХП и полоской Еды.

Полоска еды просто не отрисовывается( скорее всего проблемы с самой картинкой)

А вот полоска здоровья уменьшается и увеличивается не пропорционально , подскажет может кто ,в чем трабл?
Код:
  mc.getTextureManager().bindTexture(new ResourceLocation(Reference.MODID , "textures/items/hp_bar.png"));
            mc.ingameGUI.drawTexturedModalRect(0,0,0, 0, (int) (255*(mc.player.getHealth()/mc.player.getMaxHealth())),256);
Тут собственно формула по которой выщитывается всё
Безымянн13321321ый.png

Вот тут собственно видно, что она не пропорциональна
 
Решение
Скорее всего тут проблема во мне
Боюсь, что так.
но так и не нашел никаких формул или отрисовок
Печка, как прибавляться прогресс бар.
Та-же полоска хп или голода.
н уменьшается не пропорционально ,а какими-то кусками
Куски 256F * 1F / 20F = 12.8F -> 12 типа примерно по 12 пикселей будет твой кусок.
Не известна какой размер у тебя текстуры, но стандартно 256 на 256. Ты пытаешься отрисовать всю текстуру. Но где нарисовано может занимать около 70 на около 50 пикселей.

timaxa007

Модератор
5,831
409
672
255*(mc.player.getHealth()/mc.player.getMaxHealth())
Тут всё int, так-что не должно работать как ты хочешь.
20/20 = 1 | 19/20 = 0
Ты просто рендеришь разные текстуры. Но если текстуры имеют полу-прозрачность, то тут конечно могут и не быть полупрозрачными. Тут нужно будет использовать GL_BLEND и возможно другие способы. Как? Смотри в ванильный код, как там полу прозрачные текстуры вставляют.
mc.getTextureManager().bindTexture(new ResourceLocation(Reference.MODID , "textures/items/hp_bar.png"));
Надеюсь у кого-то хватит оперативной памяти вовремя все эти новые значения записывать.
 
112
5
16
Тут всего 4 текстуры , Самый BGшный BG это 2 полоски затемненные
полоска HP
Полоска еды
И Худ , обводка лежащая поверх всего этого дела.

Тут всё int, так-что не должно работать как ты хочешь.
20/20 = 1 | 19/20 = 0
Попробую костыль с умножением результата на 10)

Ты просто рендеришь разные текстуры. Но если текстуры имеют полу-прозрачность, то тут конечно могут и не быть полупрозрачными. Тут нужно будет использовать GL_BLEND и возможно другие способы. Как? Смотри в ванильный код, как там полу прозрачные текстуры вставляют
У меня нету Полупрозрачных текстур. 2 Статические + 2 "динамические".
Если бы можно было просто нарисовать прямоугольники прямо в коде ,было бы гораздо проще , наверное.


Надеюсь у кого-то хватит оперативной памяти вовремя все эти новые значения записывать.
Вынесу отдельные Resource Locationы за ивент.
 

timaxa007

Модератор
5,831
409
672
Попробую костыль с умножением результата на 10)
Нет, нужно int превратить в float или double.
Java:
p = (int)(((float)mc.thePlayer.getHealth() / (float)mc.thePlayer.getMaxHealth()) * 256F);
p = (int)(((float)mc.thePlayer.getFoodStats().getFoodLevel() / 20F) * 256F);
p = (int)(mc.thePlayer.experience * 256F);
Если бы можно было просто нарисовать прямоугольники прямо в коде ,было бы гораздо проще , наверное.
Что-то типа:
Java:
            GlStateManager.disableTexture2D();
            Gui.drawRect(1, 1, 48, 11, 0x9F7F7F7F);
            Gui.drawRect(50, 1, 150, 11, 0x9F7F7F7F);
            Gui.drawRect(1, 12, 48, 52, 0x9F000000);
            GlStateManager.enableTexture2D();
 
112
5
16
Безымянныadsadй.png
Код:
    @SubscribeEvent
    public void render(RenderGameOverlayEvent.Post event) {
         int w = event.getResolution().getScaledWidth();
         int h = event.getResolution().getScaledHeight();
        switch(event.getType()) {
        case ALL:{
            if(mc.player.isCreative() == false) {
            mc.getTextureManager().bindTexture(hud_bg);
            mc.ingameGUI.drawTexturedModalRect(0, 0,0, 0, 256,256);
            
            mc.getTextureManager().bindTexture(hp_bar);
            mc.ingameGUI.drawTexturedModalRect(0,0,0, 0, (int)( 256F * (float)mc.player.getHealth() /(float)mc.player.getMaxHealth() ),256);
            
            mc.getTextureManager().bindTexture(food_bar);
            mc.ingameGUI.drawTexturedModalRect(0,0,0, 0, (int)(((float)mc.player.getFoodStats().getFoodLevel() / 20F) * 256F),256);
            
            mc.getTextureManager().bindTexture(hud_og);
            mc.ingameGUI.drawTexturedModalRect(0, 0,0, 0, 256,256);
            }
            
            break;
            }
        default:break;
        }
    }
К сожалению... Не прокатило.
 

timaxa007

Модератор
5,831
409
672
К сожалению... Не прокатило.
Потому-что. ты не совсем понимаешь как работает drawTexturedModalRect и что нужно писать.
Типа у тебя слева есть текстура или типа того, учитывая что ты написал, тебе типа нужно отступить. Я не знаю у тебя размером или типа того
50F + (206F * ((float)mc.player.getHealth() /(float)mc.player.getMaxHealth()))
Может с жизнями прокатит, но с едой будет сложнее.
Тебе нужно использовать типа:
Java:
            p = (int)((mc.thePlayer.getHealth() / mc.thePlayer.getMaxHealth()) * 100F);
            drawGradientRect(50, 12, p, 12, 0x9FFF0000, 0x9F7F0000);
            drawGradientRect(50 + p, 12, 100 - p, 12, 0x9F7F0000, 0x9F000000);

            p = (int)((50F / 100F) * 100F);
            drawGradientRect(50, 12 + 14, p, 12, 0x9F0000FF, 0x9F00007F);
            drawGradientRect(50 + p, 12 + 14, 100 - p, 12, 0x9F00007F, 0x9F000000);

            p = (int)(((float)mc.thePlayer.getFoodStats().getFoodLevel() / 20F) * 100F);
            drawGradientRect(50, 12 + 28, p, 12, 0x9F00FF00, 0x9F007F00);
            drawGradientRect(50 + p, 12 + 28, 100 - p, 12, 0x9F007F00, 0x9F000000);

            p = (int)(mc.thePlayer.experience * 149F);
            drawGradientRect(1, 12 + 42, p, 12, 0x9F7F7FFF, 0x9F00007F);
            drawGradientRect(1 + p, 12 + 42, 149 - p, 12, 0x9F7F7F7F, 0x9F000000);
1594632356645.png
у меня пример для 1.7.10.
 
112
5
16
Потому-что. ты не совсем понимаешь как работает drawTexturedModalRect и что нужно писать.
Я попробовал разные виды записи этой переменной. И через флоты и даблы и инты и т.д.
Пробовал рисовать квадрат , но у него тоже очень странное поведение при изменении его размеров. Он уменьшается не пропорционально ,а какими-то кусками , может при 50 хп скакнуть вообще в противоположную сторону , а при 80 просто исчезнуть , что-то мне не понятное происходит с ними. Но в любом случае благодарен за помощь.
 
112
5
16
Может быть есть какой-нибудь более деликатный способ их отрисовывать.
За основу я взял RPG HUD mod ,там нормально отрисовывается полоска ХП и пропорции соблюдаются.
На гитхабе облазил этот мод с ног до головы, но так и не нашел никаких формул или отрисовок(Скорее всего тут проблема во мне)
 

timaxa007

Модератор
5,831
409
672
Скорее всего тут проблема во мне
Боюсь, что так.
но так и не нашел никаких формул или отрисовок
Печка, как прибавляться прогресс бар.
Та-же полоска хп или голода.
н уменьшается не пропорционально ,а какими-то кусками
Куски 256F * 1F / 20F = 12.8F -> 12 типа примерно по 12 пикселей будет твой кусок.
Не известна какой размер у тебя текстуры, но стандартно 256 на 256. Ты пытаешься отрисовать всю текстуру. Но где нарисовано может занимать около 70 на около 50 пикселей.
 
Сверху