Форум 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=117208)

koIIImarik 21.10.2008 22:45

Внешний прелоадер и передача параметров в подгружаемую флешку
 
Проблема:

Есть флешка, к которой нужно создать внешний прелоадер. Когда флешка работает отдельно, то всё работает отлично. Нужно отметить, что в главном классе флешки я "запоминаю" stage и root, чтобы к ним можно было обратиться из любого места вот так:

Код:

Имя_класса.stage = this.stage;
Имя_класса.root = this;

Когда эта флешка становится дочерней, т.е. когда её подгружают в другую, this.stage возвращает null.

Можно ли это как-то решить?

И вопрос #2:

Хочется организовать передачу параметров из HTML в Flash, но т.к. у нас будет ещё и ролик прелоадера, то как правильно организовать передачу парамтетров из прелоадера в дочернюю флешку?

За ранее спасибо.

mre 21.10.2008 23:14

Цитата:

Сообщение от koIIImarik (Сообщение 771914)
Когда эта флешка становится дочерней, т.е. когда её подгружают в другую, this.stage возвращает null.
Можно ли это как-то решить?

Можно.
Использовать событие ADDED_TO_STAGE.
Цитата:

Сообщение от koIIImarik (Сообщение 771914)
Хочется организовать передачу параметров из HTML в Flash, но т.к. у нас будет ещё и ролик прелоадера, то как правильно организовать передачу парамтетров из прелоадера в дочернюю флешку?

Как угодно.
Например, присвоить публичной переменной или передать в какой-либо публичный метод класса.

AL.exe 21.10.2008 23:38

Цитата:

Хочется организовать передачу параметров из HTML в Flash, но т.к. у нас будет ещё и ролик прелоадера, то как правильно организовать передачу парамтетров из прелоадера в дочернюю флешку?
Если нужно передавать так же, как из HTML:
http://www.flasher.ru/forum/showthread.php?t=115551

koIIImarik 22.10.2008 02:04

2 AL.exe:
Не могли бы вы выслать любой работающий пример с .as кодом и флешками? Просто я попробовал способ передачи через пары "имя=значение", но во-первых, он у меня не работает, во-вторых, этот способ не совсем правильный я считаю, т.к. флешки не должны при работе с ним кешироваться, да и вообще должен быть нормальный работающий способ сделать это.

В общем, если у вас есть возможность, вышложите пожалуйста куда-нибудь исходники, чтобы я смог посмотреть наглядно что и как там.

За ранее спасибо.

AL.exe 22.10.2008 03:38

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

Код:

/*    Preloader.as    */

package
{
       
        import flash.display.Loader
        import flash.display.Sprite;
        import flash.net.URLRequest;
        import flash.events.Event
        import flash.display.MovieClip
       
       
       
       
        public class Preloader extends Sprite
        {
                private var mainLoader:Loader = new Loader()
                public var movie:Main
               
               
                public function Preloader() {
                       
                        mainLoader.load(new URLRequest("main.swf"))
                        trace("Preloader started")
                       
                        mainLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, startMain)
                       
                }
               
                private function startMain(e:Event)
                {
                        trace("Main Movie loaded")
                       
                        //смотрим старое значение переменной:
                        trace((mainLoader.content as Main).sin)
                       
                       
                        //записываем объект в переменную, потому что напрямую в mainLoader.content нам не дадут присваивать значения переменным
                        movie = (mainLoader.content as Main)
                       
                        movie.sin = "new variable ;)"
                       
                        //смотрим новое:
                        trace(movie.sin)
                       
                        addChild(mainLoader.content)
                }
               
        }
       
}


Код:

/*    Main.as    */
package
{
       
        import flash.display.Sprite;
       
       
        public class Main extends Sprite
        {
               

                public var sin:String = "old variable"
                public var sex:int
                public var salvation:Array
               
               
                public function Main()
                {
                        trace("Main movie started")
                                       
                }
               
        }
       
}

Собственно, прелоадер с базовым классом Preloader грузит main.swf с базовым классом Main и задает ему кастомное свойство "sin", что и иллюстрируется трейсами.

Вывод будет вот такой:

Код:

Preloader started
Main movie started
Main Movie loaded
old variable
new variable ;)

Собственно вот, как Вы и хотели, безо всяких строк с парами имя=значение.

P.S.Что-то я совсем засыпаю, забыл добавить в прелоадер получение FlashVars, но это, в принципе, обсуждалось уже на форуме: Вам нужно будет задействовать в коде прелоадера ассоциативный массив stage.loaderInfo.parameters

koIIImarik 22.10.2008 04:26

2 mre:
За "ADDED_TO_STAGE" спасибо большое, сам бы вряд ли нашёл.

Что касается "в любой момент", то в любой момент не получилось бы, т.к. нужно было, чтобы параметр уже был передан до того, как дочернея флешка будет инициирована.

Ниже мне правильно написали, что нужно использовать "loaderInfo.parameters" я об этом свойстве тоже не знал, пока форум не облазил сильно.

Но в любом случае спасибо за помощь.

2 Al.exe:
Огромное спасибо за то, что натолкнули меня на loaderInfo.parameters. Я у себя решил всё немного по другому, решил, что раз параметр уже есть в родительской флешке, то зачем его "плодить" ещё и в дочерней, просто обращаюсь из дочерней к родительской за нужным параметром.

Спасибо вам =)

etc 22.10.2008 13:59

А что вы вообще там забыли, на stage?

koIIImarik 22.10.2008 20:52

2 etc:
Я внутри дочерней (когда она была ещё единственной флешкой) выставлял параметры для align и scaleMode, а так же проверял в одной функции где сейчас фокус (stage.focus).

mre 23.10.2008 03:17

Цитата:

Сообщение от alekson (Сообщение 772259)
а можно ли сделать чтобы дочерняя флешка работала независемо со своим stage установленном при её проектировании? Т.к. не охото автомономную по сути флеху адаптировать под дочернию.

Нельзя.
stage - един, root - различен.

alekson 23.10.2008 15:19

для передачи параметра в подгружаемую флешку сделал функцию в таймлайне
Код:

function setFile(value:String){
        xmlLoader.file=value;
        if (xmlLoader.file!=null) xmlLoader.loadData();
}

а вот загрузка самой swf
Код:

        private function completeHandler(event:Event):void {
        var mySFW:Object;
            try {
                mySFW=loader.content;
                mySFW.setFile("data/pie_data.xml");
                parentObject.addChild(mySFW);
            } catch (e:ReferenceError){
                    trace('ERROR: '+e);
            }
        }



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

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