Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Загрузчик "Все сразу" (http://www.flasher.ru/forum/showthread.php?t=114881)

enepx 12.08.2008 16:31

Загрузчик "Все сразу"
 
Привет всем.
В моей флешке используются много одинаковых внешних swf-ок. Хочется загрузить одну за один раз, а потом просто брать дубликаты. Полагаться на то, что одинаковые swf-ки кэшируются я не могу (надо брать загруженный дубликат моментально, а не через, например, 0,1с, как при кэшировании) и не хочу.
Идея такая:
Создаю класс ExternalFilesLoader, в котором Loader загружает одну swf-ку в себя. Далее нужна функция, которая бы копировала эту swf-ку и возвращала ее (например, как Loader, не важно). Далее я хочу вызывать эту функцию хоть 100 раз и что бы все подружалось моментально. Тут и есть проблема.
Код:

...
url = new URLRequest("blah-blah.swf");
_sampleLoader= new Loader();
_sampleLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
_sampleLoader.load(url);
...
public function getCopy():Loader {
  var targetClass:Class = _sampleLoader["constructor"];
  var duplicate:Loader = new targetClass();
...

Этот код создает пустой экземпляр Loader. Как вернуть просто копию?
Вообще, моя затея с моментальным возвращением дубликата внешнего файла swf верна?

mre 12.08.2008 16:38

Цитата:

> Вообще, моя затея с моментальным возвращением дубликата внешнего файла swf верна?
Конечно нет.
Зачем подгружать одно и тоже несколько раз.
Подгружаете swf один раз, затем создаете сколько угодно экземпляров включенных в нее данных.
Если конечно они отлинкованы а не просто лежат в главной timeline.

enepx 12.08.2008 16:41

Подождите, может Вы меня не так поняли.
Я и хочу загрузить swf-ку только один раз, т.е. я даже хочу загрузить все внешние swf-ки, используемые в главной флешке один раз, а потом просто брать дубликаты без всяких подгрузок.
Вот и все. И никакой главной таймлайн я не использую (пишу даже не в Flash IDE).

mre 12.08.2008 16:52

Ну так и загружайте один раз.
А что у Вас в этих swf?
Цитата:

> пишу даже не в Flash IDE
А в чем?

enepx 12.08.2008 16:55

Цитата:

Сообщение от mre (Сообщение 757705)
Ну так и загружайте один раз.
А что у Вас в этих swf?

У меня флешка, у нее должна быть поддержка скинов, элементы которых я решил брать из внешних swf-ок. Там содержатся элементы интерфейса, можно так сказать 8).
Цитата:

Сообщение от mre (Сообщение 757705)
А в чем?

В FDT 3.

enepx 12.08.2008 16:57

Цитата:

Сообщение от mre (Сообщение 757705)
Ну так и загружайте один раз.

Дак я и так гружу один раз!
Но как мне потом сделать штук 40 копий этого файла? Если я буду делать addChild, например, то у меня они не будут дублироваться.

mre 12.08.2008 17:06

Цитата:

> Дак я и так гружу один раз!
Но как мне потом сделать штук 40 копий этого файла? Если я буду делать addChild, например, то у меня они не будут дублироваться.
Конечно не будут. Нужно создавать новый экземпляр.
А внешние swf тоже в FDT собирались?

enepx 12.08.2008 17:09

Цитата:

Сообщение от mre (Сообщение 757709)
Нужно создавать новый экземпляр.
А внешние swf тоже в FDT собирались?

Я и создаю новый экземпляр Loader, тока они естественно пустыми получаются. Внешние swf компилятся в Flash IDE, как предполагается, дизайнерами. А это имеет значение, чем компилятся внешние swf? Мы можем ровно с тем же успехом полагать, что грузим jpg вместо swf.

mre 12.08.2008 17:20

Если бы Вы грузили jpg, то можно было использовать один и тот же BitmapData. И на основе него создавать сколько угодно Bitmap.
А в Вашем случае наилучший вариант это запихнуть все данные в одну swf, прописать им классы и пользоваться.

enepx 12.08.2008 17:51

т.е. предлагаете [Embeded]?
Я сначала так и делал, но так не пойдет, не все смогут юзать это.
Или как Вы предлагаете?

mre 12.08.2008 18:04

Тут 2 варианта:

1) Загружать все файлы отдельно, в них прописать Document class.
Затем через applicationDomain получить доступ к Document class и создавать нужное число экземпляров.

2) Все swf запихнуть в библиотеку одного файла, прописать им Linkage. Загрузить этот файл swf. Далее то же самое.

Все это конечно актуально если у Вас есть доступ к исходникам :)

ulik 12.08.2008 18:08

Хм... Думаю, стоит пошаманить в области
Код:

var _sampleLoader:Loader = new Loader();
_sampleLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
_sampleLoader.load(new URLRequest("blah-blah.swf"));

function onLoadComplete(event:Event):void
{
  event.target.content;
}


enepx 12.08.2008 18:17

Я пишу компонент с поддержкой скинов.
Идеально конечно если скин будет являться одним swf-файлом, например, defaultSkin.swf, а в нем будут символы (элементы скина), в которых прописаны заранее декларированные Linkage Class.
Я хочу сделать типа прелоадера, в котором до загрузки всей флешки будет загружаться этот скин swf. Из него я и буду уже множить мои элементы.

mre 12.08.2008 18:19

Ну вот, пункт 2.

etc 12.08.2008 18:21

Попробуйте new loader.content['constructor']. Только сомневаюсь, что будет работать.

enepx 12.08.2008 18:24

Цитата:

Сообщение от mre (Сообщение 757730)
Ну вот, пункт 2.

Плиз, можно более подробно? Я думаю понятно теперь что я хочу... :victory:

P.S. Народ, как вообще делается скинирование в компонентах? Может есть какие-нибудь наработки или готовые решения?

ulik 12.08.2008 18:24

Хм... А чем вам не нравится вариант с png скинами + ScaleBitmap (с поддержкой 9scalegrid)?
Ну, скажем, как это сделано у http://www.bytearray.org/?p=109.
Пример: http://www.foxaweb.com/projects/liqu...eSkinning.html
Пример скина: http://www.foxaweb.com/projects/liqu...utton_skin.png

Я, на пример, давно взял png скины на вооружение. И не нужны никакие linkage + универсальнее метод.

Цитата:

Попробуйте new loader.content['constructor']. Только сомневаюсь, что будет работать.
Денис, ты телепат :)

enepx 12.08.2008 18:28

у меня кроме шкурки должен быть функционал небольшой, например, создаем символ-кнопку, у класса этого символа должна быть функция setText(), которая устанавливает текст на кнопке, а как это будет обрабатываться внутри моей флешке уже все равно. Т.е. у некоторых элементов будет взаимодействие через мини API.

Цитата:

Сообщение от __etc (Сообщение 757731)
Попробуйте new loader.content['constructor']. Только сомневаюсь, что будет работать.

пипец, работает... :drinks: :drinks: :drinks:
спасибо всем!

ulik 12.08.2008 18:33

Ну, а в чем проблема-то?
Вам нужно-то всего навсего сделать класс Skin, который будет парсить bitmapdatу pngшки и scalebitmap. В итоге в каждом вашем интерфейсе будет что-то типа:

Код:

var skin:Skin = new Skin();
var bg:ScaleBitmap = new ScaleBitmap();

skin.addEventListener(Event.COMPLETE, skinLoaded);
skin.load(new URLRequest("skin.png"));

function skinLoaded(event:Event):void
{
  bg.bitmapdata = skin.bitmapdata;
  bg.scale9grid = skin.scale9grid;
  addChild(bg);
}


enepx 12.08.2008 18:55

Цитата:

Сообщение от __etc (Сообщение 757731)
new loader.content['constructor']

А как мне можно достучаться до Linkage Class таким способом? Что-то не получается... Т.е. у меня в библиотеке есть символ с Linkage Class, и мне хочется создать экземпляр именно этого символа.
Спасибо заранее..

mre 12.08.2008 19:00

Код:

var c:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("ClassName") as Class;
var obj:Sprite = new c();


enepx 12.08.2008 19:06

Цитата:

Сообщение от mre (Сообщение 757750)
Код:

var c:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("ClassName") as Class;
var obj:Sprite = new c();


Мега круто! Спасибо!!
Чувствую выльется все это у меня в SkinManager на основе swf-файлов.
Но и внедрение PNG нужно попробовать...

ulik 12.08.2008 21:37

Хм... Ну, если исходить из эстетической точки зрения, то, если вам важно именно веторные скины, используйте.
Но это не практично. Объясню. В свое время (когда я писал Skin, SkinManager) то понял, что наши дизайнеры не знают linkage :) (что не удивительно), зато они знают Export as: *.png (32) в фотошопе. А когда я прихожу на работу и у меня лежат 50 Fla и в каждом по 30 скинов = 30*50 = 1500 и каждому надо linkage задать, то я понял, что лучше PNG скины. И им проще и мне проще, а на визуальную часть никак "глазом" не влияет.
Фишка вся в png в том, что любой может потом скинить и flash-разработчик и дизайнер. Поэтому от swf я отказался. Так что... Есть над чем подумать

enepx 12.08.2008 23:36

Ты прав,
мне вектор особо ни к чему, но я вижу и другие плюсы swf - скомпиленная сборка, при желании ее не вскроешь и/или не изменишь, т.е. любой может распространять скин. В png есть, конечно, свои плюсы.
А ты юзаешь этот LiquidComponent? Он фри?

ulik 13.08.2008 14:02

Decompiler кто-то отменял? ;)
enepx не надо паранои. На все есть принт-скрин + ф-ия trace в Corel X3 (отлично битмапки трейсит). И на swf и на png. Так что... Цена вопроса..
Цитата:

А ты юзаешь этот LiquidComponent? Он фри?
Конечно. Жаль, во Flex/Flash не такие компоненты. Я их доделал для себя и использую, когда нужно. Ну, он же опен-сурсный. Скачай исходники и балуйся :)

wvxvw 13.08.2008 20:19

У класса Loader начиная с версии плеера 115 существует свойство .bytes. После загрузки чего бы то ни было можно это свойство заполучить и записать в ByteArray, чем оно и является. Таким образом вы сможете насоздавать сколько угодно копий загруженного контента просто с помощью ByteArray.writeBytes()

miramax 14.08.2008 01:13

Даже проще =)
У Loader'a помимо метода load(URLRequest), есть метод loadBytes(byteArray).
Загружаем внешний файл как массив байтов, и лоадером считываем этот массив неограниченное число раз внутри программы.
*метод, loadBytes - тоже асинхронный, поэтому рекомендую обращаться к событию окончания загрузки.
Код:

                public var urlLoader:URLLoader = new URLLoader();
               
                public function LoaderTest()
                {
                        urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
                        urlLoader.load(new URLRequest('image.png'));
                        urlLoader.addEventListener(Event.COMPLETE, bytesLoaded);
                }
                public function bytesLoaded(e:Event):void
                {
                        var byteArray:ByteArray = ByteArray(urlLoader.data);

                        var loader1 = new Loader();
                        loader1.loadBytes(byteArray);
                        addChild(loader1);
                       
                       
                        var loader2 = new Loader();
                        loader2.loadBytes(byteArray);
                        addChild(loader2);
                        loader2.x = loader2.y = 20
                }


wvxvw 14.08.2008 02:45

В случае с SWF-кой не очень удобно, т.как она загрузится заархивированая (т.е потом на каждое прочтение ее нужно будет опять разархивировать), а .byes это уже разархивированая флешка. Ну, хотя, тоже, зависит, что критичнее.

mre 14.08.2008 11:11

Но ведь так будет расходоваться в n раз больше памяти.

BlooDHounD 14.08.2008 11:53

в обоих случаях памяти будет знатно жраться :)

mre 14.08.2008 12:30

Ну я оба случая и имел в виду :)
Если создать n отлинкованных экземпляров объекта и n копий с помощью loadBytes, разница в расходе памяти и будет в n раз.

enepx 14.08.2008 15:16

Цитата:

Сообщение от ulik (Сообщение 757902)
Decompiler кто-то отменял? ;)
enepx не надо паранои. На все есть принт-скрин + ф-ия trace в Corel X3 (отлично битмапки трейсит). И на swf и на png. Так что... Цена вопроса..

Решил использовать swf, как контейнер не только для хранения графики, но и для звука, кода (каждый пользователь сам определяет как будет себя вести его скин, например, при вызове у него функции setCaption) и т.д. Так что убодно имхо. :away:


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

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