![]() |
|
||||||||||
|
|||||
|
Banned
Регистрация: Jan 2012
Сообщений: 25
|
прошу помощи, т.к. уже руки и голова пухнут от объёма всего.
есть swc с векторной графикой. каждый спрайт вынесен отдельным классом, типа Ball1...BallN, Car1...CarN etc. каким образом можно хотя бы полу-автоматизировать процесс для вынесения экземпляров классов на сцену? т.к. графики уже много + ещё добавляю постоянно. на данном этапе добавляю всё вручную. var ball1:Ball1 = new Ball1(); ball1.x ball1.y ball1.buttonmode = true; ball1.addEventListener container.addchild(ball1); т.е. дело не в самой функции, а на её сути. можно ли какими-либо методами пробегаться по всем или хотя бы по выборке по имени класса? Последний раз редактировалось dimarik; 10.03.2012 в 22:56. |
|
|||||
|
А в чем, собственно, проблема? Не знаете как написать фабричный метод, который добавляет экземпляры?
Это не выход из ситуации, но если вам именно это нужно, то см. ниже. public function addInstance(container:DisplayObjectContainer, type:Class, x:Number = 0, y:Number = 0):DisplayObject { var instance:type = new type(); instance.x = x; instance.y = y; //массив, через который обращаться к обьектам instanceArray.push(instance); return container.addChild(instance); }
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
|
@HardCoder, Вы серьезно?
Это не скомпилируется. @AlexFrost Попробуйте ApplicationDomain.currentDomain.getDefinition("..."). Ну и try-catch Вам в помощь
__________________
...вселенская грусть |
|
|||||
|
Цитата:
В таком случае можно написать так:
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
|
Надо ещё в свойствах проекта поставить что-бы это swc полностью вкомпилилась в флешку (а то классы будут недоступны, они же ни где не прописываются явно) например в flash develop во вкладку
project - properties - swc include library и потом можно проверять и брать, например
__________________
Гоночка |
|
|||||
|
Banned
Регистрация: Jan 2012
Сообщений: 25
|
так ничего и не понял из советов, как ни пытался...
я делаю приложение - аппликацию. из кусочков собирать картинки. private function addToPictField(e:MouseEvent):void { var _targetClip:MovieClip = e.currentTarget as MovieClip; var _clipName:String = getQualifiedClassName(_targetClip); var _clipClass:Class = getDefinitionByName(_clipName) as Class; var newClip:MovieClip = new _clipClass(); def... как видите, на этом этапе - всё автоматизировано. а вот на этапе добавления нового элемента - попкин. графики уже безумно много. и ещё добавляю постоянно. пишу полностью в FD. если бы можно было каким-нибудь образом пробегаться по классам из SWC и находить соответствие по имени, скажем, если я буду все классы делать kartinka1, kartinka2, kartinka3....kartinkaN то по содержанию в имени класса kartinka - считать их/заносить в массив и работать уже на уровне цикла. Добавлено через 1 минуту Спасибо, ушёл гуглить. |
|
|||||
|
Сомневаюсь, что есть такая возможность. Поэтому нужно создать некий список классов, например:
public static const SWC_CLASSES:Vector.<Class> = new <Class> [kartinka2, kartinka3, kartinkaN, GolayaBaba34]; Добавлено через 2 минуты Потом соответственно циклом проходится по этому списку и делать то что вам нужно. Не думаю что программно можно получить весь список классов библиотеки...
__________________
Я мало чего умею, но зато хорошо умею учиться... |
|
|||||
|
Banned
Регистрация: Jan 2012
Сообщений: 25
|
Цитата:
Добавлено через 30 секунд Спасибо,HardCoder =) |
|
|||||
|
можно программно получить список классов через магическую библиотеку
http://etcs.ru/blog/as3/getdefinitionnames/
__________________
Гоночка |
|
|||||
|
Banned
Регистрация: Jan 2012
Сообщений: 25
|
Проблему решил.
Для тех, кому потребуется решение проблемы. Код для FD: public class Main extends MovieClip { //СПИСОК ВСЕХ КЛАССОВ ИЗ SWC, КОТОРЫЕ БУДЕМ ДОБАВЛЯТЬ private static const CAS:Vector.<Class> = new <Class> [ca1, ca2, ca3, ..., GoliyMuzhiK]; //ПУСТОЙ СПИСОК. ДЛЯ ДОБАВЛЕНИЯ В НЕГО ВСЕХ ЭКЗЕМПЛЯРОВ НУЖНЫХ КЛАССОВ private static const _CAS:Vector.<Object> = new <Object>[]; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); for (var i:int = 0; i < CAS.length; i++) { var caName:String = getQualifiedClassName(CAS[i]); var caClass:Class = getDefinitionByName(caName) as Class; var newCa:MovieClip = new caClass(); _CAS.push(newCa); } } } Последний раз редактировалось AlexFrost; 12.03.2012 в 18:27. |
![]() |
![]() |
Часовой пояс GMT +4, время: 08:16. |
|
|
« Предыдущая тема | Следующая тема » |
|
|