Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Помогите разобраться с embed swf (http://www.flasher.ru/forum/showthread.php?t=194999)

HraD 26.02.2013 16:51

Помогите разобраться с embed swf
 
Есть такой код:
Код AS3:

package ru.alice {
 
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.utils.getDefinitionByName;
 
public class Symbols extends MovieClip
        {
 
                [Embed(source="../../../bin/games/game1/sym/regular/fall/0.swf", mimeType="application/octet-stream")]
                public const game1RF0:Class;
 
                [Embed(source="../../../bin/games/game1/sym/regular/fall/1.swf",mimeType="application/octet-stream")]
                public const game1RF1:Class;
 
                [Embed(source="../../../bin/games/game1/sym/regular/fall/2.swf",mimeType="application/octet-stream")]
                public const game1RF2:Class;
 
//тут много-много embed кода
 
public function Symbols()
                {
 
                }
 
public function getAsset2(n:String):Sprite
                {
                        var ClassReference:Class = getDefinitionByName(this[n]) as Class;
                        var s:Sprite = new Sprite();
                        var m:MovieClip = new ClassReference() as MovieClip;
                        s.addChild(m);
                        return s;
 
                }
 
        }
 
}

Он компилируется в отдельный swf и подгружается в основной программе:
Код AS3:

 
myAppDomain = new ApplicationDomain();
var context:LoaderContext = new LoaderContext(false, this.myAppDomain);
var my_Loader:Loader = new Loader();
var my_url:URLRequest = new URLRequest("Symbols.swf");
my_Loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingHandler);
my_Loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
my_Loader.load(my_url, context);
 
//....
 
private function loadingHandler(e:Event):void
{
var ClassDefinition:Class = this.myAppDomain.getDefinition("ru.alice.Symbols") as Class;
smbc = new ClassDefinition(); //тут в отладчике видно, что файл загрузился,весь embed есть.
var mc = smbc.getAsset2("game1RF0") //тут ошибка №1065
}

При попытке получить swf из по имени класса происходит ошибка:
Код:

ReferenceError: Error #1065: Переменная [class Symbols_game1RF0] не определена.
        at global/flash.utils::getDefinitionByName()
        at ru.alice::Symbols/getAsset2()
        at ru.alice::Spin3/loadingHandler()[K:\FD\Projects\ALiCEv2\src\ru\alice\Spin3.as:153]

Использую FlashDevelop.
"../../../bin/games/game1/sym/regular/fall/0.swf" - это мувик с элементами AS3.
"game1RF0" - получается в процессе работы программы, типа "имя_игры" + "режим1" + "режим2" + "№ ресурса".

Вопрос, что я делаю не так, и как сделать так, чтобы оно работало?

yasha005 26.02.2013 17:15

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

Wolsh 26.02.2013 18:59

getDefinitionByName() принимает аргументом Строку (n), а Вы отдаете Класс (this[n]). Тот, который ищете.

HraD 26.02.2013 19:10

n я пробовал, ошибка та же

Добавлено через 3 минуты
Цитата:

Сообщение от yasha005 (Сообщение 1122510)
Embed загружает контент при компиляции, его не нужно загружать лоадером, т.к. он уже загружен.
Что же касается выдаваемой ошибки компилятором: тот факт, что вы объявили тип переменной и указали флэшу в каком месте искать данные такого типа, ещё не означает, что переменная содержит какое-то значение до тех пор пока вы ей это значение не присвоите. В данном случае нужно присвоить свойству, экземпляр класса, соответствующему типу этого свойства.

Так там где embed, оно и компилируется отдельно, т.е. это по сути свф с ресурсами. А последнее предложение я, к сожалению, не понял.

Wolsh 26.02.2013 19:53

Цитата:

n я пробовал, ошибка та же
Уверены, что "та же"? Откуда эта идея, что embed swf может быть представлена как просто MovieClip? Это application/octet-stream, то есть массив байт — ByteArray. Вопреки утверждению yasha005, его именно нужно загружать лоадером, только методом loadBytes (поскольку в библиотеке это ByteArray), чтобы получить доступ к его документ-классу.

dimarik 26.02.2013 20:11

Скорее к аппдомену, нежели только к документклассу.

Добавлено через 3 минуты
getDefinitionByName работает только для текущего (корневого) аппдомена текущего security домена и имеет его контекст. Используйте getDefinition взамен.

HraD 27.02.2013 00:20

Цитата:

Сообщение от Wolsh (Сообщение 1122530)
Уверены, что "та же"?

Ну не совсем та же...
Код:

ReferenceError: Error #1065: Переменная game1RF0 не определена.
        at global/flash.utils::getDefinitionByName()
        at ru.alice::Symbols/getAsset2()
        at ru.alice::Spin3/loadingHandler()[K:\FD\Projects\ALiCEv2\src\ru\alice\Spin3.as:153]

Цитата:

Откуда эта идея, что embed swf может быть представлена как просто MovieClip?
Из гугла.
Например http://stackoverflow.com/questions/1...m-external-swf
А почему нет, если там просто мувик в swf?
Цитата:

то application/octet-stream, то есть массив байт — ByteArray
Хорошо, как тогда это брать, чтобы оно было как MovieClip, чтоб можно было управлять его прокруткой, типа stopAtFrame, gotoAndPlay(?), делать addChild() и т.д.?

Цитата:

Используйте getDefinition взамен.
?
В коде
Код AS3:

public function getAsset2(n:String):Sprite
                {
                        var ClassReference:Class = getDefinition(n) as Class;
                        var s:Sprite = new Sprite();
                        var m:MovieClip = new ClassReference() as MovieClip;
                        s.addChild(m);
                        return s;
 
                }

получаем
Код:

Error: Call to a possibly undefined method getDefinition.
или я что-то опять не понял....

П.С. Это уже пост после 2-х дневного перелопачивания гугла, StackerOverflow и подобных сайтов, перепробовал около 10-ти разных
вариантов... незнаю уже...

dimarik 27.02.2013 01:34

Вы даже не удосужились загуглить чей метод getDefinition? Подскажу, это метод экземпляров ApplicationDomain. Его брать у экземпляра LoaderInfo вашего Loader, которым делаете loadBytes

Wolsh 27.02.2013 01:39

Вложений: 1
Вот здесь попробуйте "погуглить"...

dimarik 27.02.2013 01:43

Помимо того, что getDefinitionByName работает только в текущем аппдомене, в параметре необходимо указывать полный путь к классу а ля "flash.display::Sprite". В конце концов, за два дня уже можно было прочитать официальную адобе справку )

HraD 27.02.2013 17:02

Цитата:

Сообщение от Wolsh (Сообщение 1122607)
Вот здесь попробуйте "погуглить"...

Спасибо, теперь разобрался и, к сожалению, понял, что мне это не подходит ((


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

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