Цитата:
|
Анимацию надо строить на энтерфрейме.
|
Вы меня извините за мою настойчивость, но мне хочется разобраться во всём.
В пример я создал EF с частотой 45 кадров. Когда я решаю сколько кадров выбрать, то руководствуюсь тем, что анимация будет обновляться столько раз, сколько кадров. И вот я вижу, что за десять секунд не хватает 150 кадров и анимация передвижения дергается. Вот почему лучше использовать EF + твины для сглаживания, если можно поставить 1fps, но запустить таймер с частотой обновления 45 раз в секунду, замерять время + его подгонять + updateAfterEvent, который будет вызываться точно 45 раз.
Вот почему такой подход не правильный, а создавать много разных твинов ( ведь обьектов много и двигуются они все с разной скорость ), это хорошо? А с таймером я и без лишней нагрузки ( без твинов ) задавать им разную скорость и уверен что лагов не будет, ведь частота обновления будет именно 45 раз.

Код AS3:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.getTimer;
import flash.utils.Timer;
public class Main extends Sprite
{
private var _timer:MyTimer;
private var _lastTime:Number
private var _counterFrame:Number = 0;
private var _counterTime:Number = 0;
private const FRAME_RATE:Number = 60 / 1000;
private const COUNTER_FRAME:Number = 60;
private var _testTime:Number = 0;
private var _render:TimerEvent;
private var _cube:Cube;
public function Main()
{
init();
}
private function init(event:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
stage.addEventListener(MouseEvent.CLICK, stage_clickHandler);
_cube = new Cube();
addChild(_cube);
_timer = new MyTimer(FRAME_RATE);
_render = new TimerEvent(TimerEvent.TIMER);
}
private function stage_clickHandler(event:MouseEvent):void
{
stage.addEventListener(Event.ENTER_FRAME, stage_enterFrameHandler);
_lastTime = getTimer() * 0.001;
}
private function stage_enterFrameHandler(event:Event):void
{
var currentTime:Number = getTimer()* 0.001;
var elapsedTime:Number = (currentTime-_lastTime)
_lastTime = currentTime;
_testTime += elapsedTime;
_counterFrame++;
this.time(elapsedTime)
//this.render(_render);
}
private function time(time:Number):void
{
_counterTime += time;
_cube.x=_counterTime
trace(_counterFrame,_counterTime);
}
private function render(event:TimerEvent):void
{
event.updateAfterEvent();
}
}
}