Показать сообщение отдельно
Старый 03.11.2013, 17:15
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 9  
Ответить с цитированием
Akopalipsis
Banned

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Анимацию надо строить на энтерфрейме.
Вы меня извините за мою настойчивость, но мне хочется разобраться во всём.
В пример я создал 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();
		}
	}
}