![]() |
|
||||||||||
|
|||||
|
Регистрация: Nov 2005
Сообщений: 149
|
Здравствуйте.
Есть два клипа loader & loaded. Прошу, не обращайте внимание, что скрипт для Loader написан в АС1 - это по-быстрому для наглядности и здесь проблем нет import mx.events.EventDispatcher;
import mx.utils.Delegate;
var dispatchEvent:Function;
var removeEventListener:Function;
var addEventListener:Function;
var game:MovieClip = createEmptyMovieClip("game_mc",0);
var mclListener:Object = new Object();
mclListener.onLoadInit = function()
{
game.addEventListener("fromGame", Delegate.create(this, gameHandler));
}
var ml:MovieClipLoader = new MovieClipLoader();
ml.addListener(mclListener);
ml.loadClip("loaded.swf", game);
function gameHandler(o:Object):Void
{
trace("fromGame");
}
это то, что в loaded - но мне не очень нравится работа с рутом. Спасибо Последний раз редактировалось iNils; 13.10.2006 в 17:37. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
А что ты хочешь оставить в _root? Если уж так хочется, то можешь юзать LocalConnection…
з.Ы. Delegate.create(this,gameHandler) — ссылка будет на mclListener внутри gameHandler. Я не вижу смысла в создании Listener-а, почему бы не подписать самого себя на события MovieClipLoader-а? |
|
|||||
|
Регистрация: Nov 2005
Сообщений: 149
|
__etc, код для лоадера грязен, он лишь для экспериментов. Там и делегат я случайно всунул - по-привычке из АС2. Проблема у меня с подгружаемым - и то теоритическая. В руте подгружаемого клипа я хотел бы оставить только инициализацию класса и все. Но, понятно, что в таком случае loader должен подписываться на события примерно так game.B.addEventListener(тра-ла-ла). Т.е. я должен знать имя объекта класса внутри loaded - а вот этого-то я и не хочу знать.
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Тогда сделайте один общий класс, у которого одно из статических свойств ссылается на интерфейс. А в loaded.swf напишите класс, реализующий данный интерфейс и замените ссылку в общем классе на данный.
Если непонятно, я объясню на примере. Последний раз редактировалось etc; 13.10.2006 в 18:12. |
|
|||||
|
Регистрация: Nov 2005
Сообщений: 149
|
интересно для меня. К сожалению, я довольно плохо разбираюсь в интерфейсах (во всяком случае с данным их назначением). Не могли бы для примера дать пару строк принципиального кода?
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
У нас есть интерфейс IGameClass:
interface IGameClass {
public function addEventListener():Void;
public function removeEventListener():Void;
}
Есть класс GameClass, реализующий IGameClass: import LinkExchanger;
import IGameClass;
import mx.events.EventDispatcher;
class GameClass implements IGameClass {
private var dispatchEvent:Function;
public function GameClass() {
EventDispatcher.initialize(this);
LinkExchanger.game = this;
Mouse.addListener(this);
}
public function addEventListener():Void {
// EventDispatcher native code
}
public function removeEventListener():Void {
// EventDispatcher native code
}
private function toString():String {
return 'GameClass';
}
private function onMouseDown():Void {
this.dispatchEvent({type:'onGameEvent'});
}
}
В loader.swf: import LinkExchanger;
import IGameClass;
clip = this.createEmptyMovieClip('clip_mc',0);
mcl = new MovieClipLoader();
mcl.addListener(this);
onLoadInit = function() {
trace(LinkExchanger.game); // GameClass
LinkExchanger.game.addEventListener('onGameEvent',this);
}
onGameEvent = function(e:Object) {
trace('Game event called from external swf');
}
mcl.loadClip('load.swf',clip);
На выходе в loader.swf не должно быть класса GameClass. |
|
|||||
|
Регистрация: Nov 2005
Сообщений: 149
|
спасибо, дальше разберусь.
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Да, необходимые методы для общения нужно описать в интерфейсе и реализовать в классе…
|
|
|||||
|
Регистрация: Nov 2005
Сообщений: 149
|
это уже понятно, спасибо еще раз. Интуитивно понимаю, что интерфейсы - мощная штука, но вот вразумительных объяснений не находил. Теперь, на конкретном примере, разберусь.
|
|
|||||
|
сори если не в тему (тут такие механизмы в ход пошли..), но если ворос тока в том 'чтоб код, генерирующий события, прописывать не в _root ', то я не вижу почему бы его не прописыать где угодно, а вещать заставить третий объект, в глобале например
loader: AsBroadcaster.initialize(_global.broadcaster={});
_global.broadcaster.addListener(this);
function fromGame(){
trace("fromGame");
}
var game=createEmptyMovieClip("game_mc",0).loadMovie("loaded.swf");
GameClass: |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:12. |
|
|
« Предыдущая тема | Следующая тема » |
|
|