Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов 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) Если используется версия Minecraft 1.8 до качаем prerelease версию отсюда
    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 их деобусцировали заранее, во всех версиях кодерпаков дабы не путаться.

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

    Dereku Старожил

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

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

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

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

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

    Dereku Старожил

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

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

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

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

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

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

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

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

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

    Dereku Старожил

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

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

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

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

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

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

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

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

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

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

    Баллы:
    76
    Skype:
    baldin20
    Имя в Minecraft:
    Nesten
    А не можешь скинуть код для 1.6.4[DOUBLEPOST=1407313680,1407310860][/DOUBLEPOST]а че с ползунками? [​IMG]
     
  17. Автор темы
    EvilEnginer

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

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

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

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

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

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

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

    Баллы:
    36
    Имя в Minecraft:
    thdomster94
    привет скинь код на 1.6.4
     
  21. Автор темы
    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);
                }
    и у тебя всё получится.
    Просто проследи логику. Тут всё просто.[DOUBLEPOST=1407320512,1407320357][/DOUBLEPOST]Выложил фикс ползунков. Жду идеи как сделать их ещё лучше.
     

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