Сдвигать элемент каждые X тиков

Версия Minecraft
1.10.2
Хотелось  бы узнать, как сделать так, чтобы:​
  1. Был вызван метод moveSlot
  2. Метод начинает двигать опр. слот на 100 пикселей по X
  3. Каждые пять тиков, допустим, на 2 пикселя, пока не наберётся сто.
 
Решение
FedorAronov написал(а):
Код:
static int ticks = 0;
@SubscribeEvent
public void onClientTick(TickEvent.ClientTickEvent event) {
    ticks++;
    if (ticks > 99) {
        MainClass.logger.info("5 секунд прошло!");
        ticks = 0;
    }
}
Так?
И что вписать в главный класс мода?
Почитай про events.
Ccылка (Это старый тутор)
Ссылка (Это новый)
216
6
19
FedorAronov написал(а):
Хотелось  бы узнать, как сделать так, чтобы:​
  1. Был вызван метод moveSlot
  2. Метод начинает двигать опр. слот на 100 пикселей по X
  3. Каждые пять тиков, допустим, на 2 пикселя, пока не наберётся сто.

Код:
Random rand = new Random();
//В одной секунде 20 тиков -> 100 тиков = 5 сек
if(rand.nextInt(100) == 0) {
  if(posX != 100) {
     posX += 2;
  }
}

Думаю интегрировать в свой код ты сможешь.
 
Onneros написал(а):
Agravaine написал(а):
Рандом-то зачем? Лучше уж таймер.

Вполне. Можно и таймер

Я что-то не въезжаю. У Forge вроде бы есть понятие TickHandler, а конкретно мне нужно клиентские тики 
Код:
TickEvent.ClientTickEvent
 
Agravaine написал(а):
Делаешь переменную-таймер.
Каждый тик увеличиваешь ее на 1.
Потом делаешь проверку if(timer % кол-во_тиков == 0) и увеличиваешь в нем свою позицию.

Мне как раз и не понятно, как увеличивать переменную каждый тик.
 
586
1
2
FedorAronov написал(а):
Код:
static int ticks = 0;
@SubscribeEvent
public void onClientTick(TickEvent.ClientTickEvent event) {
    ticks++;
    if (ticks > 99) {
        MainClass.logger.info("5 секунд прошло!");
        ticks = 0;
    }
}
Так?
И что вписать в главный класс мода?
Почитай про events.
Ccылка (Это старый тутор)
Ссылка (Это новый)
 
398
4
7
Я бы не стал привязывать это к клиентским тикам.
Целесообразнее в каком-нибудь drawScreen на основе Minecraft.getSystemTime() сделать.

В методе moveSlot записать текущее время, а в drawScreen вычислять прошедшее время и соответственно смещать слот. Только не забудь в drawScreen вызвать родительский метод - super.drawScreen(.....);
 
С тиками я разобрался, просто немного неправильно регистрировал.
Теперь другая проблема. GUI (с инвентарём) отображается своим центром в левом углу экрана.
Предпологаемый ошибочный код:
Код:
public ЭтотGui(IInventory playerInv, BlockTileEntityЭтогоБлока te) {
	super(new ПрилагающийсяContainer(playerInv, te));
	this.playerInv = playerInv;
	this.te = te;
	this.xSize = 176;
        this.ySize = 166;
        this.guiTop = (height - ySize) / 2;
        this.guiLeft = (width -xSize) / 2;
}

@Override
protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
	this.mc.renderEngine.bindTexture(new ResourceLocation(МойmodId,"textures/gui/GuiBackground.png"));
	GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
        this.drawTexturedModalRect(this.guiLeft , this.guiTop, 0, 0, xSize, ySize);
}
Элементы внутри GUI отображаются как надо.
 
216
6
19
FedorAronov написал(а):
С тиками я разобрался, просто немного неправильно регистрировал.
Теперь другая проблема. GUI (с инвентарём) отображается своим центром в левом углу экрана.
Предпологаемый ошибочный код:
Код:
public ЭтотGui(IInventory playerInv, BlockTileEntityЭтогоБлока te) {
	super(new ПрилагающийсяContainer(playerInv, te));
	this.playerInv = playerInv;
	this.te = te;
	this.xSize = 176;
        this.ySize = 166;
        this.guiTop = (height - ySize) / 2;
        this.guiLeft = (width -xSize) / 2;
}

@Override
protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
	this.mc.renderEngine.bindTexture(new ResourceLocation(МойmodId,"textures/gui/GuiBackground.png"));
	GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
        this.drawTexturedModalRect(this.guiLeft , this.guiTop, 0, 0, xSize, ySize);
}
Элементы внутри GUI отображаются как надо.

Код:
this.guiTop = (height / 2) - ySize;
this.guiLeft = (width / 2) - xSize;
Проверь это, у тебя просто ошибка в расчетах, не?
 
Onneros написал(а):
FedorAronov написал(а):
С тиками я разобрался, просто немного неправильно регистрировал.
Теперь другая проблема. GUI (с инвентарём) отображается своим центром в левом углу экрана.
Предпологаемый ошибочный код:
Код:
public ЭтотGui(IInventory playerInv, BlockTileEntityЭтогоБлока te) {
	super(new ПрилагающийсяContainer(playerInv, te));
	this.playerInv = playerInv;
	this.te = te;
	this.xSize = 176;
        this.ySize = 166;
        this.guiTop = (height - ySize) / 2;
        this.guiLeft = (width -xSize) / 2;
}

@Override
protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
	this.mc.renderEngine.bindTexture(new ResourceLocation(МойmodId,"textures/gui/GuiBackground.png"));
	GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
        this.drawTexturedModalRect(this.guiLeft , this.guiTop, 0, 0, xSize, ySize);
}
Элементы внутри GUI отображаются как надо.

Код:
this.guiTop = (height / 2) - ySize;
this.guiLeft = (width / 2) - xSize;
Проверь это, у тебя просто ошибка в расчетах, не?
Код:
this.guiTop = (height / 2) - ySize;
this.guiLeft = (width / 2) - xSize;

Так я вообще не вижу GUI. Скорее всего, он где-то за экраном :D
 
Сверху