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

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

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

блогер
Регистрация: Dec 2010
Сообщений: 237
Записей в блоге: 5
По умолчанию getDefinitionByName from swc

Есть произвольное и заранее неизвестное число классов, зашитое в swc либу. Все эти классы в обязательном порядке поименованы итеративно (Class_1, Class_2, ...); Для каждого из этих классов мне необходимо создать инстанс и запрятать в массив, к которому позднее будет идти обращение. Раньше (когда fla файл являлся main-классом), я делал что-то вроде этого.
Код AS3:
function fillClassesFromLib():Vector.<Sprite> {
	var toReturn:Vector.<Sprite> = new Vector.<Sprite>(); 
	for (var i:int = 1; i > -1; i++) {
		try {
			var className:Class = getDefinitionByName("IterativeClass_" + i) as Class;
			var sprite:Sprite = new className();
			toReturn.push(sprite);
		} catch (e:Error) {
			return toReturn;
		}
	}
	return new Vector.<Sprite>;
}
Работало идеально. Но когда я решил разделить труд аниматора и программиста, экспортируя .fla в .swc - блок try перестал выполняться даже единожды, отвечая на свою первую строчку:
Код AS3:
ReferenceError: Error #1065: Переменная IterativeClass_1 не определена.
Если же прописать блок try следующим образом:
Код AS3:
<...>
try {
	var c:Sprite = new IterativeClass_1();
	c = new IterativeClass_2();
	c = new IterativeClass_3();
	var className:Class = getDefinitionByName("IterativeClass_" + i) as Class;
	<...>
То блок выполнится три с небольшим раза, на четвёртом генерируя референс-эррор. Понятно, что на этапе создания инстанса класса, с указанием имени напрямую он каким-то образом "подхватывает" этот класс из библиотеки, однако не дело это: заранее "подхватывать" все 1~9000 классов.

Есть какой-нибудь добрый и изящный выход?
__________________
Дебаггер не предлагать


Последний раз редактировалось BuKT; 07.07.2011 в 09:31.
Старый 07.07.2011, 10:27
spooner вне форума Посмотреть профиль Отправить личное сообщение для spooner Найти все сообщения от spooner
  № 2  
Ответить с цитированием
spooner
 
Аватар для spooner

Регистрация: Mar 2009
Сообщений: 207
Чтобы классом пользоваться надо его вкомпилировать.
Хотите гибкости - грузите заранее подготовленные swf Loader'ом.

Старый 07.07.2011, 10:32
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 3  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Используется несколько кадровая флешка, типа в первом прелоадер и дальше по обстоятельствам посредством -frame ?
__________________
trace("Остановите Землю, я сойду!!!");

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

блогер
Регистрация: Dec 2010
Сообщений: 237
Записей в блоге: 5
Цитата:
Чтобы классом пользоваться надо его вкомпилировать.
Хотите гибкости - грузите заранее подготовленные swf Loader'ом.
Заранее классы, имеющие графическую имплементацию - "вшиты" эмбедом. Например, так:
Код AS3:
[Embed(source = "/../assets/Graphics.swf#SomeClassGraphics")] public class SomeClass extends MovieClipAsset { <...>
Вы предлагаете эмбедить все итерированные классы через цикл?
Цитата:
Используется несколько кадровая флешка, типа в первом прелоадер и дальше по обстоятельствам посредством -frame
Нет. Но ваши слова натолкнули меня на мысль, что можно именно фреймами это сделать. Я же сделал иначе. Сказал художнику придумать класс, содержащий объекты всех этих итерированных классов и каждый объект также поименовать итерационно. Далее просто:
Код AS3:
var classesArray:ClassesArray = new ClassesArray();
for (var i:int = 1; i > -1; i++) {
	var iterClassInstance:DisplayObject = classesArray['iteratedClass_' + i];
	if (!iterClassInstance) {
		return toReturn;
	}
	toReturn.push(iterClassInstance);
}
Да, помогло. Но ни разу не изящно и моему гнусавому перфекционисту рефакторинга™ не нравится
__________________
Дебаггер не предлагать

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

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

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


 


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


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