Просмотр полной версии : swc и много классов
AlexFrost
10.03.2012, 22:52
прошу помощи, т.к. уже руки и голова пухнут от объёма всего.
есть swc с векторной графикой. каждый спрайт вынесен отдельным классом, типа Ball1...BallN, Car1...CarN etc.
каким образом можно хотя бы полу-автоматизировать процесс для вынесения экземпляров классов на сцену?
т.к. графики уже много + ещё добавляю постоянно.
на данном этапе добавляю всё вручную.
var ball1:Ball1 = new Ball1();
ball1.x
ball1.y
ball1.buttonmode = true;
ball1.addEventListener
container.addchild(ball1);
а хотелось бы функцию, которая просматривает все объявленные экземпляры
т.е. дело не в самой функции, а на её сути. можно ли какими-либо методами пробегаться по всем или хотя бы по выборке по имени класса?
HardCoder
11.03.2012, 00:00
А в чем, собственно, проблема? Не знаете как написать фабричный метод, который добавляет экземпляры?
Это не выход из ситуации, но если вам именно это нужно, то см. ниже. 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);
}
gloomyBrain
11.03.2012, 00:04
@HardCoder, Вы серьезно?
var instance:type = new type();
Это не скомпилируется.
@AlexFrost
Попробуйте ApplicationDomain.currentDomain.getDefinition("..."). Ну и try-catch Вам в помощь
HardCoder
11.03.2012, 00:11
@HardCoder, Вы серьезно?
var instance:type = new type();
Это не скомпилируется.Действительно, приношу извинения. :rolleyes: В таком случае можно написать так:var instance:DisplayObject = new type();
Alex Lexcuk
11.03.2012, 00:26
Надо ещё в свойствах проекта поставить что-бы это swc полностью вкомпилилась в флешку (а то классы будут недоступны, они же ни где не прописываются явно) например в flash develop во вкладку
project - properties - swc include library
и потом можно проверять и брать, например
if (loaderInfo.applicationDomain.hasDefinition('CellRenderer_downSkin')) {
var myClass:Class = loaderInfo.applicationDomain.getDefinition('CellRenderer_downSkin') as Class;
trace(describeType(myClass));//посмотреть свойства
}
AlexFrost
11.03.2012, 00:48
так ничего и не понял из советов, как ни пытался...
я делаю приложение - аппликацию.
из кусочков собирать картинки.
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...
т.е. на щелчок по выбранной картинке её копия появляется в PictField.
как видите, на этом этапе - всё автоматизировано. а вот на этапе добавления нового элемента - попкин.
графики уже безумно много. и ещё добавляю постоянно.
пишу полностью в FD.
если бы можно было каким-нибудь образом пробегаться по классам из SWC и находить соответствие по имени, скажем, если я буду все классы делать kartinka1, kartinka2, kartinka3....kartinkaN то по содержанию в имени класса kartinka - считать их/заносить в массив и работать уже на уровне цикла.
Добавлено через 1 минуту
Попробуйте ApplicationDomain.currentDomain.getDefinition("..."). Ну и try-catch Вам в помощь
Спасибо, ушёл гуглить.
HardCoder
11.03.2012, 00:55
Сомневаюсь, что есть такая возможность. Поэтому нужно создать некий список классов, например: public static const SWC_CLASSES:Vector.<Class> = new <Class> [kartinka2, kartinka3, kartinkaN, GolayaBaba34];. В этот список поместить все нужные классы из свц. Так при подключении новой библиотеки каждый раз этот список обновлять новыми (тоько что подключенными) классами
Добавлено через 2 минуты
Потом соответственно циклом проходится по этому списку и делать то что вам нужно. Не думаю что программно можно получить весь список классов библиотеки...
AlexFrost
11.03.2012, 00:59
Сомневаюсь, что есть такая возможность. Поэтому нужно создать некий список классов, например: public static const SWC_CLASSES:Vector.<Class> = new <Class> [kartinka2, kartinka3, kartinkaN, GolayaBaba34];. В этот список поместить все нужные классы из свц. Так при подключении новой библиотеки каждый раз этот список обновлять новыми (тоько что подключенными) классами
Добавлено через 2 минуты
Потом соответственно циклом проходится по этому списку и делать то что вам нужно. Не думаю что программно можно получить весь список классов библиотеки...
по-моему, это то, что мне нужно =)))
Добавлено через 30 секунд
Спасибо,HardCoder =)
Alex Lexcuk
11.03.2012, 01:14
можно программно получить список классов через магическую библиотеку
http://etcs.ru/blog/as3/getdefinitionnames/
import ru.etcs.utils.getDefinitionNames;
trace(getDefinitionNames(loaderInfo));//выдаст список классов
AlexFrost
12.03.2012, 07:51
Проблему решил.
Для тех, кому потребуется решение проблемы.
Код для 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:06
да уж решение
new ca1();
new ca2();
new ca3();
О господь да оно же работает!
И еще немного магии
for (var i:int = 0; i < CAS.length; i++) {
var newCa:MovieClip = new CAS[i]();
_CAS.push(newCa);
}
Не слушайте его. Я хоть и нуб, но вижу разницу.
Твой вариант требует в два с лишним раза больше кода для добавления нового элемента.
У меня чтобы добавить новый элемент - достаточно прописать имя класса в ...<Class>[]
А ты предложил добавлять имя класса в список и потом ещё в entrypoint дублировать вставку.
AlexFrost
12.03.2012, 18:15
CAS[i] - это [class ca[i]] а не [object ca[i]]
Добавлено через 38 секунд
твой вариант работать не будет. перепроверил. работает. но всё равно он требует кода больше чем в два раза.
AlexFrost
12.03.2012, 18:26
всё равно - в твоём примере в разы больше кода.
счёт идёт на сотни таких классов.
AlexFrost
12.03.2012, 18:42
где больше то? :D
Я показал тебе на то что у тебя 2 лишние операции выполняются в остальном все то же самое
И еще что ты можешь классы использовать просто там где нужно(хотя очевидно что тебе нужно скопом создать кучу объектов)
где больше:
new ca1; new ca2; new..... new caN; // - эти строки и есть "больше"
+в моём случае я могу делать выборку и не создавать заведомо лишние экземпляры, при этом всегда сохраняя "путь" для возвращения их обратно.
AlexFrost
12.03.2012, 19:06
да я понимаю. просто и ты пойми - это - приложение - аппликация.
эти классы подключаются только в одном месте в коде.
нужно быстрое МАССОВОЕ внедрение.
делал только исходя из скорости дальнейших обновлений.
AlexFrost
12.03.2012, 19:13
всё дело в том, что _CAS[] - это не конечная выборка.
по выбору пользователя - есть доступ либо к одним, либо к другим элементам.
поэтому удобнее использовать именно так, чтобы не думать где вручную добавлять а где нет.
HardCoder
12.03.2012, 19:22
AlexFrost, что вы ерунду говорите?
AlexFrost
12.03.2012, 19:28
ну пусть это будет ерунда.
мой код работает именно так как мне нужно.
-____-
хотите предложить альтернативу для тех кто столкнётся с похожей проблемой - пишите код, а не тыкайте в меня пальцем.
-____-
Добавлено через 2 минуты
вот как тут не было полного (пусть даже и не самого хорошего) кода для решения проблемы - вас всё устраивало.
а как я выложил своё решение - пошли плевки.
HardCoder
12.03.2012, 19:44
ну пусть это будет ерунда.
мой код работает именно так как мне нужно.Я вам скажу одну вещь. Не документированную. Я к ней сам пришел со временем:
Код нужно писать не так как вам нужно, а так как будет удобно конечному пользователю вашего приложения.
Я не просто так сказал, что вы говорите "ерунду". Это же выплывает из ваших слов. Вам предложили код в два раза короче, вашего://Ваш:
var caName:String = getQualifiedClassName(CAS[i]);
var caClass:Class = getDefinitionByName(caName) as Class;
var newCa:MovieClip = new caClass();
_CAS.push(newCa);
//Предложенный:
var newCa:MovieClip = new CAS[i]();
_CAS.push(newCa);
А вы пишете:Твой вариант требует в два с лишним раза больше кода для добавления нового элемента.Разве это не...не знаю как назвать (на "ерунда" вы похоже, обиделись).
Мало того ваш код не только в два раза длиннее, но и занимает в два раза больше процессорных вычислений - он в два раза медленнее. Вы заставляете процессор делать то что не нужно.
хотите предложить альтернативу для тех кто столкнётся с похожей проблемой - пишите код, а не тыкайте в меня пальцем.Так вам же написали, но вы говорите, что ваш код лучше.
Мало того ваш код не только в два раза длиннее, но и занимает в два раза больше процессорных вычислений
Ещё и в два раза больше памяти (создаётся 2 объекта каждого типа)
AlexFrost
12.03.2012, 20:31
HardCoder.
На пальцах:
Предложенный вариант:
private static const CAS:Vector.<Class> = new <Class>
[ca1, ca2, ca3, ca4, ca5, ca6, ca7, ca8, ca9, ca10, ca11, ca12,
ca13, ca14, ca15, ca16, ca17, ca18, ca19, ca20, ca21, ca22, ca23, ca24,
ca25, ca26, ca27, ca28, ca29, ca30, ca31, ca32, ca33, ca34, ca35, ca36,ca37
ca38,ca39,ca40,ca41,ca42,ca43,ca44,ca45,ca46,ca47,ca48,ca49,ca50,ca51,ca52,ca53,ca54,ca55,
ca56,ca57,ca58,ca59,ca60, ca61, ca62, ca63, ca64];
public function Main():void
{
new ca1; new ca2; new ca3; new ca4; new ca5; new ca6; new ca7; new ca8; new ca9; new ca10;
new ca11; new ca12; new ca13; new ca14; new ca15; new ca16; new ca17; new ca18; new ca19;
new ca20; new ca21; new ca22; new ca23; new ca24; new ca25; new ca26; new ca27; new ca28;
new ca29; new ca30; new ca31; new ca32; new ca33; new ca34; new ca35; new ca36; new ca37;
new ca38; new ca39; new ca40; new ca41; new ca42; new ca43; new ca44; new ca45; new ca46;
new ca47; new ca48; new ca49; new ca50; new ca51; new ca52; new ca53; new ca54; new ca55;
new ca56; new ca57; new ca58, new ca59; new ca60; new ca61; new ca62; new ca63; new ca64;
var newCa:MovieClip = new CAS[i]();
_CAS.push(newCa);
}
Мой вариант:
private static const CAS:Vector.<Class> = new <Class>
[ca1, ca2, ca3, ca4, ca5, ca6, ca7, ca8, ca9, ca10, ca11, ca12,
ca13, ca14, ca15, ca16, ca17, ca18, ca19, ca20, ca21, ca22, ca23, ca24,
ca25, ca26, ca27, ca28, ca29, ca30, ca31, ca32, ca33, ca34, ca35, ca36,ca37
ca38,ca39,ca40,ca41,ca42,ca43,ca44,ca45,ca46,ca47,ca48,ca49,ca50,ca51,ca52,ca53,ca54,ca55,
ca56,ca57,ca58,ca59,ca60, ca61, ca62, ca63, ca64];
public function Main():void
{
var caName:String = getQualifiedClassName(CAS[i]);
var caClass:Class = getDefinitionByName(caName) as Class;
var newCa:MovieClip = new caClass();
_CAS.push(newCa);
}
Да, действительно ВАШ КОРОЧЕ! ОФИГЕННО КОРОЧЕ!
А ещё возьмите имена классов не ca1234 а другие как например stfu_or_die. Да вы запаритесь вносить новые элементы уже на третьем десятке.
AlexFrost
12.03.2012, 20:44
я прекрасно понимаю про лишние вычисления.
но само по себе приложение - маленькое. даже с х00 такими классами - оно не загружает процессор больше чем на 6-8%.
А комп мой ещё 4 года назад стоил 10к. Можете представить себе его конфиг.
а вот ДОБАВЛЯТЬ эти х00 классов в список при таком решении - очень удобно.
Достаточно держать FD открытым и подписывать вновьсозданные классы из IDE.
HardCoder
12.03.2012, 20:47
Да, действительно ВАШ КОРОЧЕ! ОФИГЕННО КОРОЧЕ!Неудачный у вас сарказм... Потому что такой (перевый) вариант вам никто не предлагал. Вам предложили:
private static const CAS:Vector.<Class> = new <Class>
[ca1, ca2, ca3, ca4, ca5, ca6, ca7, ca8, ca9, ca10, ca11, ca12,
ca13, ca14, ca15, ca16, ca17, ca18, ca19, ca20, ca21, ca22, ca23, ca24,
ca25, ca26, ca27, ca28, ca29, ca30, ca31, ca32, ca33, ca34, ca35, ca36,ca37
ca38,ca39,ca40,ca41,ca42,ca43,ca44,ca45,ca46,ca47,ca48,ca49,ca50,ca51,ca52,ca53,ca54,ca55,
ca56,ca57,ca58,ca59,ca60, ca61, ca62, ca63, ca64];
public function Main()
{
for (var i:uint = 0; i < CAS.length; i++){
var newCa:MovieClip = new CAS[i]();
_CAS.push(newCa);
}
}
AlexFrost
12.03.2012, 20:50
Неудачный у вас сарказм... Потому что такой (перевый) вариант вам никто не предлагал. Вам предложили:
private static const CAS:Vector.<Class> = new <Class>
[ca1, ca2, ca3, ca4, ca5, ca6, ca7, ca8, ca9, ca10, ca11, ca12,
ca13, ca14, ca15, ca16, ca17, ca18, ca19, ca20, ca21, ca22, ca23, ca24,
ca25, ca26, ca27, ca28, ca29, ca30, ca31, ca32, ca33, ca34, ca35, ca36,ca37
ca38,ca39,ca40,ca41,ca42,ca43,ca44,ca45,ca46,ca47,ca48,ca49,ca50,ca51,ca52,ca53,ca54,ca55,
ca56,ca57,ca58,ca59,ca60, ca61, ca62, ca63, ca64];
public function Main():void
{
for (var i:uint = 0; i < CAS.length; i++){
var newCa:MovieClip = new CAS[i]();
_CAS.push(newCa);
}
}
значит я не верно понял. потому как там было по-другому написано. приношу извинения.
HardCoder
12.03.2012, 21:12
1) Инклудь всю либу целиком со всеми классами
2) http://etcs.ru/blog/as3/getdefinitionnames/
3) Создавай списки по нужному признаку, создавай объекты из нужных списокв
В итоге не нужно писать эти 64 класса в массиве или stfu_or_dieOhcysp Regit, я не использовал этот класс, поэтому могу ошибаться. Но мне кажется, что здесь он не совсем подойдет. Ведь, как я понял из описания - он возвращает список всех классов в конкретном домене, или же список linked классов конкретного домена вцелом. То есть: если у нас есть одна флешка с внедренными классами из 10 библиотек, то мы не получим список классов только из одной конкретной библиотеки, с которой нам нужно, а получим из всех библиотек. Поэтому такой список нужно создавать вручную так или иначе (словарь, массив, вектор...кому как нравится). Если ошибаюсь, пусть Денис или Ohcysp Regit поправят.
Добавлено через 3 минуты
Хотя, думаю, AlexFrost сам должен определиться - что именно ему больше подходит. Так как неизвестна структура его проекта и цели.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.