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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.09.2011, 16:26
flax4Noob вне форума Посмотреть профиль Отправить личное сообщение для flax4Noob Найти все сообщения от flax4Noob
  № 1  
Ответить с цитированием
flax4Noob

Регистрация: Jan 2011
Сообщений: 70
По умолчанию ENTER_FRAME лучше один или много?

Вот маюсь вопросом. Есть поле крестики-нолики. Каждая клетка extends Sprite. В каждой клетке может быть Спрайт крестика или нолика или нифигалика. Спрайты анимируются програмно (для этого есть метод Draw каждому спрайтику, и в нем я считаю сколько прошло секунд с момента последней отрисовки и рисую его в нужном мне виде)

Вопрос в том - как этот метод лучше (оптимальнее) вызывать. Есть решения.
1 addEventListener(Event.ENTER_FRAME, одна_большая_функция_с_циклом_по_всем_клеткам)
2 каждая_клетка.addEventListener(Event.ENTER_FRAME, функция_отрисовки_своего_содержимого)
3 ???

Нужно сразу реализовать метод, который не отвалится, если придется увеличивать количество клеток, и количество спрайтов в каждой клетке. (анимированый фон, или что-то еще)

Таймерами, как я понимаю, в АС3 не принято пользоваться. Раскуриваю програмную анимацию вторые сутки. Не пиннать сильно!

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

Регистрация: Sep 2010
Адрес: Moscow
Сообщений: 473
я бы делал один EnterFrame для всего поля

Старый 26.09.2011, 16:33
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 3  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Я тоже за один EnterFrame для всего поля, иначе для каждой клетки будет создаваться свой Event, что отрицательно скажется на производительности.
__________________
http://www.chessmax.ru

Старый 26.09.2011, 17:11
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 4  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Достаточно было вбить в гугл. Этот вопрос относится вообще к разряду тривиальных.
Конечно нужно использовать один слушатель.

Старый 26.09.2011, 17:33
flax4Noob вне форума Посмотреть профиль Отправить личное сообщение для flax4Noob Найти все сообщения от flax4Noob
  № 5  
Ответить с цитированием
flax4Noob

Регистрация: Jan 2011
Сообщений: 70
А как-то можно сделать чтобы событие не генерилось пока я его не обработаю? Флешка успешно "дохнет" где-то через минуту. Хотя там всего-то 200 клеточек и в одной из них стоит нолик с анимацией =/ Однака тормоза такие, что жуть. На всякий случай кусочки кода.

Код AS3:
function animateAll(e:Event):void{
			var i:uint;
			var j:uint;
			for ( i=0; i < Width; i++) {
				for ( j=0; j < Height; j++) {
					cells[i][j].doAnimation();
				}
			}
 
		}
В каждой клетке может быть несколько Анимационных объектов, поэтому там тоже цикл.

Код AS3:
public function doAnimation():void{
 
			//-- цикл по всем объектам.
			for (var index:* in zObjects) {
				//-- это чо-та не работает, поэтому я тупо убрал не-анимационный мусор пока что для теста.
				//if (zObjects[index] is AnimatedObject){
					zObjects[index].draw();
				//}	
			}
 
		}
И код для единственного объекта на этом поле:

Код AS3:
public function draw():void{
 
			var lt:uint = getTimer();
			var delta:uint = lt-lastUpdate;
			if(delta>timePerFrame){
				var rest:uint=delta % timePerFrame; //--остаток от деления, мы его сохраняем.
				var framesPass:uint=(delta-rest)/timePerFrame; //-- сколько кадров надо было отрисовать за это время.
				lastUpdate = lt-rest;//--остаток, который не посчитали учитываем при подсчете в следующий раз.
 
				if (framesPass>0){
 
					frame = frame+framesPass;
					while  (frame>framesCount){
						frame = frame-framesCount
					}
 
 
					var n:Graphics = this.graphics;
					// рисуем круг.
					n.beginFill(0x0000EE,1);
					n.lineStyle(1, 0x111111);
					n.drawCircle(0, 0, 5);
					//-- рисуем линию, которая "бегает" вниз. Вполне смотрибельно для теста.
					n.lineStyle(1, 0x00EEEE);
					n.moveTo(-5,frame-5)
					n.lineTo(5,frame-5);
 
				}
			}
 
		}
Вроде как все нормуль, кружок, линия бегает вниз. Анимация... но секунд через 40 все плавно переходит в "слоу-мошн" и в дельнейшем на клики флешка реагирует очень вяло.

Добавлено через 5 минут
Цитата:
Сообщение от flax4Noob Посмотреть сообщение
Код AS3:
 
					frame = frame+framesPass;
					while  (frame>framesCount){
						frame = frame-framesCount
					}
Не ржать Забыл я про "%" в суете этой с анимацией...

Добавлено через 20 минут
Все пучком, забыл graphics очистить в анимации перед перерисовкой круга и линии. Прошу пардона. Спешим-с.... =/

Всем спасибо.

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

Теги
ENTER_FRAME Анимация

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

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


 


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


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