PDA

Просмотр полной версии : Создание твина. Дайте ссылку на пример.


MikroAcse
21.03.2012, 20:25
Дайте ссылку на пример создания твина с использованием изингов.
Весь мой твин сделан на getTimer().
Например, найти текущую позицию:
position=getTimer()-startTime;
position/=1000;
Обновить время:
startTime=getTimer()-position*1000;
Но вот как сделать изинги?
Например, это работает на ура:
target[parameter]=(parameters[parameter]-target[parameter])/(duration-position);
А вот это работает очень быстро:
target[parameter]=(parameters[parameter]-target[parameter])*(position/duration);

Дать код своего твина не могу, но уточнить некоторые моменты могу.

КорДум
21.03.2012, 20:29
http://www.gizma.com/easing/#quad1
А чем код того же твина от зеленых носков не удовлетворил?

MikroAcse
21.03.2012, 20:32
А чем код того же твина от зеленых носков не удовлетворил?
Да нет :)
Удовлетворил, но я хочу понять, почему у меня ничего не получается.

Добавлено через 13 минут
Кажется я понял.
Между примером этого сайта и в моим твином есть отличие:
У меня каждый раз используется новое значение target[parameter], а в примере этого сайта используется
начальное значение target[parameter].
Именно в этом и была проблема. Вот, кому надо, готовый рабочий пример твина без глюков:
package
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.*;

/**
* ...
* @author V-Games
*/
public class Main extends Sprite
{

public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
var spr:Sprite = new Sprite();
addChild(spr);
spr.graphics.beginFill(0x00FF00);
spr.graphics.drawCircle(0, 0, 20);
spr.graphics.endFill();

createTween(spr, 2, { x:100, y:100 } );
setTimeout(trace, 2000, 'timer finished');
}
//------------------ tween
public var tar:Object;
public var dur:Number;
public var par:Object;
public var args:Array;
public var startTime:Number;
public var pos:Number;
public var main:Shape;
public function createTween(target:Object, duration:Number, parameters:Object):void {
tar = target;
dur = duration;
par = parameters;
pos = 0;
args = [];
startTime = getTimer();
main = new Shape();

for (var p:String in par) {
args.push([tar[p], p]);
}

main.addEventListener(Event.ENTER_FRAME, _onTimeChange);
}

private function _onTimeChange(e:Event):void {
updatePosition();
updateTime();
nextPosition();
}

private function updateTime():void {
startTime = getTimer() - pos * 1000;
}
private function updatePosition():void {
pos = (getTimer() - startTime) / 1000;
if (pos >= dur) {
stop();
}
}

private function nextPosition():void {
for (var i:uint = 0; i < args.length; i++) {
var p:String = args[i][1];
var b:Number = args[i][0];
tar[p] = easeCircIn(pos, b, par[p] - b, dur);
}
}

public function stop():void {
main.removeEventListener(Event.ENTER_FRAME, _onTimeChange);
pos = dur;
trace('tween finished');
}

public function easeLinear(t:Number, b:Number, c:Number, d:Number):Number {
return c*t/d + b;
}
public function easeCircIn(t:Number, b:Number, c:Number, d:Number):Number {
t /= d;
return -c * (Math.sqrt(1 - t*t) - 1) + b;
}

}

}