Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   UpdateScene and RenderScene (http://www.flasher.ru/forum/showthread.php?t=170222)

imena 20.10.2011 22:04

UpdateScene and RenderScene
 
Иго-гоооо

Сектор номер 2. Вопрос прислал пользователь из Пензы по имени imena.

Вопрос:
Пытаюсь смастерить каркас для игры... для несуществующей игры.
Решил сделать две главные функции - UpdateScene(deltaTime) и RenderScene()

В UpdateScene(deltaTime) выполняю все операции связанные с вычислением нового положения объекта(ов), текущий кадр в анимация(1) - анимация(N) и т.д. и т.п.
В RenderScene() - выполняю прорисовку всей сцены с учетом тех данных что были получены в UpdateScene()

Пихнул все это хозяйство в ENTER_FRAME.

А теперь, уважаемые знатоки, внимание вопрос:
1) правильно пихнул(обе функции) или
2) может одну из них пихнуть в EXIT_FRAME? Или может еще куда?

Всем заранее спасибо

dimarik 20.10.2011 22:44

Правильно пихнул [x]

Можно одну из них пихнуть в Event.RENDER.

Cчет 1:0 в пользу знатоков!

stweet 21.10.2011 00:06

Добавочный ответ в пользу знатоков.
В место "Event.ENTER_FRAME" советую использовать "TimerEvent.TIMER" с "updateAfterEvent();".

Код AS3:

// Сами методы оптимально было бы объединить.
public function updateScene():void // Прошу заметить, не UpdateScene а updateScene.
{
    // выполняем все операции по просчётам сцены
    // ...
    // ...
    // ...
 
    // И далее уже делаем перерисовку.
    renderScene();
}

и того 2:0, пользователь курит. Следующая игра!

crazyone 21.10.2011 01:07

Кстати, можно поподробнее - почему рендер сцены лучше вешать на таймер, чем на события кадра?

stweet 21.10.2011 01:20

Возможностей больше и производительность выше.

imena 21.10.2011 01:32

Мне тоже интересно. Я не волшебник, я только учусь... и как я понимаю, если мы поставим таймер на 1 секунду, то наш прощет сцены будет ТОЛЬКО раз в секунду?
В общем...вот как у меня было сделано(до того как я создал эту тему)

Код AS3:

/*************************************************************/
/*        Функция 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;
                }


stweet 21.10.2011 02:06

Код AS3:

var timer:Timer = new Timer(40); // где 40 - это миллисекунды, секунда будит "delay = 1000;"
// delay = 40; Скорость рендера человеческого глаза.
// такой промежуток достаточен для машины что бы просчитать огромное количество операций.
 
default: break; // break после default не ставится. default и есть завершение switch.
 
// и признаться, в данной задаче я, switch, не использовал бы вообще.
// В классе "MyGame" удобнее было бы использовать пользовательский диспетчер
// который и будит следить за завершением игры. Тоже самое и с инициализацией настроек игры.


imena 21.10.2011 04:22

Спасибо.
Я в начале сделал по примеру Мука диспетчер.... сделал интерфейс... но... чет запутался во всех этих ограничениях с объвлением переменных, с доступом... и в конце-концов плюнул... оказЦа зря плюнул

Добавлено через 1 час 51 минуту
Я тут поэкспериментировал с анимацией...
В общем при использование Таймера анимация более 'рваная', не не равномерная, а именно 'рваная', НЕ ВСЕГДА, но все же слишком часто, а при использовании различных значений frameRate и скорости самой анимации ... анимация плавнее или если и скачками, то... мммм.. равномерными скачками

Вот кусок кода который разместил в enterFrameListener(frameRate = 30) и в timerListener(таймер на 40 миллисекунд):

Код AS3:

now = getTimer();
dt = now - lastFrame;
lastFrame = now;
/*Скорость самой анимации = 30*/
animation.update(dt);

Код animation.update(dt):
Код AS3:

 
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 анимаций одновременно...и гляну на результаты

stweet 21.10.2011 05:37

Что то я запутался в ваших цифрах. Сейчас накидаю пример.

imena 21.10.2011 05:41

вечером гляну... а то уже глаза закрываются


Часовой пояс GMT +4, время: 03:05.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.