Мигающий экран

Версия Minecraft
1.7+
Здрасте. Кто нибудь знает как это было реализовано? Если да, то поясните...
 

timaxa007

Модератор
5,831
409
672
Не очень понятно, что конкретно было.
Возможно где был удар, был не закрыт эффект наложения цвета, что вышло это на UI экрана.
Ну или метод ренера не правильно обработал или шейдер плохо работал. Учитывая что текст и блоки были с наложением фиолетового цвета.
Только причём тут моддинг?
 

timaxa007

Модератор
5,831
409
672
Ну, если так...
Использовать эвент RenderGameOverlayEvent, рендерить тесселятором полигон на весь экран дать красный цвет, а дальше всё завит как ты хочешь.
Учитывая, что там хаотично идет изменение, то ... Нужно создать переменную объекта, в котором будет хранить через сколько тиков будет новое изменение и какая будет прозрачность.
А если имелось виду, типа кровь или Rage состояние, то просто при ударе будет накладываться тажа текстура с прозрачностью, но более прозрачной (пока не исчезнет) будет от времени, через какое время будет снят эффект.
И бла-бла-бла... Тут много, что можно написать, но вряд-ли без примера кода, вряд-ли будет, что-то понятно.
 
929
30
66
Слегка изменённый майновский drawRect
Java:
public static void drawRect(int p_73734_0_, int p_73734_1_, int p_73734_2_, int p_73734_3_, int p_73734_4_, float alpha) {
        int j1;

        if (p_73734_0_ < p_73734_2_)
        {
            j1 = p_73734_0_;
            p_73734_0_ = p_73734_2_;
            p_73734_2_ = j1;
        }

        if (p_73734_1_ < p_73734_3_)
        {
            j1 = p_73734_1_;
            p_73734_1_ = p_73734_3_;
            p_73734_3_ = j1;
        }

    //    float f3 = (float)(p_73734_4_ >> 24 & 255) / 255.0F;
        float f = (float)(p_73734_4_ >> 16 & 255) / 255.0F;
        float f1 = (float)(p_73734_4_ >> 8 & 255) / 255.0F;
        float f2 = (float)(p_73734_4_ & 255) / 255.0F;
        Tessellator tessellator = Tessellator.instance;
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glDisable(GL11.GL_TEXTURE_2D);
        OpenGlHelper.glBlendFunc(770, 771, 1, 0);
        GL11.glColor4f(f, f1, f2, alpha);
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV(0.0D, (double)p_73734_2_, -90.0D, 0.0D, 1.0D);
        tessellator.addVertexWithUV((double)p_73734_0_, (double)p_73734_2_, -90.0D, 1.0D, 1.0D);
        tessellator.addVertexWithUV((double)p_73734_0_, 0.0D, -90.0D, 1.0D, 0.0D);
        tessellator.addVertexWithUV(0.0D, 0.0D, -90.0D, 0.0D, 0.0D);
        tessellator.draw();
        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glDisable(GL11.GL_BLEND);

и пример вызова
Java:
private static int damageTime = 0;
private static float damageAlpha = 0;


@SubscribeEvent
    public void damagePlayer(LivingHurtEvent event) {
        if(event.entityLiving instanceof EntityPlayer) {
            damageTime = 40;
            damageAlpha = 1;
        }
    }
    
    @SubscribeEvent
    public void damageOverlay(RenderGameOverlayEvent.Post event) {
        switch(event.type) {
        case ALL:
            if(damageTime <= 0) return;
            int widht = event.resolution.getScaledWidth();
            int height = event.resolution.getScaledHeight();
            RenderUtils.drawRect(height, widht, widht, height, Integer.MIN_VALUE | AdditionalData.getColor(), damageAlpha);
        default:
            break;
        }
    }

В апдейте время убавляй и в зависимости от него уменьшай альфу, или как тебе нужно.
 
Сверху