PDA

Просмотр полной версии : Управление из внешне загруженного клипа в клипе куда загружается


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

Прикладываю архив там всё понятно (http://www.svadba-dubrovka.ru/example_1.zip)

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

Idon'tKnow
29.05.2013, 01:25
Ну, вроде, это работает.))) :)

29581

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

1. Подписываем Stage в главном клипе на событие.
2. Подписываем ту текстФилд(кнопочку, при клике на которую идёт переход на кадр, на событие клика).
3. В прослушивателе события клика имитируем событие для Stage, на которе подписали в пункте номер 1.(stage.dispatchEvent(new Event(Ваше Событие)))
4. В прослушивателе этого события:
a). Удаляем сам прослушиватель(он нам больше не нужен).
б). Делаем переход на второй кадр.
в). Собственно, вроде, всё.

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

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

digdig
29.05.2013, 12:00
Большое спасибо Вам за помощь
Но мне всё ещё трудновато, даётся
Выкладываю другой пример (http://www.svadba-dubrovka.ru/ex1.zip), там для меня сложно получается
Помогите разобраться как там и что там

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

evgen4ik
29.05.2013, 13:12
пересохрани флахи для кс5

digdig
29.05.2013, 18:50
Вот сохранил файлы в формате кс5 (http://www.svadba-dubrovka.ru/ex2.zip)
Доброго времени суток
Постараюсь описать какая помощь мне необходима
Есть главный клип "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

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

public var externalData:*;

addEventListener(Event.ADDED_TO_STAGE, crosscomand);

function crosscomand(e:Event):void {
externalData = 'пихаем данные';
dispatchEvent(new Event('COMMAND'));
}


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

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

addEventListener(Event.COMPLETE, completeEvent);

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

}

...

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" может использоваться только внутри пакета.


public var externalData:*;



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

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!");
}
}

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
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
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
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
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
ADDED_TO_STAGE

wrapper = Object(parent.parent);

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

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

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

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

digdig
31.05.2013, 12:58
Огромное спасибо! Получилось

XoJlToH
31.05.2013, 13:38
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 прописать код

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, вот что и странно, что parent.dispatchEvent(new Event(Event.COMPLETE));
не даёт результата. Может быть, дело в том, что parent - это мувиклип, в котором содержится кнопка. И всплывает событие в пределах этого мувиклипа?

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

Там есть интересные строки:
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, если я не прав поправьте.