Вверх ↑
Ответов: 335
#1: 2011-08-30 11:23:53 ЛС | профиль | цитата
В этом туториале я расскажу как редактировать меню в Minecraft
Редактировать само меню не сложно
к примеру мы будем редактировать меню GuiGameOver.java, как видно по названию, это меню вылезает после смерти персонажа

GuiGameOver.java

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode

package net.minecraft.src;

import java.util.List;
import net.minecraft.client.Minecraft;
import org.lwjgl.opengl.GL11;

// Referenced classes of package net.minecraft.src:
// GuiScreen, GuiButton, EntityPlayerSP, GuiMainMenu

public class GuiGameOver extends GuiScreen
{


public GuiGameOver()
{
}

public void initGui()
{
controlList.clear();
controlList.add(new GuiButton(1, width / 2 - 100, height / 4 + 72, "Respawn"));
controlList.add(new GuiButton(2, width / 2 - 100, height / 4 + 96, "Title menu"));
if(mc.session == null)
{
((GuiButton)controlList.get(1)).enabled = false;
}
}

protected void keyTyped(char c, int i)
{
}

protected void actionPerformed(GuiButton guibutton)
{
if(guibutton.id != 0);

if(guibutton.id == 1)
{
mc.thePlayer.respawnPlayer();
mc.displayGuiScreen(null);
}

if(guibutton.id == 2)
{
mc.changeWorld1(null);
mc.displayGuiScreen(new GuiMainMenu());
}


}

public void drawScreen(int i, int j, float f)
{
drawGradientRect(0, 0, width, height, 0x60500000, 0xa0803030);
GL11.glPushMatrix();
GL11.glScalef(2.0F, 2.0F, 2.0F);
drawCenteredString(fontRenderer, "Game over!", width / 2 / 2, 30, 0xffffff);
GL11.glPopMatrix();
drawCenteredString(fontRenderer, (new StringBuilder()).append("Score: &e").append(mc.thePlayer.getScore()).toString(), width / 2, 100, 0xffffff);
super.drawScreen(i, j, f);
}

public boolean doesGuiPauseGame()
{
return false;
}
}


Рассмотрим эту часть кода


    public void initGui()

{
controlList.clear();
controlList.add(new GuiButton(1, width / 2 - 100, height / 4 + 72, "Respawn"));
controlList.add(new GuiButton(2, width / 2 - 100, height / 4 + 96, "Title menu"));
if(mc.session == null)
{
((GuiButton)controlList.get(1)).enabled = false;
}
}

В ней идет отрисовка кнопок
controlList.add(new GuiButton(1, width / 2 - 100, height / 4 + 72, "Respawn"));  

controlList.add - добавление нового элемента меню

new GuiButton - сдесь задается сам контроллер, как сделать свой, я расскажу чуть позже

(1, width / 2 - 100, height / 4 + 72, "Respawn") - первый параметр, отвечает за идентификатор, для чего он,расскажу чуть позже, второй положение по ширине, третий,положение по высоте, четвертый название


Рассмотрим следущую часть кода

    protected void actionPerformed(GuiButton guibutton)

{
if(guibutton.id != 0);

if(guibutton.id == 1)
{
mc.thePlayer.respawnPlayer();
mc.displayGuiScreen(null);
}

if(guibutton.id == 2)
{
mc.changeWorld1(null);
mc.displayGuiScreen(new GuiMainMenu());
}


}
В ней проверяется, нажата ли кнопка, проверяется по идентификатору,который мы задали в кнопке


if(guibutton.id == 1) - проверка нажата ли кнопка


{
mc.thePlayer.respawnPlayer();
mc.displayGuiScreen(null);
}

Действия после нажатия кнопки.

Рассмотрим третью часть кода

    public void drawScreen(int i, int j, float f)

{
drawGradientRect(0, 0, width, height, 0x60500000, 0xa0803030);
GL11.glPushMatrix();
GL11.glScalef(2.0F, 2.0F, 2.0F);
drawCenteredString(fontRenderer, "Game over!", width / 2 / 2, 30, 0xffffff);
GL11.glPopMatrix();
drawCenteredString(fontRenderer, (new StringBuilder()).append("Score:&e").append
(mc.thePlayer.getScore()).toString(), width / 2, 100, 0xffffff);
super.drawScreen(i, j, f);
}
Сдесь я думаю все понятно
отрисовка красного экрана, надпись Game Ower

==================================================
Теперь сделаем свою кнопку, так как размер указывается в её коде, но можно его и переделать

Рассмотрим код кнопки
GuiButton.java

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode

package net.minecraft.src;

import net.minecraft.client.Minecraft;
import org.lwjgl.opengl.GL11;

// Referenced classes of package net.minecraft.src:
// Gui, RenderEngine

public class GuiButton extends Gui
{

public GuiButton(int i, int j, int k, String s)
{
this(i, j, k, 200, 20, s);
}

public GuiButton(int i, int j, int k, int l, int i1, String s)
{
width = 200;
height = 20;
enabled = true;
enabled2 = true;
id = i;
xPosition = j;
yPosition = k;
width = l;
height = i1;
displayString = s;
}

protected int getHoverState(boolean flag)
{
byte byte0 = 1;
if(!enabled)
{
byte0 = 0;
} else
if(flag)
{
byte0 = 2;
}
return byte0;
}

public void drawButton(Minecraft minecraft, int i, int j)
{
if(!enabled2)
{
return;
}
FontRenderer fontrenderer = minecraft.fontRenderer;
GL11.glBindTexture(3553 /*GL_TEXTURE_2D*/, minecraft.renderEngine.getTexture("/gui/gui.png"));
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
boolean flag = i >= xPosition && j >= yPosition && i < xPosition + width && j < yPosition + height;
int k = getHoverState(flag);
drawTexturedModalRect(xPosition, yPosition, 0, 46 + k * 20, width / 2, height);
drawTexturedModalRect(xPosition + width / 2, yPosition, 200 - width / 2, 46 + k * 20, width / 2, height);
mouseDragged(minecraft, i, j);
if(!enabled)
{
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xffa0a0a0);
} else
if(flag)
{
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xffffa0);
} else
{
drawCenteredString(fontrenderer, displayString, xPosition + width / 2, yPosition + (height - 8) / 2, 0xe0e0e0);
}
}

protected void mouseDragged(Minecraft minecraft, int i, int j)
{
}

public void mouseReleased(int i, int j)
{
}

public boolean mousePressed(Minecraft minecraft, int i, int j)
{
return enabled && i >= xPosition && j >= yPosition && i < xPosition + width && j < yPosition + height;
}

protected int width;
protected int height;
public int xPosition;
public int yPosition;
public String displayString;
public int id;
public boolean enabled;
public boolean enabled2;
}
Сдесь мы видим большой и сложный код, тут нам нужно только пару параметров,

    public GuiButton(int i, int j, int k, int l, int i1, String s)

{
width = 200;
height = 20;
enabled = true;
enabled2 = true;
id = i;
xPosition = j;
yPosition = k;
width = l;
height = i1;
displayString = s;
}
а именно width = 200; height = 20;, как вы поняли это ширина и высота кнопок, можно настроить их, но мы создадим новую кнопку, ширину и высоту которой можно настроить,сделаем её на основе кода
GuiSmallButton.java

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode

package net.minecraft.src;


// Referenced classes of package net.minecraft.src:
// GuiButton, EnumOptions

public class GuiSmallButton extends GuiButton
{

public GuiSmallButton(int i, int j, int k, String s)
{
this(i, j, k, null, s);
}

public GuiSmallButton(int i, int j, int k, int l, int i1, String s)
{
super(i, j, k, l, i1, s);
enumOptions = null;
}

public GuiSmallButton(int i, int j, int k, EnumOptions enumoptions, String s)
{
super(i, j, k, 120, 20, s);
enumOptions = enumoptions;
}

public EnumOptions returnEnumOptions()
{
return enumOptions;
}

private final EnumOptions enumOptions;
}

Создадим файл с названием guibuttonmy.java
и впишем в него такой код
guibuttonmy.java

package net.minecraft.src;

public class guibuttonmy extends GuiButton
{

public guibuttonmy(int i, int j, int k, String s, int h, int w)
{
this(i, j, k, null, s, h, w);
}

public guibuttonmy(int i, int j, int k, int l, int i1, String s)
{
super(i, j, k, l, i1, s);
enumOptions = null;
}

public guibuttonmy(int i, int j, int k, EnumOptions enumoptions, String s, int h, int w)
{
super(i, j, k, h, w, s);
enumOptions = enumoptions;
}

public EnumOptions returnEnumOptions()
{
return enumOptions;
}

private final EnumOptions enumOptions;
}
Сдесь все названия GuiSmallButton меняем на guibuttonmy
и изменяем параметры параметры

 public guibuttonmy(int i, int j, int k, String s, int h, int w)

{
this(i, j, k, null, s, h, w);
}

 public guibuttonmy(int i, int j, int k, EnumOptions enumoptions, String s, int h, int w) 

{
super(i, j, k, h, w, s);
enumOptions = enumoptions;
}



Все, кнопка готова, теперь добавим её в нашу менюшку

new menu

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) braces deadcode

package net.minecraft.src;

import java.util.List;
import net.minecraft.client.Minecraft;
import org.lwjgl.opengl.GL11;

// Referenced classes of package net.minecraft.src:
// GuiScreen, GuiButton, EntityPlayerSP, GuiMainMenu

public class GuiGameOver extends GuiScreen
{


public GuiGameOver()
{
}

public void initGui()
{
controlList.clear();
controlList.add(new GuiButton(1, width / 2 - 100, height / 4 + 72, "Respawn"));
controlList.add(new GuiButton(2, width / 2 - 100, height / 4 + 96, "Title menu"));
controlList.add(new guibuttonmy(3, width / 2 - 100, height / 4 + 120, "Title menu 2",120,20));
if(mc.session == null)
{
((GuiButton)controlList.get(1)).enabled = false;
}
}

protected void keyTyped(char c, int i)
{
}

protected void actionPerformed(GuiButton guibutton)
{
if(guibutton.id != 0);

if(guibutton.id == 1)
{
mc.thePlayer.respawnPlayer();
mc.displayGuiScreen(null);
}

if(guibutton.id == 2)
{
mc.changeWorld1(null);
mc.displayGuiScreen(new GuiMainMenu());
}

if(guibutton.id == 3)
{
mc.changeWorld1(null);
mc.displayGuiScreen(new GuiMainMenu());
}

}

public void drawScreen(int i, int j, float f)
{
drawGradientRect(0, 0, width, height, 0x60500000, 0xa0803030);
GL11.glPushMatrix();
GL11.glScalef(2.0F, 2.0F, 2.0F);
drawCenteredString(fontRenderer, "Game over!", width / 2 / 2, 30, 0xffffff);
GL11.glPopMatrix();
drawCenteredString(fontRenderer, (new StringBuilder()).append("Score: &e").append(mc.thePlayer.getScore()).toString(), width / 2, 100, 0xffffff);
super.drawScreen(i, j, f);
}

public boolean doesGuiPauseGame()
{
return false;
}
}
Думаю на основе всего сказанного, вы поймете что тут изменилось

Результат

Удачи вам

В следующем уроке я расскажу как сделать свое меню


карма: 0
3
Голосовали:petrocan, buter, Marts