|
|
|||||
[+1.3 07.12.11]
Регистрация: Feb 2011
Сообщений: 121
|
UpdateScene and RenderScene
Иго-гоооо
Сектор номер 2. Вопрос прислал пользователь из Пензы по имени imena. Вопрос: Пытаюсь смастерить каркас для игры... для несуществующей игры. Решил сделать две главные функции - UpdateScene(deltaTime) и RenderScene() В UpdateScene(deltaTime) выполняю все операции связанные с вычислением нового положения объекта(ов), текущий кадр в анимация(1) - анимация(N) и т.д. и т.п. В RenderScene() - выполняю прорисовку всей сцены с учетом тех данных что были получены в UpdateScene() Пихнул все это хозяйство в ENTER_FRAME. А теперь, уважаемые знатоки, внимание вопрос: 1) правильно пихнул(обе функции) или 2) может одну из них пихнуть в EXIT_FRAME? Или может еще куда? Всем заранее спасибо |
|
|||||
Добавочный ответ в пользу знатоков.
В место "Event.ENTER_FRAME" советую использовать "TimerEvent.TIMER" с "updateAfterEvent();". и того 2:0, пользователь курит. Следующая игра!
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
|
|||||
Возможностей больше и производительность выше.
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
|
|||||
[+1.3 07.12.11]
Регистрация: Feb 2011
Сообщений: 121
|
Мне тоже интересно. Я не волшебник, я только учусь... и как я понимаю, если мы поставим таймер на 1 секунду, то наш прощет сцены будет ТОЛЬКО раз в секунду?
В общем...вот как у меня было сделано(до того как я создал эту тему) /*************************************************************/ /* Функция frameFunc() вызывается каждый раз когда присходит событие ENTER_FRAME. В этой */ /* функции выполняются расчеты для всех объектов - координаты, номер текущего кадра и т.д. */ /* Таким образом, у каждого не статичного объекта должна быть функция Update(dt) */ /*******************************************************************************/ private function frameFunc(e:Event):void { var dt:Number = getTimeDelta(); switch(gameStage) { case GAME_INIT: // Тут объекты со своими Update(deltaTime); break; case GAME_START: // Тут объекты со своими Update(deltaTime); break; case GAME_OVER: // Тут объекты со своими Update(deltaTime); break; default: break; } sceneBuilder(); } private function sceneBuilder():void { switch(gameStage) { case GAME_INIT: break; case GAME_START: break; case GAME_OVER: break; default: break; } } private function getTimeDelta():Number { now = getTimer(); deltaTime = now - lastFrameTime; lastFrameTime = now; return deltaTime; } |
|
|||||
var timer:Timer = new Timer(40); // где 40 - это миллисекунды, секунда будит "delay = 1000;" // delay = 40; Скорость рендера человеческого глаза. // такой промежуток достаточен для машины что бы просчитать огромное количество операций. default: break; // break после default не ставится. default и есть завершение switch. // и признаться, в данной задаче я, switch, не использовал бы вообще. // В классе "MyGame" удобнее было бы использовать пользовательский диспетчер // который и будит следить за завершением игры. Тоже самое и с инициализацией настроек игры.
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
|
|||||
[+1.3 07.12.11]
Регистрация: Feb 2011
Сообщений: 121
|
Спасибо.
Я в начале сделал по примеру Мука диспетчер.... сделал интерфейс... но... чет запутался во всех этих ограничениях с объвлением переменных, с доступом... и в конце-концов плюнул... оказЦа зря плюнул Добавлено через 1 час 51 минуту Я тут поэкспериментировал с анимацией... В общем при использование Таймера анимация более 'рваная', не не равномерная, а именно 'рваная', НЕ ВСЕГДА, но все же слишком часто, а при использовании различных значений frameRate и скорости самой анимации ... анимация плавнее или если и скачками, то... мммм.. равномерными скачками Вот кусок кода который разместил в enterFrameListener(frameRate = 30) и в timerListener(таймер на 40 миллисекунд): now = getTimer(); dt = now - lastFrame; lastFrame = now; /*Скорость самой анимации = 30*/ animation.update(dt); spr.addChild(frame[curFrame]); deltaFrame += (dt/1000)*_fps; // _fps - скорость воспроизведения самой анимации curFrame += dFrame; При использовании таймера, событие происходит не точно через каждые 40 миллисекунд... я трейсом вывел значения... там встречаются и 40 миллисекунд и 69 миллисекунд... с учетом кода производим расчеты... когда у нас 40 миллисекунд... все ок... т.к. 0.04*_fps(самой анимации = 30) = 1.2.. т.е. приращение идет на 1 кадр... и все хорошо, НО, когда deltaTime = 66 миллисекундам, тогда 0.069*30 = 2.07, т.е. приращение идет уже на два кадра, а в какой-то момент даже встретилось значение в 6 кадров. При использовании ENTER_FRAME среднее deltaTime = 0.35.. в результате очередных расчетов... получаем 0.033*30 = 0.99, т.е., приращение идет все время на один кадр. В общем... к чему это я все... сижу тут и думаю, какой вариант все же предпочтительнее? И почему у меня с вариантом таймера получается такая фигня? Попробую сейчас сделать 20 анимаций одновременно...и гляну на результаты |
|
|||||
Что то я запутался в ваших цифрах. Сейчас накидаю пример.
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
|
|||||
[+1.3 07.12.11]
Регистрация: Feb 2011
Сообщений: 121
|
вечером гляну... а то уже глаза закрываются
|
Часовой пояс GMT +4, время: 23:28. |
|
« Предыдущая тема | Следующая тема » |
|
|