Плавное появление изображение

53
0
Доброго времени суток. 
Собственно, сабж в названии. Каким образом можно реализовать плавное появление изображения?
 
Лучше сохранять время, когда анимация начинает идти, а после вычислять значение альфа-канала исходя из разницы между текущим и сохраненным временем.
Всякие тикеры будут привязаны к фпс, и в итоге везде анимация будет выглядеть по-разному.
Допустим:

Код:
long startTime;
onGuiOpened(...) {
  startTime = System.currentTimeMillis();
}

...
long deltaTime = System.currentTimeMillis() - startTime;
long animationDuration = 1000L; //появление за 1 секунду
double alphaMult = (deltaTime*1D)/(animationDuration*1D); //чтобы точно перевело в double
alphaMult = Math.max(0, Math.min(1, alphaMult)); //ограничиваем диапазон значений переменной от 0 до 1
GL11.glColor4d(1, 1, 1, alphaMult);
...
<отрисовка изображения>
 
Oldestkon написал(а):
Лучше сохранять время, когда анимация начинает идти, а после вычислять значение альфа-канала исходя из разницы между текущим и сохраненным временем.
Всякие тикеры будут привязаны к фпс, и в итоге везде анимация будет выглядеть по-разному.
Допустим:

Код:
long startTime;
onGuiOpened(...) {
  startTime = System.currentTimeMillis();
}

...
long deltaTime = System.currentTimeMillis() - startTime;
long animationDuration = 1000L; //появление за 1 секунду
double alphaMult = (deltaTime*1D)/(animationDuration*1D); //чтобы точно перевело в double
alphaMult = Math.max(0, Math.min(1, alphaMult)); //ограничиваем диапазон значений переменной от 0 до 1
GL11.glColor4d(1, 1, 1, alphaMult);
...
<отрисовка изображения>
Я явно делаю что-то не так >_>
У меня есть класс, наследующий GuiScreen. Вся отрисовка происходит в drawScreen. Собственно, там и начинаю отсчет (что уже неправильно, скорее всего). Попробовал создать метод onGuiOpened - обнаружил, что из нечто похожего в GuiScreen есть только onGuiClosed.
Код:
   public void drawScreen(int par1, int par2, float par3) {
       
       long startTime;
       startTime = System.currentTimeMillis();
       long deltaTime = System.currentTimeMillis() - startTime;
       long animationDuration = 1000L;
       double alphaMult = (deltaTime*1D)/(animationDuration*1D);
       alphaMult = Math.max(0, Math.min(1, alphaMult));
       
       GL11.glPushMatrix();
       this.bind(tost);
       GL11.glColor4d(1, 1, 1, alphaMult);
       ...
Другая гипотеза - это то, что таймер просто напросто не срабатывает/не изменяется и значение всегда 0.
P.S. В отрисовке проблем быть не может. Пробовал GL11.glColor4d(1, 1, 1, 0.5); - всё отлично.
 
Именно с логикой у тебя и проблемы.
Даже не смущает, что две переменные стоят рядом и получают одно и то же значение?
Если подставить числа, до тебя дойдет?

Код:
int k = 5;
int l = 5 - k;
"А ПОЧЕМУ l НОЛЬ?77";


И тебе правильно подсказали - используй инитГуи. Правда при ресайзе окна всё сбросится, так что либо заведи переменную триггер, либо засунь сие (startTime) в конструктор.
 
Смутило, но я понадеялся на магию ;D
Спасибо, все работает.
Теперь мне интересно, каким образом можно сделать плавное появление для кнопок и надписей? Надписи - менять прозрачность цвета, кнопки - комбинация варианта с изображением и прозрачностью цвета, правильно?

И заодно сразу другой вопрос - каким образом можно из переменной, которая постоянно обновляется, вытащить и зафиксировать ее значение при вызове определенного метода? Например, есть переменная num, у которой постоянно изменяется значение (1,2,3,4,5...n). При вызове lol() переменной fixnum задается значение num (например, 4) и не изменяется до следующего вызова lol(). Да, я умею объяснять.
 
Meowt написал(а):
И заодно сразу другой вопрос - каким образом можно из переменной, которая постоянно обновляется, вытащить и зафиксировать ее значение при вызове определенного метода? Например, есть переменная num, у которой постоянно изменяется значение (1,2,3,4,5...n). При вызове lol() переменной fixnum задается значение num (например, 4) и не изменяется до следующего вызова lol(). Да, я умею объяснять.
Как например нажимаешь кнопку и скажем переменной boolean num задается ture и при следующем нажатии (после отпускания (следующий вызов)) задается false?
[merge_posts_bbcode]Добавлено: 23.02.2015 20:41:18[/merge_posts_bbcode]

А вообще если я правильно понял это будет выглядеть так
Код:
    int num;
    int fixnum;
    
//тут мы изменяем num (для наглядности)
    public void numChange(int change)
    {
        num = change;
    }
    
    public void lol()
    {
        fixnum = num;
    }

[merge_posts_bbcode]Добавлено: 23.02.2015 20:42:45[/merge_posts_bbcode]

И при вызове lol() к fixnum будет приравниваться к num. В принципе это просто.
 
Нет, вообще мне нужно сравнивать фпс, но дело в том, что значение постоянно меняется. Нужно фиксировать в переменной значение фпс.
[merge_posts_bbcode]Добавлено: 24.02.2015 00:18:28[/merge_posts_bbcode]

Meowt написал(а):
Теперь мне интересно, каким образом можно сделать плавное появление для кнопок и надписей? Надписи - менять прозрачность цвета, кнопки - комбинация варианта с изображением и прозрачностью цвета, правильно?
Или можно как-то по-другому? На счет цвета понял только как прозрачность черного менять, для других цветов понятия не имею.
 
Назад
Сверху