Немного оживлю полу-мёртвый форум вопросом к разработчикам игр на AS3. (:
Какой frame rate вы используете в своих играх и как у вас организован игровой цикл? Просто при переходе на Flash я пошёл по проложенному программированием на С++ и HGE пути, я выставляю 120 fps и анимацией мувиков у меня управляет отдельный класс. От этого возникла проблема, что все внутренние анимации в мувике должны быть сделаны графиксами, при этом, если сам мувик сейчас не анимируется, то и внутренние анимации так же стоят. А если вместо графиксов ставить мувики, то они бдут пытаться анимироваться со скоростью 120 fps, что, конечно, совсем мне не нужно.
Логично предположить, что можно выставить, скажем, 30 fps, и всё анимацию сразу затачивать под это значение, но тогда возникает вопрос с обновлением данных, будет либо не точно, либо как вариант обсчитывать за 1 проход несколько раз. В общем есть разные варианты решить эту проблему, но хотелось бы узнать, как это делаете вы. Как? (:
кагбе 30 fps, обновление данных почти всегда тоже привязано к fps, но если нужна точность , тогда setInterval()
А если игра выдаёт меньше 30 fps в определённые моменты, то анимация начинает тормозить?
Очень огорчает, что нельзя задать для каждого мувиклипа свой фпс. ):
Да, и ещё тогда сразу вопрос. Я дела анимацию персонажа со скинами в едином мувике (чтобы по 10 раз не добавлять/удалять графику на сцене). В случае своего класса управления анимацией у меня на таймлайне сразу располагается вся анимация для различных движений, а класс следит, чтобы в данный момент проигрывалась заданная анимация (от указанного начального, до указанного конечного фреймов). Скининг задаётся внутренними мувиками. В случае если отдать анимацию на откуп мувиклипам, то надо всё равно как-то ей управлять.
В общем какой-то тёмный для меня вопрос пока - организация анимации и скининг. С одной стороны у меня сейчас всё настроено и работает, но полного удовлетворения это не приносит. Тут либо есть какая-то хитрая, не понятная мне логика, заложенная Макромедией и Адобом, либо Флеш всё-таки не предназначен для игр и придётся плясать с бубном. ):
да, с тормозами анимации приходится смирится. Боротся с тормозами мне немного помогло такое решение, когда текущий frameRate меньше номинального, подимаем stage.frameRate, меньше - опускаем. Это более-менее заствляет плеер держать фпс на заданом уровне.
private function frameRateControl(): void
{
t = getTimer();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private var currentFrameRate: Number;
private var t: int;
private var appFrameRate: int = 30;
private var s: int;
private function onEnterFrame(e: Event): void
{
s++;
if(!(s %= stage.frameRate)) {
currentFrameRate = Math.round(stage.frameRate * 1000 / (getTimer() - t));
t = getTimer();
if (currentFrameRate < appFrameRate - 1 && stage.frameRate < 40) {
stage.frameRate++;
}
if (currentFrameRate > appFrameRate + 1) {
stage.frameRate--;
}
}
}
Вся анимация в мувиках и сразу на таймлан, управление простое, запускаем что нам нужно и ждем конца или заданого фрейма. Может ктото знает другое решение отпишитесь.
Тема в архиве.