Показать сообщение отдельно
Старый 13.09.2013, 21:24
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 4  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Akopalipsis,
Всё очень просто, смотри.
Для начала создаёшь обычный таймер с интервалом 60fps (или какую тебе нужно частоту обновления) и обычную переменную на уровне класса с типом Number, для расчётов:
Код AS3:
private var lastTime:Number = 0;
private var timer:Timer = new Timer(1000 / 60);
Соответственно, подписываешь функцию слушатель, которую таймер будет дёргать 60 раз в секунду.
Далее, на каждой итерций, в функций листенере расчитываеш реально прошедшее время таким вот не замысловатым образом:
Код AS3:
private function onTimerTick(e:TimerEvent):void{
    var currentTime:Number = getTimer();                          // Текущее время
    var elapsedTime:Number = (currentTime - lastTime) / 1000;     // Реально прошедшее время с последней иттераций
    lastTime = currentTime;                                       // Запоминаем текущее время для следующего вызова.
}
Так ты получаешь в переменной elapsedTime - реально прошедшее время. Для удобства, его лучше перевести в секунды (разделить на 1000).

Далее всё становится ещё проще.
Тебе нужно рисовать некоторую линию от 0:0. Всё что для этого нужно - это запомнить текущее положение линий (до куда её нарисовали от 0:0) и указать расстояние, на которое она рисуется за 1 секунду реального времени. Выглядеть это может примерно так:
Код AS3:
/// Скорость рисования линий за 1 секунду.
private static const DRAW_SPEED:Number = 15;
 
private var linePoint:Point = new Point(0, 0);
 
// На каждой иттераций таймера, ты имеешь прошедшее время с момента последнего вызова, 
// которое можеш передавать функций рисовалке линий:
 
private function lineAnimation(time:Number):void{
 
    // Эта функция знает лишь то, что с последнего вызова прошло time секунд.
    // Так как мы имеем скорость рисования линий за 1 секунду, мы можем найти расстояние
    // на которое она нарисуется за текущее прошедшее время.
 
    // Новая позиция для линий:
    linePoint.x += time * DRAW_SPEED;
 
    // Код, рисующий линию к новой координате
    // ...
 
}
Вот и всё. Ничего сложного если совсем немного вникнуть. Все ваши анимаций, скорости перемещения персонажа и другие параметры изменения, должны указываться как - изменение за 1 секунду времени.

По такому принципу, например, работает анимация в Starling. На основе прошедшего времени работают физические движки. По этому-же принципу можно делать и "не лагающие игры". То-есть, лагать они конечно-же могут, будет уменьшаться частота обновления мира (fps), но эффекты при этом будут проигрываться с нормальной скоростью, а не замедленной. Уменьшится fps но действие в игре будет идти с той-же скоростью.
__________________
Дети не должны знать о своих родителях


Последний раз редактировалось Tails; 13.09.2013 в 21:51.