PDA

Просмотр полной версии : про изинг


greep
12.01.2015, 17:58
Всем привет. Решил прицепить вместо большой либы, себе в проект, маленькую изинговую функцию. Например такую

easeOutQuad = function(t, b, c, d) {
return -c *(t/=d)*(t-2) + b;
}

Где:

t - первая итерация
d - конечная
b - начальная точка
с - конечная точка

Например я хочу программно двигать мувиклип из точки х = 50 в точку х= 310. В течении 50 кадров. Получается у меня такой вот код:

if (t<=d) {
mc._x = easeOutQuart(t, 50, 310, d);

}else{
d=0;
}
t++;

}else{
mc._x = easeOutQuart(t, 50, 310, d);
myEasingStatus = false;
}

Все прекрасно работает пока начальная точка больше нуля, а конечная точка больше начальной. Но если мне нужно двигать мувиклип из точки х=200 в точку х=-200 тут почему-то казалось бы стандартная изинговая формула не арбайтен.

Но если не много ее доработать...

easeOutQuad = function(t, b, c, d) {
var b2 = b;
var c2 = c;
if(b > c){
b = c2;
c = c2-b2;
}
return -c *(t/=d)*(t-2) + b;
}

то по крайней мере из точки 400 можно анимировать в точку 100...

Задачка собственно состоит в том, чтобы можно было бы использовать все эти многочисленные изинговые функции и многочисленных фреймворков типа jqwery и прочих библиотек универсально. Просто добавляешь функцию к себе и вставляешь любые значения, типа из х=0 в х=500 или из х=100 в х=-200 или х=1 в х=0 и т.д.

помогите пожалуйста разобраться как этого можно достичь. большое спасибо заранее, бьюсь второй день...

dark256
13.01.2015, 01:43
Зачем изобретать велосипед?
https://greensock.com/tweennano-as

Привес к коду около 4 килобайт...

greep
13.01.2015, 13:44
2 dark256: Спасибо большое за библиотеку. У меня тоже есть, правда чуть больше весят. Все дело в том, что если ты делаешь баннер, вес которого по техническим требованиям не должен превышать 25 кб, а клиент хочет полнометражный анимационный фильм на заданную тему, с детализированной графикой и спецэффектами, 3 кб это очень много... Даже если пропускать swf-ку через оптимайзер...

ЗЫ. Сорри, нижний кусок кода был по ошибке вставлен другой.

Суть в общем в том, чтобы дописать универсальный кусок, которым можно было бы дополнить любую изинговую функцию и получить результат.

Посмотрел вашу библиотеку, нашел там все те же формулы:

return 1 - Math.pow(2, -10 * p);

Это формула из expoOut.

В классе все выглядит так:

package com.greensock.easing {
final public class ExpoOut extends Ease {

/** The default ease instance which can be reused many times in various tweens in order to conserve memory and improve performance slightly compared to creating a new instance each time. **/
public static var ease:ExpoOut = new ExpoOut();

/** @inheritDoc **/
override public function getRatio(p:Number):Number {
return 1 - Math.pow(2, -10 * p);
}

}

}

Есть ощущение, что вся соль живет в

getRatio(p:Number)

dark256
13.01.2015, 18:00
Баннеры на 25 кб тоже делаю. Поэтому и юзаю эту штуку. Пока удается впихивать.

greep
13.01.2015, 19:23
Ясно, поскольку я уже не в первом месте спрашиваю, либо никто не знает, либо не хочет делиться...

Вот же... Есть куча открытых формул описанный в простых функциях, они встречаются везде и всюду. И есть тот волшебный кусок кода, который делает их универсальными, который непонятно как выделить...

Hauts
27.01.2015, 10:33
greep, а типа такого не подойдет?


clip.onEnterFrame = function(){
this._x += ( _root._xmouse - this._x ) / 10;
}


Некоторая плавность будет.