1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Туториал [1.7.10-1.8] [Vanilla + Forge] Minecraft Coder Pack. Как сделать красивые прозрачные кнопки.

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем EvilEnginer, 29 июн 2014.

  1. Автор темы
    EvilEnginer

    EvilEnginer Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    EvilEnginer
    Эта модификация совместима с Optifine и BetterFonts на версии 1.7.10, и с Optifine на версии 1.8 скриншоты в конце темы. :good:
    Здравствуйте господа в этом гайде я вам расскажу как сделать красивые прозрачные кнопки как на скриншотах. Кнопки становятся такими в главном меню игры, паузы, выбора сервера, одиночной игры и в настройках. Цвет текста при наведении мыши на кнопку может быть абсолютно любым, а так же можно регулировать прозрачность кнопки до и после наведения мыши на неё и толщину границы.

    Итак начнём:
    Предисловие: Если вы не любите ванильный MCP, то можете использовать ForgeGradle :nerd:. Как ставить ForgeGradle я учить не буду - гугл научит.
    Пункт I. Установка кодерпака (ванильная версия Minecraft).
    1) Скачиваем Minecraft Coder Pack для Minecraft 1.7.10
    2) Скачиваем Eclipse отсюда
    3) Распаковываем скачанный архив c кодерпаком в любую папку запускаем скрипт decompile.bat
    Перед запуском скрипта decompile.bat убедитесь что у вас скачан и установлен лицензионный minecraft в папку
    C:\Users\[ваше имя пользователя Windows]\AppData\Roaming\.minecraft
    В имени пользователя НЕ ДОЛЖНО быть русских букв.
    4) Как декомпиляция завершится запускаем Eclipse, а в качестве рабочей области указываем папку Eclipse из архива с кодерпаком. Всё, кодер пак уставлен.
    Пункт II. Кодинг.
    a) Делаем кнопки прозрачными

    1) В Eclipse в Proejct Explorer ищем пакет net.minecraft.client.gui из него открываем файл GuiButton.java
    2) Едем вниз и видим метод public void drawButton. Заменяем этот метод целиком на этот
    Код:
    public void drawButton(Minecraft mc, int mouseX, int mouseY)
        {
            if (this.visible)
            {
                FontRenderer var4 = mc.fontRendererObj;
                mc.getTextureManager().bindTexture(buttonTextures);
                GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
                boolean flag = mouseX >= this.xPosition && mouseY >= this.yPosition && mouseX < this.xPosition + this.width && mouseY < this.yPosition + this.height; //Flag, tells if your mouse is hovering the button
                int var5 = this.getHoverState(this.hovered);
                GlStateManager.enableBlend();
                GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
                GlStateManager.blendFunc(770, 771);
                if (flag) // Mouse hovering button
                {
                    drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000); //Here 0x(some numbers and letters) Html color code - google it
                    this.drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 0x00FF00);
                }
                else //Mouse not hovering button
                {
                    drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, 0x60000000);
                    drawCenteredString(var4, displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 0xFFCCCC);
                }
                this.mouseDragged(mc, mouseX, mouseY);
            }
        }
    Код:
    public void drawButton(Minecraft mc, int mx, int my)
    {
      if (this.visible)
      {
      GL11.glColor4f(1F, 1F, 1F, 1F);
      boolean changed = mx >= this.xPosition && my >= this.yPosition && mx < this.xPosition + this.width && my < this.yPosition + this.height;
      GL11.glEnable(GL11.GL_BLEND);
      OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0);
      int color = changed ? 0x90000000 : 0x60000000; // changed;not_changed
      this.drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, color);
      color = this.enabled ? (changed ? 0x00FF00 : 0xFFCCCC) : 0xFF0000; // changed;not_changed;not_enabled
      this.drawCenteredString(mc.fontRenderer, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, color);
      this.mouseDragged(mc, mx, my);
      }
    }
    Код:
    public void drawButton(Minecraft mc, int mx, int my)
    {
      if (this.visible)
      {
      GL11.glColor4f(1F, 1F, 1F, 1F);
      boolean changed = mx >= this.xPosition && my >= this.yPosition && mx < this.xPosition + this.width && my < this.yPosition + this.height;
      GL11.glEnable(GL11.GL_BLEND);
      OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0);
      int color = changed ? 0x90000000 : 0x60000000; // changed;not_changed
      this.drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, color);
      color = this.enabled ? (changed ? 0x00FF00 : 0xFFCCCC) : 0xFF0000; // changed;not_changed;not_enabled
      this.drawCenteredString(mc.fontRenderer, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, color);
      this.mouseDragged(mc, mx, my);
      }
    }
    и сохраняем результат... Видим ошибку метод drawBorderedRect не определён.
    3) Открываем файл Gui.java из этого же пакета после строки 16 вставляем следующий код
    Код:
    public void drawBorderedRect(int x, int y, int x1, int y1, int size, int borderC, int insideC)
    {
    drawRect(x + size, y + size, x1 - size, y1 - size, insideC);
    drawRect(x + size, y + size, x1, y, borderC);
    drawRect(x, y, x + size, y1 - 1, borderC);
    drawRect(x1, y1 - 1, x1 - size, y + size, borderC);
    drawRect(x, y1 - size, x1, y1, borderC);
    }
    ошибки нет :) запускаем нашу работу и любуемся результатом.
    4) Поясняю как изменить цвет текста при наведении мыши на кнопку и прозрачность.
    Блок Код (Text). Файл GuiButton.java. Коды цветов HTML
    Рассмотрим случай - мышь наведена на кнопку.
    Строка 15 из блока с кодом параметр 0x90FFFFFF - толщина границы. 0x90000000 - прозрачность.
    Строка 16 параметр 0x00FF00 цвет текста в данном случае зелёный.
    Если мышь не наведена на кнопку
    То аналогично строки 20 и 21 отвечают за начальный вид кнопки

    б) Двигаем кнопки влево и рисуем прямоугольник.
    1)
    Для того, чтобы нарисовать прямоугольник с градиентом, ищем метод drawScreen в файле GuiMainMenu.java и вставляем после Tessellator var4 = Tessellator.instance код
    Код:
    drawRect(0, 1000, 155, 0, Integer.MIN_VALUE);
    this.drawGradientRect(0, 0, this.width, this.height, -2130706433, 16777215);
    this.drawGradientRect(0, 0, this.width, this.height, 0, Integer.MIN_VALUE);
    2) Чтобы сделать расположение кнопок таким же как на скриншоте ищем метод addSingleplayerMultiplayerButtons в файле GuiMainMenu.java удаляем его и заменяем на этот:
    Код:
    private void addSingleplayerMultiplayerButtons(int p_73969_1_, int p_73969_2_)
        {
            this.buttonList.add(new GuiButton(1, this.width / - 200 + 15, p_73969_1_ - 30, 130, 20, I18n.format("menu.singleplayer", new Object[0])));
            this.buttonList.add(new GuiButton(2, this.width / -200 + 15, p_73969_1_ - 5 , 130, 20, I18n.format("menu.multiplayer", new Object[0])));
            this.buttonList.add(this.field_175372_K = new GuiButton(14, this.width / - 200 + 15, p_73969_1_ + 20, 130, 20, I18n.format("menu.online", new Object[0])));
        }
    Код:
    private void addSingleplayerMultiplayerButtons(int var3, int p_73969_2_)
        {
            this.buttonList.add(new GuiButton(1, this.width / - 200 + 15, var3 - 30, 130, 20, I18n.format("menu.singleplayer", new Object[0])));
            this.buttonList.add(new GuiButton(2, this.width / -200 + 15, var3 - 5 , 130, 20, I18n.format("menu.multiplayer", new Object[0])));
            this.buttonList.add(new GuiButton(6, this.width / - 200 + 15, var3 + 20, 130, 20, I18n.format("Mods", new Object[0])));
        }
    Ищём код выше
    this.buttonList.add(..."menu.options"...);
    this.buttonList.add(..."menu.quit"...);
    и заменяем его на этот
    Код:
    this.buttonList.add(new GuiButton(0, this.width / - 200 + 15, var3 + 45, 130, 20, I18n.format("menu.options", new Object[0])));
    this.buttonList.add(new GuiButton(4, this.width / - 200 + 15, var3 + 70, 130, 20, I18n.format("menu.quit", new Object[0])));
    Код:
    this.buttonList.add(new GuiButton(0, this.width / -200 + 15, i + 45, 130, 20, I18n.format("menu.options", new Object[0])));
    this.buttonList.add(new GuiButton(4, this.width / -200 + 15, i + 70, 130, 20, I18n.format("menu.quit", new Object[0])));
    

    в) Делаем слайдер в опциях и в музыке красивым (fix oт gamerforEA):
    1) Открываем GuiOptionsSlider.java из пакета net/minecraft/client/gui
    2) Ищем this.drawTexturedModalRect этих строк ровно две в этом файле
    3) Комментируем их и заменяем на эту:
    Код:
    this.drawBorderedRect(this.xPosition + (int)(this.sliderValue * (float)(this.width - 8)), this.yPosition, this.xPosition + (int)(this.sliderValue * (float)(this.width - 8)) + 8, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000);
    Код:
    this.drawBorderedRect(this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)), this.yPosition, this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)) + 8, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000);
    4) Открываем GuiScreenOptionsSounds.java из пакета net/minecraft/client/gui
    5) Ищем this.drawTexturedModalRect этих строк ровно две в этом файле
    6) Комментируем их и заменяем на эту:
    Код:
    this.drawBorderedRect(this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)), this.yPosition, this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)) + 8, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000);
    Код:
    this.drawBorderedRect(this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)), this.yPosition, this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)) + 8, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000);

    г) Фикс кнопки "блокировать сложность" от MrGiperCreeper


    д) И напоследок...
    Демонстрация работоспособности на лицензии на версии 1.7.10 с Minecraft Forge, Optifine, и Better Fonts и на версии 1.8 с Optifine.
    [​IMG]

    [​IMG]

    Для того чтобы получилось так же как у меня используйте этот гайд от skoniks
    Там всё по аналогии.
    По поводу различных версий Майна. Для Vanilla например тут:
    Код:
    if (flag) // Mouse hovering button
                {
                    drawBorderedRect(this.field_146128_h, this.field_146129_i, this.field_146128_h + this.field_146120_f, this.field_146129_i + this.field_146121_g, 1, 0x90FFFFFF, 0x90000000); //Here 0x(some numbers and letters) Html color code - google it
                    this.drawCenteredString(var4, this.displayString, this.field_146128_h + this.field_146120_f / 2, this.field_146129_i + (this.field_146121_g - 8) / 2, 0x00FF00);
                }
                else //Mouse not hovering button
                {
                    drawBorderedRect(this.field_146128_h, this.field_146129_i, this.field_146128_h + this.field_146120_f, this.field_146129_i + this.field_146121_g, 1, 0x90FFFFFF, 0x60000000);
                    drawCenteredString(var4, displayString, this.field_146128_h + this.field_146120_f / 2, this.field_146129_i + (this.field_146121_g - 8) / 2, 0xFFCCCC);
                }
                this.mouseDragged(mc, mx, my);
    код может различаться лишь переменными, this.field_146128_h например. В свою очередь, код для Minecraft Forge одинаковый. Так как разрабочики Forge их деобусцировали заранее, во всех версиях кодерпаков дабы не путаться.

    Собственно вот и всё. Прошу вас поставить мне лойс если этот гайд оказался для вас полезным :).
     
    Последнее редактирование: 11 авг 2017
  2. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Уже было.
     
  3. Автор темы
    EvilEnginer

    EvilEnginer Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    EvilEnginer
    Да было, но старая тема потеряла свою актуальность, плюс там было куча недоработок, поэтому я создал новую.
     
    Последнее редактирование: 2 июл 2014
  4. thdomster94

    thdomster94 Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    thdomster94
    У меня вопрос,можно ли такое сделать в minecraft 1.6.4?
     
  5. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Можно.
     
  6. thdomster94

    thdomster94 Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    thdomster94
    Подскажите как?
     
  7. WCRAFT

    WCRAFT Старожил Пользователь

    Баллы:
    173
    Skype:
    worldplaytv
    Имя в Minecraft:
    World
    Руками.
    Попробуйте данный метод и на этой версии, я не уверен что там что-то изменилось в плане кнопок.
    А вообще можно самому сделать прозрачность просто редактируя gui.png.
     
  8. EnjoyMan

    EnjoyMan Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    EnjoyMan
    Скинь пожалуйста готовый .class, отвечающий за шрифт.
     
  9. Автор темы
    EvilEnginer

    EvilEnginer Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    EvilEnginer
    Этот фикс глючный для русского шрифта, не работает цветной текст и я, пока что, не придумал как поправить это, поэтому скидывать полуфабрикат своего рода я не буду.
     
  10. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    BetterFonts. Profit.
     
  11. Alexandr-1322

    Alexandr-1322 Активный участник Пользователь

    Баллы:
    78
    Skype:
    hod-dog15
    Вот так вот получилось
    [​IMG]
     
  12. skoniks

    skoniks Активный участник Пользователь

    Баллы:
    78
    Skype:
    skolya16
    Имя в Minecraft:
    skoniks
    а какой код для 1.7.2
     
  13. ApaDoctor

    ApaDoctor Старожил Пользователь

    Баллы:
    103
    такой же
     
  14. Автор темы
    EvilEnginer

    EvilEnginer Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    EvilEnginer
    Добавил пояснение как отличается код в различных версиях майна, дабы было меньше вопросов.
     
  15. Navion

    Navion Активный участник Пользователь

    Баллы:
    76
    А не можешь скинуть код для 1.6.4
    а че с ползунками? [​IMG]
     
  16. Автор темы
    EvilEnginer

    EvilEnginer Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    EvilEnginer
    Думал долго как пофиксить. Пока не придумал.
     
  17. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Можно в качестве ползунков рендерить небольшие прозрачные прямоугольники.
     
  18. Автор темы
    EvilEnginer

    EvilEnginer Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    EvilEnginer
    Нашёл код отвечающий за ползунок сейчас исправлю проблему).
     
  19. thdomster94

    thdomster94 Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    thdomster94
    привет скинь код на 1.6.4
     
  20. Автор темы
    EvilEnginer

    EvilEnginer Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    EvilEnginer
    Привет. Кода на 1.6.4 у меня нет. Похимичь с переменными с этим флагом
    Код:
    boolean flag = mx >= this.xPosition && my >= this.yPosition && mx < this.xPosition + this.width && my < this.yPosition + this.height; 
    и в этом блоке
    Код:
    if (flag) // Mouse hovering button
                {
                    drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000); //Here 0x(some numbers and letters) Html color code - google it
                    this.drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 0x00FF00);
                }
                else //Mouse not hovering button
                {
                    drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, 0x60000000);
                    drawCenteredString(var4, displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 0xFFCCCC);
                }
    и у тебя всё получится.
    Просто проследи логику. Тут всё просто.
    Выложил фикс ползунков. Жду идеи как сделать их ещё лучше.
     

Поделиться этой страницей