Код сглаживания кадров - PullRequest
3 голосов
/ 07 декабря 2011

Хорошо, это, наверное, что-то очень простое, я не понимаю в ActionScript, но, похоже, я ничего не могу с этим поделать.

У меня есть код, который должен сгладить анимацию в цикле ENTER_FRAME:

private var m_lastTime:Number;
private var clock_speed:Number = 5;
    private function frameLoop(evt:Event):void 
    {
        var currTime:int = getTimer();
        var deltaTime:Number = ( currTime - this.m_lastTime ) * 0.001;
        this.m_lastTime = currTime;
        //trace(deltaTime.toString() + "," + (deltaTime * clock_speed).toString());

        // why you no work?
        var n:Number = clock_speed * deltaTime;
        trace(n);
        mcClockHand.rotation += .18;//  Number(deltaTime * clock_speed);

Итак, как вы можете видеть, я вычисляю дельту времени между кадрами и умножаю ее на постоянную скорости. Я придумываю числовое значение и прослеживаю его до выходной вдовы. Он колеблется между 0,14 и 0,19, в среднем 0,18.

Если я использую это значение для смещения вращения часового MC, оно НИКОГДА НЕ ДВИЖЕТСЯ. Если я использую постоянную 0,18, как показано выше, она движется прямо примерно с 1 оборотом в 30 секунд.

Итак, они оба числового типа, и трассировка показывает, что они примерно одинакового значения. Почему один может перемещать MC, а другой нет?

Спасибо за любой совет!

Ответы [ 2 ]

3 голосов
/ 07 декабря 2011

В вашем первом цикле первое вычисление deltaTime приводит к NaN, поскольку this.m_lastTime равно нулю. Оттуда ваш код пытается увеличить объект, который не является числом. Простым решением было бы установить переменную m_lastTime равной 0 при ее объявлении:

private var m_lastTime:Number = 0;

Лучшим решением было бы проверить случай, когда ваши вычисления приведут к NaN.

var n:Number = clock_speed * deltaTime;
if (isNaN(n)) n = 0;
trace(n);
mcClockHand.rotation += n;//  Number(deltaTime * clock_speed);
1 голос
/ 07 декабря 2011

у вас нет начального значения для m_lastTime при первом его использовании.Если вы инициализируете var при объявлении, var m_lastTime:Number = getTimer(); это сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...