Нормальная анимация

Версия Minecraft
1.12.2
476
9
39
Как я делаю это сейчас:
Тупо создаю счётчик из расчёта 20 выполненний метода drawScreen в секунду.(для оверлея сиё не работает ибо он иногда и под сотку в секунду отрисовывает оверлей при том даже ванильный).
В отрисовке изображения я тупо меняю координаты. Подставляю счётчик делю на 20 и высчитываю новые координаты -> пихаю новые координаты в метод отрисовки.

И всё бы ничего да:
a) мне кажется это не правильным, но гугл мне не особо помог

б) выполняет анимацию подлагивая первый раз или в иных ситуациях.

в) пытался в отдельный поток выпилить, да вот только draw выполняется 20 раз в секунду и миллиард потоков обеспечен. Это спорное утверждение, но всё же грузить ui он стал очень медленно, да и фпс разом до 5 просел, поэтому оно обоснованное. Плюс отдельный поток = своя жизнь. Куча нюансов. Но, если это правильный вариант, то фиг с ними.

г) Пытался через translate сделать, но чёт тоже по нулям. 

Собственно, вопрос есть ли нормальный способ запилить анимацию/отрисовку анимации?
 
Решение
Счетчик надо менять из тика клиента, в рендере желательно интерполировать все, что можно, завязав переменные на некий "прогресс анимации" (удобно, чтобы он был от 0 до 1) с помощью renderPartialTicks.
Код будет выглядеть как-то так:

Код:
private static float ANIMATION_TICKS = 20.0F; // длительность анимации
private int prevAnimationTicks;
private int animationTicks;

public void onTick() {
   prevAnimationTicks = animationTicks;
   animationTicks = (animationTicks + 1) % ANIMATION_TICKS; // зацикленная анимация
}

private float getInterpolatedProgress(float renderPartialTicks) {
   return prevAnimationTicks + (animationTicks - prevAnimationTicks) * renderPartialTicks; // конкретно в этом случае в скобках всегда 1.0, но это...
5,018
47
783
Первый вопрос - откуда ты берешь и как делаешь анимацию чего либо через json ?
 
476
9
39
Maxik001 написал(а):
Первый вопрос - откуда ты берешь и как делаешь анимацию чего либо через json ?

В ручную беру картинку/ки, да тупо двигаю картинку/меняю ежесекундно картинку. Последнее ещё не тестил из-за проблемы. Про json я вообще не слухом не духом для анимации гуихи.
А разве есть анимация через json для гуихи?
 
1,990
18
105
Счетчик надо менять из тика клиента, в рендере желательно интерполировать все, что можно, завязав переменные на некий "прогресс анимации" (удобно, чтобы он был от 0 до 1) с помощью renderPartialTicks.
Код будет выглядеть как-то так:

Код:
private static float ANIMATION_TICKS = 20.0F; // длительность анимации
private int prevAnimationTicks;
private int animationTicks;

public void onTick() {
   prevAnimationTicks = animationTicks;
   animationTicks = (animationTicks + 1) % ANIMATION_TICKS; // зацикленная анимация
}

private float getInterpolatedProgress(float renderPartialTicks) {
   return prevAnimationTicks + (animationTicks - prevAnimationTicks) * renderPartialTicks; // конкретно в этом случае в скобках всегда 1.0, но это универсальная формула, так что может быть полезно
}

public void render(float renderPartialTicks) {
   float arcDegree = Math.PI * 2.0F * (getInterpolatedProgress(renderPartialTicks) / ANIMATION_TICKS); 
   //... где-то используется arcDegree
}


UPD: В конце анимации цикла анимации, когда она запускается снова, вроде, будет кривая интерполяция, так что надо сбрасывать или что-то думать с prevAnimatedTicks.
 
2,505
81
397
talosdx написал(а):
из расчёта 20 выполненний метода drawScreen в секунду.
Эм. Ты же должен понимать, что у тебя не 20fps. А сделал такую ерунду.


На самом деле для gui анимаций удобнее делать lerp от currTick до currTick + 1, а затем разделить на макс продолжительность анимации. Таким образом, получишь процент жизни анимации.
 
476
9
39
Dahaka написал(а):
talosdx написал(а):
из расчёта 20 выполненний метода drawScreen в секунду.
Эм. Ты же должен понимать, что у тебя не 20fps. А сделал такую ерунду.


На самом деле для gui анимаций удобнее делать lerp от currTick до currTick + 1, а затем разделить на макс продолжительность анимации. Таким образом, получишь процент жизни анимации.



Ну я создал таймер который считал сколько раз в секунду метод выполненяется. Ииии только в RenderOverlay он показал иные значения. Ну суть я во всяком случае понял.
 
Сверху