Размер, количевство текстур на гуи

Samual

Каменная лига
Сообщения
268
Лучшие ответы
2
Симпатии
9
#1
Версия Minecraft
1.7.10
Подтверждение
Я максимально подробно описал проблему, включая исходный код файлов, краш лог, изображения и другую информацию, которая может помочь пользователям форума решить мой вопрос!
Мне Inti дал вот такие объяснения значений чисел в этом коде
Java:
drawTexturedModalRect(0, 0, 0, 0, 512, 512);
Аргументы: 0, 0, 0, 0, 320, 256.
0, 0 - координаты текстуры на экране,
0, 0 - координаты на текстуре,
512, 512 - размер "кусочка" текстуры.

(так как у меня текстура 512 на 512 пикс. то у меня отображается не кусок, а целая текстура)


Объясните пожалуйста что означают «координаты на текстуре» и на что они влияют.

И почему у меня текстура изображается два раза, вот
javaw 2019-02-11 18-57-44-933.jpg
 

lnti

Каменная лига
Сообщения
377
Лучшие ответы
5
Симпатии
18
#2
Ну смотри ,в данном случаее
1549902223733.png
0,0 это начальная точка картинки ,а 100,100 это размер кусочка который ты хочешь вставить
 

Samual

Каменная лига
Сообщения
268
Лучшие ответы
2
Симпатии
9
#6
Сорри, я не такой ещё программист, не знаю где рендер, но он наверное среди этого:
GuiContainerTutorial:
package merlin.seriousmodssthefe;
import org.lwjgl.opengl.GL11;

import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Container;
import net.minecraft.util.ResourceLocation;

/**
 * Created by JustAGod on 11.01.2018.
 */
public class GuiContainerTutorial extends GuiContainer {

    public GuiContainerTutorial(Container container) {
        super(container);

    }

    @Override
    protected void drawGuiContainerBackgroundLayer(float partialTick, int mouseX, int mouseY) {

    }
    //----
    private static final ResourceLocation TEXTURE = new ResourceLocation(Main.MODID, "textures/blocks/netricsa1.png");

    @Override
    public void drawScreen(int mouseX, int mouseY, float ticks) {
        int guiX = width / 2;
        int guiY = height / 2;
        mc.getTextureManager().bindTexture(TEXTURE);
        GL11.glColor4f(1, 1, 1, 1);
        drawDefaultBackground();
        drawTexturedModalRect(0, 0, 0, 0, 512, 512);
    }
    //------
    
}
TileGuiContainer:
package merlin.seriousmodssthefe;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;

/**
 * Created by JustAGod on 10.01.2018.
 */
public class TileGuiContainer extends TileEntity implements IInventory {

    /**
     * Наш инвентарь. По большому счету инвентарь это не более чем массив стаков не так ли?
     * Крутые перцы так не делают но мы пока не доросли.
     */
    private ItemStack[] inventory = new ItemStack[9];

    /**
     * Крутая инкапсуляция от майна. Метод который возвращает кол-во слотов.
     * @return кол-во слотов
     */
    @Override
    public int getSizeInventory() {
        return inventory.length;
    }

    /**
     * @param slot номер слота
     * @return что находиться в этом слоте
     */
    @Override
    public ItemStack getStackInSlot(int slot) {
        return inventory[slot];
    }

    /**
     * Уменьшает содержимое стака в слоте на заданное кол-во.
     * @param slot номер слота
     * @param count на сколько уменьшить слот
     * @return стак с предметом который лежал в слоте. NBT и мета соответствуют оригиналу, а размер стака
     * может быть меньше или равен параметру count. Если стака в слоте не было вернет null.
     */
    public ItemStack decrStackSize(int slot, int count) {
        if (this.inventory[slot] != null) { // Проверяем есть ли стак
            ItemStack stack;

            if (this.inventory[slot].stackSize <= count) { // Проверяем больше ли запрашиваемое уменьшение размера стака
                stack = this.inventory[slot]; // Берем стак
                this.inventory[slot] = null; // Обнуляем слот
                this.markDirty(); // Помечяем тайл грязным то есть говорим что пора бы его синхронизировать с клиентом
                return stack; // Возвращаем стэк
            } else {
                stack = this.inventory[slot].splitStack(count); // Отщипываем от стэка стэк

                if (this.inventory[slot].stackSize == 0) { // Если размер старого стака 0
                    this.inventory[slot] = null; // Обнуляем его
                }

                this.markDirty(); // Помечяем тайл грязным то есть говорим что пора бы его синхронизировать с клиентом
                return stack;
            }
        } else {
            return null; // Если нет то null
        }
    }

    /**
     * Эдакий костыль для контейнеров не привязаных к инвентарю тайла.-.
     * @param slot слот
     * @return стак в нем
     */
    public ItemStack getStackInSlotOnClosing(int slot) {
        if (this.inventory[slot] != null) {
            ItemStack itemstack = this.inventory[slot];
            this.inventory[slot] = null;
            return itemstack;
        } else {
            return null;
        }
    }

    /**
     * Просто присваивает новый стак заданому слоту
     * @param slot слот
     * @param stack новый стак
     */
    public void setInventorySlotContents(int slot, ItemStack stack) {
        inventory[slot] = stack;

        if (stack != null && stack.stackSize > this.getInventoryStackLimit()) {
            stack.stackSize = this.getInventoryStackLimit();
        }

        this.markDirty();
    }

    public String getInventoryName() {
        return null;
    }

    public boolean hasCustomInventoryName() {
        return false;
    }

    @Override
    public Packet getDescriptionPacket() {
        NBTTagCompound compound = new NBTTagCompound();
        writeToNBT(compound);
        return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, blockMetadata, compound);
    }

    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
        super.onDataPacket(net, pkt);
        readFromNBT(pkt.func_148857_g());
    }

    /**
     * Просто записываем инфу о тайле в нбт.
     * @param compound куда записать информацию
     */
    public void readFromNBT(NBTTagCompound compound) {
        super.readFromNBT(compound);
        NBTTagList tagList = compound.getTagList("Items", 10);
        this.inventory = new ItemStack[this.getSizeInventory()];


        for (int i = 0; i < tagList.tagCount(); ++i) {
            NBTTagCompound slot = tagList.getCompoundTagAt(i);
            int pos = slot.getByte("Slot");

            if (pos < this.inventory.length) {
                this.inventory[pos] = ItemStack.loadItemStackFromNBT(slot);
            }
        }
    }

    public void writeToNBT(NBTTagCompound compound) {
        super.writeToNBT(compound);
        NBTTagList nbttaglist = new NBTTagList();

        for (int i = 0; i < this.inventory.length; ++i) {
            if (this.inventory[i] != null) {
                NBTTagCompound slot = new NBTTagCompound();
                slot.setByte("Slot", (byte) i);
                this.inventory[i].writeToNBT(slot);
                nbttaglist.appendTag(slot);
            }
        }

        compound.setTag("Items", nbttaglist);

    }

    public int getInventoryStackLimit() {
        return 64;
    }

    public boolean isUseableByPlayer(EntityPlayer player) {
        return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) == this;
    }

    public void openInventory() {
    }

    public void closeInventory() {
    }

    /**
     * Смотрит подходит ли предмет для этого слота инвентаря. Пример броня для Стива.
     * Важно что стандартные слоты не учитывают этот метод.
     * @param slot слот
     * @param stack стак
     * @return валиден ли
     */
    public boolean isItemValidForSlot(int slot, ItemStack stack) {
        return true;
    }

}
ContainerTutorial:
package merlin.seriousmodssthefe;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;

/**
 * Created by JustAGod on 11.01.2018.
 */
public class ContainerTutorial extends Container {

    private final TileGuiContainer tile;

    public ContainerTutorial(TileGuiContainer tile) {
        this.tile = tile;
        
    }

    @Override
    public boolean canInteractWith(EntityPlayer player) {
        return true;
    }

    private static class RespectedSlot extends Slot {

        public RespectedSlot(IInventory inventory, int index, int posX, int posY) {
            super(inventory, index, posX, posY);
        }

        @Override
        public boolean isItemValid(ItemStack stack) {
            return inventory.isItemValidForSlot(getSlotIndex(), stack);
        }
    }
}
 

lnti

Каменная лига
Сообщения
377
Лучшие ответы
5
Симпатии
18
#7
С рендером все норм,хз почему у тебя 2 текстурки рендерятся ,может где-то есть класс который создает еще одно гуи
 

Samual

Каменная лига
Сообщения
268
Лучшие ответы
2
Симпатии
9
#8
CommandRepair:
package merlin.seriousmodssthefe;



import org.lwjgl.opengl.GL11;

import net.minecraft.client.Minecraft;
import net.minecraft.command.CommandBase;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.WrongUsageException;
import net.minecraft.entity.player.EntityPlayer;


public class CommandRepair extends CommandBase {
    
    public static final String NAME = "message1";
            public static final String USAGE = "/message1";
 
    @Override
    public String getCommandName() {
      
        return this.NAME;
    }

    @Override
    public String getCommandUsage(ICommandSender commandSender) {
      
        return this.USAGE;
    }
 
    @Override
    public void processCommand(ICommandSender commandSender, String[] args) {
      
        if (commandSender instanceof EntityPlayer) {
          
            if (args.length > 0) {
                                      
                throw new WrongUsageException(this.getCommandUsage(commandSender));
            }
          
            EntityPlayer player = this.getCommandSenderAsPlayer(commandSender);
                      
            player.openGui(Main.getInstance(), Main.TUT_GUI, player.worldObj, -1, -1, -1);
        
                    }
                }
            }


Этотже гуи можно вызвать и командой
 

Agravaine

Алмазная лига
Сообщения
4,256
Лучшие ответы
165
Симпатии
513
#10
Потому что если у тебя изображение 256х256, а ты указываешь размер в гуи 512х512, то у тебя будет повторяться текстура.
 
Сверху