фреймовые счетчики или таймеры? - PullRequest
1 голос
/ 12 октября 2011

У меня есть этот счетчик кадров, который я использую вместо класса таймера, потому что все в моей игре основано на кадрах.Этот счетчик гарантирует, что все работает нормально, даже когда используется на старых компьютерах.

Я хотел бы знать, имеет ли смысл создавать счетчик на основе кадров десятой секунды (или даже кадра двадцатой секунды)счетчик).По сути, это будет почти такой же счетчик, как и приведенный ниже, за исключением того факта, что переменная framesPerSecond делится на 10 или 20, и вместо использования секунд я использую десятые или двадцать две секунды.идея?Есть ли принципиальная разница между счетчиками кадров и таймерами при использовании на старых компьютерах?Я не уверен в этой теме, поэтому я спрашиваю.

{
import flash.events.*;


public class BasicFrameTimer extends EventDispatcher
{
    public static const TIME_IS_UP:String = "timesup";
    public var countUp:Boolean = false;
    public var min:int = 0;
    public var max:int;
    public var maxSet:Boolean = false;
    public var seconds:int;
    private var frameCount:int;
    public var started:Boolean = false;
    private var framesPerSecond:int;

    public function BasicFrameTimer(framesPerSecond:int) {
        this.framesPerSecond = framesPerSecond;

    }

    public function start():void {
        frameCount = 0;
        started = true;
    }

    public function stop():void {
        started = false;
    }

    public function reset():void {
        if (countUp) {
            seconds = 0;
        } else {
            seconds = max;
        }
    }

    public function update():void {

        if (started) {
            frameCount++;
            if (frameCount > (framesPerSecond)) {
                frameCount = 0;

                if (countUp) {
                    seconds++;

                    if (maxSet == true && seconds == max) {
                        stop();
                        dispatchEvent(new Event(TIME_IS_UP));
                    }
                } else {
                    seconds--;
                    if (seconds == min) {
                        stop();
                        dispatchEvent(new Event(TIME_IS_UP));
                    }
                }
            }

        }


    }

}
}

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

Лучший способ добиться независимой от частоты кадров анимации - использовать функцию getTimer(). Возвращает количество миллисекунд, прошедших с момента запуска Flash VM.

Обновления экрана следует выполнять только один раз за кадр.

С помощью getTimer() вы можете определить точное количество миллисекунд, прошедших с последнего кадра (последнего обновления экрана). Используя это значение, вы можете легко внести необходимые изменения в список отображения.

Например, используя эту технику, Sprite, движущийся с 1 пикселем за 50 мс, может эффективно перемещаться с одинаковой скоростью во всех системах, даже если система способна обновлять экран только один раз каждые 500мс.

2 голосов
/ 12 октября 2011

Существует разница между Timer и использованием frame event с последствиями для обновления этапа, а не только на старых компьютерах.

Вы можете установить предлагаемые настройки частоты кадров в секунду как часть .fla файла, и скомпилированный .swf сделает все возможное, чтобы не отставать от предложенного параметра.Если это невозможно, он начинает пропускать кадры, чтобы не отставать.

Если вы определили некоторые взаимодействия, например анимацию, для событий кадра или с помощью счетчика кадров, они будут выполняться скадры, это означает, что более высокий fps приведет к более быстрой анимации.Если вместо этого анимация опирается на таймер, она будет выполняться вместе с таймером.

Выполнение с таймером сохранит взаимодействия в реальном времени за счет некоторой изменчивости анимаций.Хороший способ проверить, правильно ли вы реализовали таймер для цикла обновления, - снизить частоту кадров до 1 или 2 и посмотреть, завершится ли анимация за то же время (± 1 с).

Поскольку вы пометили , я бы рекомендовал использовать комбинацию.

Для проверки ввода, загрузки ресурсов и проверки следует использовать цикл с использованием Timer.игровое состояние (input, load, update)

Цикл с использованием ENTER_FRAME должен использоваться для изменения доступных активов (render)

Цикл с использованием EXIT_FRAME следует использовать для выгрузки ресурсов (unload);

Причина комбинации заключается в том, что вы сможете выполнять простые вычисления на регулярном интервале времени, но вы не будете тратить время на рендеринг.-специфическая логика, пока рендеринг на самом деле не нужен.Кроме того, это позволит синхронизировать ресурсы, критичные ко времени, даже на медленных компьютерах.

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