as3 - получение символов библиотеки из класса Assets

Я создал файл assets.swf, в котором хочу сохранить все свои символы. Затем я создал класс Assets, который выполняет встраивание. Выглядит это так:

public class Assets extends MovieClip
    {
        [Embed(source="assets.swf", symbol="MyBox")]
        public static var MyBox:Class;

        public function Assets() 
        {

        }

    }

Теперь, в каком-то другом классе, я хочу создать новый ящик:

import com.company.Assets;
...
public function Game() 
{

    var myBox:MovieClip = new Assets.MyBox();
    addChild(myBox);

}

Я знаю это неверно и получаю «TypeError: Error # 1007: попытка создания экземпляра на неконструкторе». Как я могу получить доступ к активам в классе Assets?


person Community    schedule 23.09.2009    source источник
comment
Вы уверены, что symbol = MyBox - правильное имя символа? Потому что, кажется, вы делаете это правильно согласно bit-101.com/blog/? p = 853   -  person Amarghosh    schedule 24.09.2009
comment
У меня тоже такая же проблема.   -  person Johan Carlsson    schedule 19.11.2009
comment
Вы используете Flash или FlashDeveloper? Я начинаю подозревать, что это функция FlashDeveloper (а не функция AS3)   -  person Johan Carlsson    schedule 19.11.2009


Ответы (4)


Изменить: я думаю, вы найдете ответ здесь.

Следующее относится к использованию классов из SWF, загруженного с классом Loader.

private function onLoad(e:Event):void
{
 var domain:ApplicationDomain = LoaderInfo(e.target).applicationDomain;
 var Type:Class = domain.getDefinition("pack.MyComponent") as Class;
 var myBox:MovieClip = new Type();
 addChild(myBox);
}
person Amarghosh    schedule 24.09.2009

Еще один хороший способ добиться этого - просто скомпилировать SWC и импортировать его, как другой класс.

Каждый символ, экспортированный для AS внутри SWC, будет доступен вам в той же области.

Это позволяет сэкономить на написании кода и встраивать ресурсы непосредственно в ваш SWF, избегая использования нескольких загрузчиков.

person gcstr    schedule 24.09.2009

Если вам по-прежнему нужен маршрут .swf, вы можете:

public class Assets extends MovieClip
    {
        [Embed(source="assets.swf", symbol="MyBox")]
        private static var _MyBox:Class;
        public static function get NewBox():MovieClip {
            return new _MyBox();
        }
    }
...

import com.company.Assets;
...
public function Game() 
{

    var myBox:MovieClip = Assets.NewBox;
    addChild(myBox);

}

Альтернативой является экспорт символов, которые вы хотите использовать в Action Script, и использование взамен .swc. Вы можете установить классы с полным пространством имен внутри флеш-файла, поэтому для MyBox вы можете сделать его com.company.Assets.MyBox, и использование будет аналогично тому, что вы планировали:

import com.company.Assets.*;
...
public function Game() 
{

    var myBox:MovieClip = new MyBox();
    addChild(myBox);

}
person eglasius    schedule 24.09.2009

Вы можете создавать новые объекты в классе Asset .. (это также дает вам возможность создать пул повторно используемых ресурсов)

что-то типа:

public class Assets extends MovieClip
{
    [Embed(source="assets.swf", symbol="MyBox")]
    private static var MyBox:Class;

    public static function getNewBox():DisplayObject {
        return new MyBox();
    }

    public function Assets() 
    {

    }
}
person Carlo    schedule 07.10.2009