Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.10.2011, 22:04
imena вне форума Посмотреть профиль Отправить личное сообщение для imena Найти все сообщения от imena
  № 1  
Ответить с цитированием
imena
[+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? Или может еще куда?

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

Старый 20.10.2011, 22:44
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 2  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Правильно пихнул [x]

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

Cчет 1:0 в пользу знатоков!
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 21.10.2011, 00:06
stweet вне форума Посмотреть профиль Отправить личное сообщение для stweet Найти все сообщения от stweet
  № 3  
Ответить с цитированием
stweet
 
Аватар для stweet

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
Добавочный ответ в пользу знатоков.
В место "Event.ENTER_FRAME" советую использовать "TimerEvent.TIMER" с "updateAfterEvent();".

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

Старый 21.10.2011, 01:07
crazyone вне форума Посмотреть профиль Отправить личное сообщение для crazyone Найти все сообщения от crazyone
  № 4  
Ответить с цитированием
crazyone
 
Аватар для crazyone

блогер
Регистрация: Nov 2007
Адрес: Киев
Сообщений: 557
Записей в блоге: 2
Кстати, можно поподробнее - почему рендер сцены лучше вешать на таймер, чем на события кадра?

Старый 21.10.2011, 01:20
stweet вне форума Посмотреть профиль Отправить личное сообщение для stweet Найти все сообщения от stweet
  № 5  
Ответить с цитированием
stweet
 
Аватар для stweet

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
Возможностей больше и производительность выше.
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь!

Старый 21.10.2011, 01:32
imena вне форума Посмотреть профиль Отправить личное сообщение для imena Найти все сообщения от imena
  № 6  
Ответить с цитированием
imena
[+1.3 07.12.11]

Регистрация: Feb 2011
Сообщений: 121
Мне тоже интересно. Я не волшебник, я только учусь... и как я понимаю, если мы поставим таймер на 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;
		}

Старый 21.10.2011, 02:06
stweet вне форума Посмотреть профиль Отправить личное сообщение для stweet Найти все сообщения от stweet
  № 7  
Ответить с цитированием
stweet
 
Аватар для stweet

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
Код AS3:
var timer:Timer = new Timer(40); // где 40 - это миллисекунды, секунда будит "delay = 1000;"
// delay = 40; Скорость рендера человеческого глаза.
// такой промежуток достаточен для машины что бы просчитать огромное количество операций.
 
default: break; // break после default не ставится. default и есть завершение switch.
 
// и признаться, в данной задаче я, switch, не использовал бы вообще.
// В классе "MyGame" удобнее было бы использовать пользовательский диспетчер
// который и будит следить за завершением игры. Тоже самое и с инициализацией настроек игры.
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь!

Старый 21.10.2011, 04:22
imena вне форума Посмотреть профиль Отправить личное сообщение для imena Найти все сообщения от imena
  № 8  
Ответить с цитированием
imena
[+1.3 07.12.11]

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

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

Старый 21.10.2011, 05:37
stweet вне форума Посмотреть профиль Отправить личное сообщение для stweet Найти все сообщения от stweet
  № 9  
Ответить с цитированием
stweet
 
Аватар для stweet

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
Что то я запутался в ваших цифрах. Сейчас накидаю пример.
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь!

Старый 21.10.2011, 05:41
imena вне форума Посмотреть профиль Отправить личное сообщение для imena Найти все сообщения от imena
  № 10  
Ответить с цитированием
imena
[+1.3 07.12.11]

Регистрация: Feb 2011
Сообщений: 121
вечером гляну... а то уже глаза закрываются

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:31.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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