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

digdig 28.05.2013 23:27

Управление из внешне загруженного клипа в клипе куда загружается
 
Доброго времени суток
Необходима помощь. Есть клип, туда происходит загрузка другого клипа, из загружаемого клипа необходимо произвести команду на предметы и линию времени принимающего клипа. Как? Помогите.

Прикладываю архив там всё понятно

Зарание благодарен

Idon'tKnow 29.05.2013 01:25

Вложений: 1
Ну, вроде, это работает.))) :)

Вложение 29581

НО, я сделал это очень криво. Лишь основную идею попробовал, суть идеи в том:

1. Подписываем Stage в главном клипе на событие.
2. Подписываем ту текстФилд(кнопочку, при клике на которую идёт переход на кадр, на событие клика).
3. В прослушивателе события клика имитируем событие для Stage, на которе подписали в пункте номер 1.
Код AS3:

(stage.dispatchEvent(new Event(Ваше Событие)))

4. В прослушивателе этого события:
a). Удаляем сам прослушиватель(он нам больше не нужен).
б). Делаем переход на второй кадр.
в). Собственно, вроде, всё.

НО, Вам придется написать своё, пользовательское событие, я реализовал саму идею, мне было лень создавать новое событие, я использовал Event.COMPLETE, что очень нежелательно.

P.S. Интересно, а без Stage'a можно задиспатчить это событие(реализовать всё это дело) ?

digdig 29.05.2013 12:00

Большое спасибо Вам за помощь
Но мне всё ещё трудновато, даётся
Выкладываю другой пример, там для меня сложно получается
Помогите разобраться как там и что там

Idon'tKnow 29.05.2013 12:45

К сожалению, я не очень понял, что нужно((( Объясните, пожалуйста, поточнее. Лучше даже имя файлов используйте, чтобы понадежнее. :) Постараюсь помочь, чем смогу.

evgen4ik 29.05.2013 13:12

пересохрани флахи для кс5

digdig 29.05.2013 18:50

Вот сохранил файлы в формате кс5
Доброго времени суток
Постараюсь описать какая помощь мне необходима
Есть главный клип "klip_glav.swf"
В первом фрейме находится клип "zag" - место, куда загружаются внешние флаши
Рядом с "zag" есть "clip_2" - другой клип, который состоит из двух фреймов
Теперь нажимаем на кнопку меню, и загружается внешний файл "zag.swf" в "zag"- место для загрузки.

После загрузки можно рассмотреть клип "zag.swf", который состоит из клипа на сцене "asd1" - клип2 содержащий в себе набор из ничего, кроме красной кнопки.
Внутри клип2 находится линия времени её необходимо рассмотреть.
Открываем клип1 внутри клип2 и видим линию времени клипа 1.
На линии времени клип1 находится красная кнопка при нажатии которой необходимо перенестись в клип2
во фрейм 2 - этот фрейм содержит команду, которая нас перебрасывает во фрейм 3 на этой же линии времени.
Во фрейм 3 находится команда, которая направлена на клип "klip_glav.swf" оттуда команда направляется в "clip_2" - другой клип и перенаправляет на фрейм 2

Помогите

Добавлено через 18 часов 56 минут
S.O.S. Не забывайте

Добавлено через 25 часов 23 минуты
Я всё ещё занят этой задачей, кто может помочь?

GaryV 30.05.2013 21:42

Тема актуальна. Хотелось бы узнать решение. Помогите кто может, в долгу не останусь...

AlexCooper 30.05.2013 21:50

как кто-то уже написал выше диспатчите событие (не обязательно через stage) , а подгрузчик слушает и обрабатывает команды от подгруженного.

Idon'tKnow 30.05.2013 22:00

AlexCooper, очень было интересно, а как реализовать без stage? Что еще общего у этих двух экземпляров есть?

AlexCooper 30.05.2013 22:19

Пишу
external
Код AS3:

var swfController:Loader = new Loader();
swfController.contentLoaderInfo.addEventListener(Event.COMPLETE, setMagic );
swfController.load(new URLRequest('internal.swf'));
 
function setMagic(e:Event):void {
 swfController.content.addEventListener('COMMAND', internalHandler);
}
 
function internalHandler(e:Event):void {
 trace('Internal '+e.target.externalData);
}

internal
Код AS3:

public var externalData:*;
 
addEventListener(Event.ADDED_TO_STAGE, crosscomand);
 
function crosscomand(e:Event):void {
externalData = 'пихаем данные';
dispatchEvent(new Event('COMMAND'));
}

Цитата:

Сообщение от Idon'tKnow (Сообщение 1135704)
AlexCooper, очень было интересно, а как реализовать без stage? Что еще общего у этих двух экземпляров есть?

в ответ на вопрос, общий внутренний клип

Idon'tKnow 30.05.2013 22:26

Огромное спасибо, сейчас изучу))) Пока сидел, вот такую штуку затестил, что тоже работает :D

Код AS3:

addEventListener(Event.COMPLETE, completeEvent);
 
function completeEvent(e:Event):void{
        trace("complete!");
        fl_ClickToLoadUnloadSWF(new MouseEvent(MouseEvent.CLICK));
        removeEventListener(Event.COMPLETE, completeEvent);
        gotoAndStop(2);
 
        }

...

Код AS3:

function clickLis(e:MouseEvent):void{
        trace("click!");
        trace(1234);
        parent.parent.parent.parent.dispatchEvent(new Event(Event.COMPLETE));
        }

Еще раз Спасибо!

AlexCooper 30.05.2013 22:29

можно еще конечно и на прямую вызывать команды из интернала в экстернал, но там чуть сложнее.

Idon'tKnow 30.05.2013 23:07

Вот это немного напрягло, весь код в кадрах. Не даёт объявить public вне пакета.
Scene 1, слой "Actions", кадр 1, строка 41 1114: Атрибут "public" может использоваться только внутри пакета.
Цитата:

Сообщение от AlexCooper (Сообщение 1135708)
Код AS3:

public var externalData:*;


Просто, если бы давало, то можно же было вот так напрямую обращаться к функциям в enternal:

Код AS3:

var swfController:Loader = new Loader();
swfController.contentLoaderInfo.addEventListener(Event.COMPLETE, setMagic );
swfController.load(new URLRequest('internal.swf'));
 
function setMagic(e:Event):void {
 swfController.content.addEventListener('COMMAND', internalHandler);
}
 
function internalHandler(e:Event):void {
 trace('Internal '+e.target.externalData);
 
function checker():void{
trace("it works!");
}
}

Код AS3:

public var externalData:*;
 
addEventListener(Event.ADDED_TO_STAGE, crosscomand);
 
function crosscomand(e:Event):void {
externalData = 'пихаем данные';
dispatchEvent(new Event('COMMAND'));
parent.parent.parent.parent.checker(); // по идее, должно работать.
}

А как написать в кадре код на уровне пакета? Прошу прощения за оффтоп. Буду очень признателен.

AlexCooper 30.05.2013 23:19

Сейчас найду свой исходник.

Добавлено через 19 минут
Писать пора не в кадрах иначе ничего толкового не получиться.

Постараюсь объяснить что тут и как. Все что не прокомментированно пропускайте. Естественно адаптируйте под свои задачи

Main
Код AS3:

package  {
 
        import flash.display.Sprite;
        import flash.events.Event;
 
        import flash.display.StageScaleMode;
 
        import multiapi.MultiConnector;
        import flash.system.Security;
 
 
        public class Preloader extends Sprite {
 
                var cont:Sprite = new Sprite();
 
                public function Preloader() {               
 
                        addChild(cont);
 
                        stage.scaleMode = "noScale";
 
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event=null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        MultiConnector.stage = cont;
                        MultiConnector.connected('inquestion_v2.26.swf');
 
                }
 
                //  A. Получить доступ
                public function get external():Object {
                        return MultiConnector.external;
                }
        }
}

MultiConnector
Код AS3:

package multiapi {
 
        import flash.events.Event;
        import flash.display.Sprite;
        import flash.display.Stage;
 
        import multiapi.data.GlobalData;
 
        public class MultiConnector extends Object {
 
                public static var stage:Sprite;
 
                // статическая ссылка на класс
                protected static var _instance:*;
 
                public function MultiConnector(){}
 
                // B. возвращаем класс
                public static function get external():Object {
 
                        GlobalData.log.add('get external');
 
                        // класс который будет доступен внутренему клипу
                        if (!_instance) _instance = GlobalData.api;
 
                        GlobalData.log.add('external ready');
 
                        return _instance;
                }
 
                public static function connected($url:String):void {
 
                        stage.addChild(GlobalData.log);
 
                        GlobalData.api.init();
 
                        GlobalData.loader.add($url, {'id':'main'});
                        GlobalData.loader.get('main').addEventListener(Event.COMPLETE, loadingMainComplete);
                        GlobalData.loader.start();
 
                }
 
                private static function loadingMainComplete(e:Event):void {
 
                        GlobalData.loader.get('main').removeEventListener(Event.COMPLETE, loadingMainComplete);
                        GlobalData.main = GlobalData.loader.getContent('main',true);
 
                        while (GlobalData.mainTurn.length) {
                                GlobalData.core.callMain(GlobalData.mainTurn[0].using,GlobalData.mainTurn[0].data);
                                GlobalData.mainTurn.shift();
                        }
                        stage.addChild(GlobalData.main);
                }
 
        }
}

GlobalData
Код AS3:

package multiapi.data {
 
        import multiapi.Core;
        import multiapi.connector.UnitedAPI;
        import multiapi.logger.Logger;
        import multiapi.processor.Poster;
 
        import br.com.stimuli.loading.BulkLoader;
 
        import flash.display.MovieClip;
 
 
        public class GlobalData extends Object {
 
                public function GlobalData() {
 
                }
 
                {
                        // собственно сам класс
                        api = new UnitedAPI();
                        core = new Core();
                        log = new Logger();
                        loader = new BulkLoader("loader");
                        poster = new Poster();
 
                        cache = new Object();
                        mainTurn = new Array();
 
                        devApi = 'vk';
                }
 
                public static var core:Core;
                public static var log:Logger;
                public static var loader:BulkLoader;
                public static var api:UnitedAPI;
 
                public static var poster:Poster;
 
                public static var account:Object;
                public static var cache:Object;
 
                public static var main:MovieClip;
                public static var mainTurn:Array;
 
                public static var devApi:String;
        }
}

Все публичные свойства и методы этого класса будут доступны
UnitedAPI
Код AS3:

package multiapi.connector {
 
        import flash.display.Sprite;
 
        import vk.VKConnection;
        import vk.events.*;
 
        import fs.FSConnection;
 
        import com.adobe.serialization.json.JSON;
 
        import multiapi.data.GlobalData;
 
        import flash.events.Event;
 
        public class UnitedAPI extends Sprite {
 
                protected var status:Object;
 
                public var version = "vk";
 
                public var me:Object = new Object();
                public var api2:Object = new Object();
                public var app:Object = new Object();
 
                private var ex:External = new External();
 
                public var multi:*;
 
                public function UnitedAPI() {
                        status = new Object();
                };
 
                public function init():void {
 
                        if (status.ex) return;
 
                        ex.init();
 
                        status.ex = true;
                }
 
                public function initConnection(data:Object=null):void {
 
                        if (!data) data = ex.call("exportAppData");
 
                        if (status.connection) return;
 
                        status.connection = true;
 
                        version = data.api;
 
                        GlobalData.log.add("API detect:"+version);
                        //GlobalData.log.add(data);
 
                        var flashVars = new Object();
 
                        switch (data.api) {
                                case "fs": {
 
                                        me.user_id =  data.userId;
 
                                        flashVars['apiUrl'] = data.apiUrl;
                                        flashVars['apiId'] = data.apiId;
                                        //flashVars['method'] = data.viewer_id;
                                        //flashVars['sig'] = data.sid;
 
                                        multi = new FSConnection(me.user_id, flashVars);
                                        multi.ex = ex;
 
                                        GlobalData.core.run('SET_UID');
                                        break;
                                }
                                case "vk": {
 
                                        api2.api_id        =  data.api_id;
                                        api2.api_url = data.api_url;
                                        api2.auth_key = data.auth_key;
                                        api2.access_token = data.access_token;
                                        api2.secret = data.secret;
 
                                        app.install = data.is_app_user;
                                        app.setting = data.api_settings;
                                        app.lc_name = data.lc_name;
                                        app.session_id = data.sid;
 
                                        me.api = "vk";
                                        me.user_id= data.viewer_id;
                                        me.view_id = data.user_id;
 
                                        flashVars['api_id'] = data.api_id;
                                        flashVars['viewer_id'] = data.viewer_id;
                                        flashVars['sid'] = data.sid;
                                        flashVars['secret'] = data.secret;
 
                                        multi = new VKConnection(flashVars);
 
                                        GlobalData.core.run('SET_UID');
 
                                        break;
                                } default: {
                                        GlobalData.core.run('API_UNDEFINED');
                                        return;
                                }
                        }               
                }
 
                public function getMyUser():void {
 
                        GlobalData.log.add("getMyUser");
 
                        var method = ApiConvertor.usersget(version);
 
                        var params = new Object();
                                params[ApiConvertor.uids(version)] = me.user_id;
                                params[ApiConvertor.fields(version)] = ApiConvertor.fieldsParamsUser(version);                       
 
                        multi.api(method, params , fetchUserInfo, onApiRequestFail);
                }
 
                public function join(event:String, callBack:Function):void {
                        (ex.join(ApiConvertor.event(version,event),callBack)) ? GlobalData.log.add('Join '+event) : GlobalData.log.add('Join '+event+' already');
                }
 
                public function post(user_id:String,options:Object,callBackOk:Function=null,callBackFail=null):void {
 
                        GlobalData.log.add('posting for user > '+user_id);
                        GlobalData.log.add(options);
 
                        if (!callBackFail) callBackFail = onApiRequestFail;
 
                        multi.api("photos.getWallUploadServer", {"uid":user_id}, function(data:Object):void { GlobalData.log.add(data); GlobalData.poster.images(data,user_id,options,callBackOk,callBackFail) } , callBackFail);
                }
 
                public function method($method:String, $data:Object=null):void {
 
                        var method:String = ApiConvertor.method(version,$method);
 
                        GlobalData.log.add('UnitedMethod: '+$method+' API: '+method);
 
                        var send:Object = new Object();
                                send.method = method;
 
                        if ($data) send.data = $data;
 
                        ex.call('method', send);
                }
 
                private function createPendingEvent(event:String,data:Object=null):void {
                        GlobalData.log.add("Event "+event);
                        dispatchEvent(new Event(event));
                }
 
                public function test():String {
                        return "Test call";
                }
 
                private function fetchUserInfo(data: Object): void {
 
                        GlobalData.log.add("<b>*** fetchUserInfo ***</b>");
 
                        var SocialData = ApiConvertor.parsUserData(version,data);                       
 
                        if (SocialData) {
                                GlobalData.log.add(SocialData);
 
                                GlobalData.core.run('SOCIAL_USERDATA', SocialData);
                                GlobalData.core.run('SOCIAL_AUTH');
                        } else {
                                GlobalData.log.add("Error "+data);
                                GlobalData.log.add(data);
                        }
                }
                private function onApiRequestFail(data: Object): void {
 
                        GlobalData.log.add("Error: "+data.error_msg);
                }
                private function wallPostSuccess(data: Object): void {
                        GlobalData.log.add("Success wall.post post_id: "+data.post_id.toString());
                }
                private function wallPostFail(data: Object): void {
                        GlobalData.log.add("Fail wall.post error_msg: "+data.error_msg);
                }
 
        }
 
}

Internal
Код AS3:

ADDED_TO_STAGE
 
wrapper = Object(parent.parent);
 
// функция из класса UnitedAPI
wrapper.external.getMyUser();


Idon'tKnow 30.05.2013 23:47

Спасибо, я не пишу в кадрах, не мой код. Я только начинаю еще свой путь))) Огромное спасибо за исходники, сейчас буду разбираться! :)

AlexCooper 31.05.2013 00:07

Цитата:

Сообщение от Idon'tKnow (Сообщение 1135722)
Спасибо, я не пишу в кадрах, не мой код. Я только начинаю еще свой путь))) Огромное спасибо за исходники, сейчас буду разбираться! :)

но вообще так как я пишу не пишите) Гуру скажут что я учу плохому)

digdig 31.05.2013 12:58

Огромное спасибо! Получилось

XoJlToH 31.05.2013 13:38

Цитата:

Сообщение от Idon'tKnow (Сообщение 1135710)
Код AS3:

function clickLis(e:MouseEvent):void{
        trace("click!");
        trace(1234);
        parent.parent.parent.parent.dispatchEvent(new Event(Event.COMPLETE));
        }


А бабблинг тут работать не будет?

maincode 31.05.2013 14:54

как вариант: в файле zag.swf прописать код
Код AS3:

btn_vixod.addEventListener(MouseEvent.CLICK, exitClickHandler);
 
function exitClickHandler(event:MouseEvent):void
{
        var rootMc: MovieClip = this.stage.getChildAt(0) as MovieClip;
        rootMc.gotoAndStop(2);
}


Idon'tKnow 31.05.2013 18:18

XoJlToH, вот что и странно, что
Код AS3:

parent.dispatchEvent(new Event(Event.COMPLETE));

не даёт результата. Может быть, дело в том, что parent - это мувиклип, в котором содержится кнопка. И всплывает событие в пределах этого мувиклипа?

bumblebee 05.06.2013 18:36

У меня тоже вопрос про клипы, загруженный один в другой
Просматривал документацию youtube(как подключить плеер к своему проекту): https://developers.google.com/youtub...eing_Functions

Там есть интересные строки:
Код AS3:

function onLoaderInit(event:Event):void {
    addChild(loader);
    loader.content.addEventListener("onReady", onPlayerReady);
    loader.content.addEventListener("onError", onPlayerError);
    loader.content.addEventListener("onStateChange", onPlayerStateChange);
    loader.content.addEventListener("onPlaybackQualityChange",
        onVideoPlaybackQualityChange);
}
 
function onPlayerReady(event:Event):void {
    // Event.data contains the event parameter, which is the Player API ID
    trace("player ready:", Object(event).data);
 
    // Once this event has been dispatched by the player, we can use
    // cueVideoById, loadVideoById, cueVideoByUrl and loadVideoByUrl
    // to load a particular YouTube video.
    player = loader.content;
}
 
function onPlayerError(event:Event):void {
    // Event.data contains the event parameter, which is the error code
    trace("player error:", Object(event).data);
}

Заметил, моя флешка получает данные вот этой строкой: Object(event).data

Вопрос, каким образом плеер youtube там записывает, чтобы можно было считать таким выражением?
И что это выражение Object(event).data означает?

Все мои попытки, привели к тому, что выводилась ошибка.

belv 05.06.2013 20:41

Idon'tKnow
не даёт результата. Может быть, дело в том, что parent - это мувиклип, в котором содержится кнопка. И всплывает событие в пределах этого мувиклипа?

Попробуйте протрейсить trace(parent) по моему родителем загруженного swf является Loader , а чтобы обратится к родительской swf-ке нужно писать parent.parent, если я не прав поправьте.


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

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