Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   swc и много классов (http://www.flasher.ru/forum/showthread.php?t=176445)

AlexFrost 10.03.2012 22:52

swc и много классов
 
прошу помощи, т.к. уже руки и голова пухнут от объёма всего.

есть swc с векторной графикой. каждый спрайт вынесен отдельным классом, типа Ball1...BallN, Car1...CarN etc.

каким образом можно хотя бы полу-автоматизировать процесс для вынесения экземпляров классов на сцену?

т.к. графики уже много + ещё добавляю постоянно.

на данном этапе добавляю всё вручную.
Код AS3:

var ball1:Ball1 = new Ball1();
ball1.x
ball1.y
ball1.buttonmode = true;
ball1.addEventListener
container.addchild(ball1);

а хотелось бы функцию, которая просматривает все объявленные экземпляры
т.е. дело не в самой функции, а на её сути. можно ли какими-либо методами пробегаться по всем или хотя бы по выборке по имени класса?

HardCoder 11.03.2012 00:00

А в чем, собственно, проблема? Не знаете как написать фабричный метод, который добавляет экземпляры?
Это не выход из ситуации, но если вам именно это нужно, то см. ниже.
Код AS3:

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, Вы серьезно?
Код AS3:

var instance:type = new type();

Это не скомпилируется.

@AlexFrost
Попробуйте ApplicationDomain.currentDomain.getDefinition("..."). Ну и try-catch Вам в помощь

HardCoder 11.03.2012 00:11

Цитата:

Сообщение от gloomyBrain (Сообщение 1068238)
@HardCoder, Вы серьезно?
Код AS3:

var instance:type = new type();

Это не скомпилируется.

Действительно, приношу извинения. :rolleyes: В таком случае можно написать так:
Код AS3:

var instance:DisplayObject = new type();


Alex Lexcuk 11.03.2012 00:26

Надо ещё в свойствах проекта поставить что-бы это swc полностью вкомпилилась в флешку (а то классы будут недоступны, они же ни где не прописываются явно) например в flash develop во вкладку
project - properties - swc include library
и потом можно проверять и брать, например
Код AS3:

                        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

так ничего и не понял из советов, как ни пытался...
я делаю приложение - аппликацию.
из кусочков собирать картинки.
Код AS3:

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 минуту
Цитата:

Сообщение от gloomyBrain (Сообщение 1068238)
Попробуйте ApplicationDomain.currentDomain.getDefinition("..."). Ну и try-catch Вам в помощь

Спасибо, ушёл гуглить.

HardCoder 11.03.2012 00:55

Сомневаюсь, что есть такая возможность. Поэтому нужно создать некий список классов, например:
Код AS3:

public static const SWC_CLASSES:Vector.<Class> = new <Class> [kartinka2, kartinka3, kartinkaN, GolayaBaba34];

. В этот список поместить все нужные классы из свц. Так при подключении новой библиотеки каждый раз этот список обновлять новыми (тоько что подключенными) классами

Добавлено через 2 минуты
Потом соответственно циклом проходится по этому списку и делать то что вам нужно. Не думаю что программно можно получить весь список классов библиотеки...

AlexFrost 11.03.2012 00:59

Цитата:

Сообщение от HardCoder (Сообщение 1068249)
Сомневаюсь, что есть такая возможность. Поэтому нужно создать некий список классов, например:
Код AS3:

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/
Код AS3:

import ru.etcs.utils.getDefinitionNames;
 
trace(getDefinitionNames(loaderInfo));//выдаст список классов


AlexFrost 12.03.2012 07:51

Проблему решил.
Для тех, кому потребуется решение проблемы.

Код для FD:
Код AS3:

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);                       
                                }
                }
            }

Дальше можно организовать ещё список-выборку по параметрам. И в цикле штамповать экземпляры по списку.


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

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