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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.11.2013, 16:18
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 1  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
По умолчанию Анимация enterFrame + getTimer

Со вчерашнего дня не получается сделать и сегодня я уже думаю, что не допонял чего то.
В advanceTime передаются значения
Цитата:
0.040000000000000036
0.04499999999999993
0.029999999999999805
0.020000000000000018
Код AS3:
public function advanceTime(time:Number):void 
{
	//суммарное прошедшее время
	_passedTime += time; 
	var balance:Number = 0;
	//проверяю, если суммарное время больше либо равно
	//_refreshRate ( _refreshRate - это сикунда поделённая на кол-во кадров )
	if (_passedTime >= _refreshRate)
	{
		//вычитаю взятое время из суммарного 
		balance = _passedTime-_refreshRate;
		//вычитаю это из суммарного времени
		_passedTime -= balance; 
		//передаю время во все методы
		for (var index:int = 0; index < _length; index++) 
		{
			_animates[index].advanceTime(_refreshRate);
		}
	}
	//и вот здесь проблема. я понимаю так - если произошёл лаг
	//то этот метод не кто не вызовет, а значит лаги передадутся на анимацию
	//по этому я возвращаю это значение в этот же метод
	//но именно из-за этой рекурсии всё и отваливается.
	//где я не правильно понял?
	if (balance) this.advanceTime(balance);
}

Старый 02.11.2013, 16:45
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
//вычитаю взятое время из суммарного
balance = _passedTime-_refreshRate;
//вычитаю это из суммарного времени
_passedTime -= balance;
Почему просто не написать _passedTime = _refreshRate;?
Что такое "взятое" время? Почему "взятое" это "сикунда поделённая на кол-во кадров"?
Вообще не понимаю, как и раньше, что Вы делаете.
По сути Вы просто всем отдаете это самое предрасчетное время на один кадр — и _animates[index] и this получают просто _refreshRate.
__________________
Reality.getBounds(this);

Старый 02.11.2013, 17:56
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 3  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Что такое "взятое" время? Почему "взятое" это "сикунда поделённая на кол-во кадров"?
Цитата:
//_refreshRate ( _refreshRate - это сикунда поделённая на кол-во кадров )
Цитата:
Вообще не понимаю, как и раньше, что Вы делаете.
Не поймёте наверное по тому, что я сам немного не правильно понимаю...
Тут я писал и переписывал три раза и наконец я понял предназначение этого подхода.
я ждал от него плавного течения времени, а он создан для того, чтобы обьект из точки А в точку Б дошел за точное время.

Добавлено через 15 минут
Но! я сам уже сбился Слова
Цитата:
я ждал от него плавного течения времени, а он создан для того, чтобы обьект из точки А в точку Б дошел за точное время.
это про метод, который рассылает время, а я спрашиваю о "обработке" этого времени.
Потому что, если мне нужно менять положение обьекта в зависимости от времени, то получится следующее
Код AS3:
_object.x += time;
и пока лагов нет, то его движение можно назвать равномерным. Но тут происходит лаг и время не приходит, а обьект застывает. Потом приходит сразу много времени и обьект перепрыгивает через это время и выглядеть это будет, как лаг. Если выдавать это время частями, то цель этого мероприятия - из А в Б за секунду, то же теряется. Где я не пойму чего то?

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
это про метод, который рассылает время, а я спрашиваю о "обработке" этого времени.
Потому что, если мне нужно менять положение обьекта в зависимости от времени, то получится следующее
Код AS3:
_object.x += time;
и пока лагов нет, то его движение можно назвать равномерным. Но тут происходит лаг и время не приходит, а обьект застывает. Потом приходит сразу много времени и обьект перепрыгивает через это время и выглядеть это будет, как лаг. Если выдавать это время частями, то цель этого мероприятия - из А в Б за секунду, то же теряется. Где я не пойму чего то?
Смысл в том, что объект достигнет точки Б за одно и то-же время, независимо от того были лаги или нет. При этом, "лаг" - превращается в понятие - низкий fps.
Это называется анимация, основанная на времени.

пс.
Прибавлять нужно не само время, а время * скорость. Скорость задаётся как расстояние, проходимое за 1 секунду. (Тут передаваемое время служит не только как показатель конкретно прошедшего времени, но и как математический коэффициент для нахождения изменения состояния. Это очень простая вещь, но может быть, немного сложная для начального понимания.)

пс.2
Если вам нужна плавная анимация, передавайте в advanceTime фиксированное значение, например: 1/60, если у вас фремрейт == 60. Однако, при таком способе, анимация будет закономерно замедляться вместе с лагами. А дробовики, перезарядка которых основана на этой анимации, будут иметь уникальное время перезарядки.
__________________
Дети не должны знать о своих родителях


Последний раз редактировалось Tails; 02.11.2013 в 18:26.
Старый 02.11.2013, 18:37
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 5  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Tails Спасибо! Скорость у меня есть, я её не написал, так как смотрел на движение скорости по умолчанию.
Цитата:
При этом, "лаг" - превращается в понятие - низкий fps.
А это понятие, как то решает проблему с дерганьем?
Цитата:
Тут передаваемое время служит не только как показатель конкретно прошедшего времени, но и как математический коэффициент для нахождения изменения состояния.
Вот это я и пытаюсь понять, но пока безрезультатно. я понимаю, что время нужно передавать кусочками и если произойдёт лаг,
то сам метод advanceTime перестанет вызываться и всё встанет, хоть запас времени и будет. По этому я и делаю рекурсию, если есть время,
то лаги не страшны, метод сам себя будет вызывать. Но происходит завал плеера и по этому я и спросил - как это решить.
я не боюсь коэффициентов, я просто не пойму, как это реализовать.

Добавлено через 7 минут
Может нужно для равномерности написать какой то замедлитель или возможно есть, алгоритм равномерного распределения. Если так, то скажите правильное название. я просто пытаюсь сделать "что то", что заменит для всего приложения EnterFrame и позволит работать без тырчков.

Старый 02.11.2013, 19:26
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 6  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
А это понятие, как то решает проблему с дерганьем?
Дёрганье - это низкий фпс. А низкий фпс вы никаким образом не поднимите, пока не купите нормальный компьютер. (Или не произведёте оптимизацию для его повышения. пс. Здесь, конечно, можно придумать какой-то алгоритм, который будет стараться сгладить большую разность во времени между тиками. Этот механизм должен находиться на самом верху в ядре, в котором происходит первичное уведомление главного juggler. В старлинге, такого механизма нету. Готового решения я не искал. Разработка такого механизма должна быть не слишком сложная, может максимум - 1 день.)

Это два способа анимации:
  1. На основе реального прошедшего времени - getTimer
  2. Привязанной к частоте выполнения - 1/60

Иногда нужно, что-бы анимация проигрывалась с точно указанной скоростью, независимо от fps - 1 способ. Когда точная скорость анимации не важна, или нужна обязательно плавная анимация без лишнего гемора - 2 способ. (Однако длительность анимации будет возрастать, при понижений fps)

Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
Вот это я и пытаюсь понять, но пока безрезультатно. я понимаю, что время нужно передавать кусочками и если произойд
Передаваемое время можно использовать как коэффициент, или процент от некоторого значения. Так, передаваемый 0 (ноль) - это 0%, 1 (единица) - 100%.
Если мы возьмём некоторый параметр как значение/секунду (значение в секунду), то мы сможем рассчитать конкретное изменение этого параметра: параметр * переданный коэффициент.
Пример:
  • Мячик двигающийся со скорость. 120px/sec за 0.5 времени - сместится на половину своей скорости.
  • Кровоточащая рана на герое, за 1 секунду выдаёт 50 брызг крови. За 0.2 времени - из него выльется 10 мувиклипов крови.
__________________
Дети не должны знать о своих родителях

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Вот, я еще тогда заподозрил, что Вы что-то не то придумали про эту технологию, когда прозвучал какой-то очень странный вопрос типа "как мне значение 0.2 поможет рассчитать сколько кадров займет движение из А в В".
Анимация по времени вообще не занимается плавностью, скорее даже наоборот — она рассчитывает, насколько надо скакнуть анимации, чтобы придти в нужную фазу в нужное время, и предназначена как раз не для сглаживания скачков, а для того, чтобы скачки не рассинхронизировали течения анимаций. Она гарантирует, что анимация с предрасчетным временем 1.5 сек закончится через 1.5 сек, даже если ей придется показать только начальную и конечную фазу.
А "плавность" анимации это абсолютно другая задача, и она в принципе не решается при низком фпс или его скачках. Никак. Это технически невозможно — если экран полсекунды не обновлялся из-за тормозов системы, то скачок будет и ничем его не смажешь. Объект не может двигаться на экране, когда экран НЕ обновляется))
__________________
Reality.getBounds(this);

Старый 02.11.2013, 19:51
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 8  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Wolsh,
С разной степенью эффективности, скачки сгладить всё-же можно. Но в целом да, при рендере всего 2 кадров, мы увидим начальное и конечное состояние анимации.
  • Сглаживанием может заниматься сам объект, получающий уведомления.
  • Сглаживать разность перепадов может главный уведомитель перед уведомлением. Однако, при таком способе, завершение анимации отдельных объектов будет близкой к указанной.
__________________
Дети не должны знать о своих родителях

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Для начала, наверное, надо определиться в терминологии: есть скачок и есть фриз.
Скачок это когда объект "вдруг" оказывается слишком далеко, то есть как будто скорость неожиданно возросла (и объект оказывается в нужной точке в нужное время, но, возможно, "в три прыжка" вместо двенадцати, то есть после фриза объект будет двигаться с бОльшей скоростью, чем задумано).
Фриз это когда экран не обновляется, объекты на какое-то время застывают на месте, а затем продолжают двигаться дальше с той же скоростью (и оказываются в нужной точке позже чем планировалось, но будет показан каждый "кадр" анимации).
__________________
Reality.getBounds(this);

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Со скачком и фризом понятно, продолжайте.
__________________
Дети не должны знать о своих родителях

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

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

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


 


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


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