Просмотр полной версии : Управление из внешне загруженного клипа в клипе куда загружается
Доброго времени суток
Необходима помощь. Есть клип, туда происходит загрузка другого клипа, из загружаемого клипа необходимо произвести команду на предметы и линию времени принимающего клипа. Как? Помогите.
Прикладываю архив там всё понятно (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 можно задиспатчить это событие(реализовать всё это дело) ?
Большое спасибо Вам за помощь
Но мне всё ещё трудновато, даётся
Выкладываю другой пример (http://www.svadba-dubrovka.ru/ex1.zip), там для меня сложно получается
Помогите разобраться как там и что там
Idon'tKnow
29.05.2013, 12:45
К сожалению, я не очень понял, что нужно((( Объясните, пожалуйста, поточнее. Лучше даже имя файлов используйте, чтобы понадежнее. :) Постараюсь помочь, чем смогу.
evgen4ik
29.05.2013, 13:12
пересохрани флахи для кс5
Вот сохранил файлы в формате кс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 минуты
Я всё ещё занят этой задачей, кто может помочь?
Тема актуальна. Хотелось бы узнать решение. Помогите кто может, в долгу не останусь...
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
Спасибо, я не пишу в кадрах, не мой код. Я только начинаю еще свой путь))) Огромное спасибо за исходники, сейчас буду разбираться! :)
но вообще так как я пишу не пишите) Гуру скажут что я учу плохому)
Огромное спасибо! Получилось
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 означает?
Все мои попытки, привели к тому, что выводилась ошибка.
Idon'tKnow
не даёт результата. Может быть, дело в том, что parent - это мувиклип, в котором содержится кнопка. И всплывает событие в пределах этого мувиклипа?
Попробуйте протрейсить trace(parent) по моему родителем загруженного swf является Loader , а чтобы обратится к родительской swf-ке нужно писать parent.parent, если я не прав поправьте.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.