Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.10.2006, 17:17
meiciuc вне форума Посмотреть профиль Отправить личное сообщение для meiciuc Найти все сообщения от meiciuc
  № 1  
Ответить с цитированием
meiciuc

Регистрация: 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");
}
проблема во втором, подгружаемом клипе. Вопрос в следующем, как сделать так (если это вообще возможно), чтоб код, генерирующий события, прописывать не в _root (иначе loader ничего не увидит).


это то, что в loaded - но мне не очень нравится работа с рутом.
Код:
import mx.events.EventDispatcher;

var dispatchEvent:Function;
var removeEventListener:Function;
var addEventListener:Function;

EventDispatcher.initialize(this);

onMouseDown = function()
{
	dispatchEvent({target:this, type:"fromGame"});
}
Спасибо


Последний раз редактировалось iNils; 13.10.2006 в 17:37.
Старый 13.10.2006, 17:43
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
А что ты хочешь оставить в _root? Если уж так хочется, то можешь юзать LocalConnection…

з.Ы. Delegate.create(this,gameHandler) — ссылка будет на mclListener внутри gameHandler. Я не вижу смысла в создании Listener-а, почему бы не подписать самого себя на события MovieClipLoader-а?

Старый 13.10.2006, 17:57
meiciuc вне форума Посмотреть профиль Отправить личное сообщение для meiciuc Найти все сообщения от meiciuc
  № 3  
Ответить с цитированием
meiciuc

Регистрация: Nov 2005
Сообщений: 149
__etc, код для лоадера грязен, он лишь для экспериментов. Там и делегат я случайно всунул - по-привычке из АС2. Проблема у меня с подгружаемым - и то теоритическая. В руте подгружаемого клипа я хотел бы оставить только инициализацию класса и все. Но, понятно, что в таком случае loader должен подписываться на события примерно так game.B.addEventListener(тра-ла-ла). Т.е. я должен знать имя объекта класса внутри loaded - а вот этого-то я и не хочу знать.

Старый 13.10.2006, 18:08
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Тогда сделайте один общий класс, у которого одно из статических свойств ссылается на интерфейс. А в loaded.swf напишите класс, реализующий данный интерфейс и замените ссылку в общем классе на данный.
Если непонятно, я объясню на примере.


Последний раз редактировалось etc; 13.10.2006 в 18:12.
Старый 13.10.2006, 18:17
meiciuc вне форума Посмотреть профиль Отправить личное сообщение для meiciuc Найти все сообщения от meiciuc
  № 5  
Ответить с цитированием
meiciuc

Регистрация: Nov 2005
Сообщений: 149
интересно для меня. К сожалению, я довольно плохо разбираюсь в интерфейсах (во всяком случае с данным их назначением). Не могли бы для примера дать пару строк принципиального кода?

Старый 13.10.2006, 18:30
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
У нас есть интерфейс IGameClass:
Код:
interface IGameClass {
	public function addEventListener():Void;
	public function removeEventListener():Void;
}
Есть класс LinkExchanger, хранящий ссылку на интерфейс GameClass:
Код:
import IGameClass;
class LinkExchanger {
	public static var game:IGameClass;
}
Есть класс 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'});
	}

}
В load.swf:
Код:
import GameClass;
new GameClass();
В 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);
Нужно помнить, что в интерфейсах могут быть только методы, никаких свойств. Т.е. обращаться к свойствам GameClass нельзя, но можно вызывать его методы. А лучше подписаться на события, что и требовалось.

На выходе в loader.swf не должно быть класса GameClass.

Старый 13.10.2006, 18:31
meiciuc вне форума Посмотреть профиль Отправить личное сообщение для meiciuc Найти все сообщения от meiciuc
  № 7  
Ответить с цитированием
meiciuc

Регистрация: Nov 2005
Сообщений: 149
спасибо, дальше разберусь.

Старый 13.10.2006, 18:52
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Да, необходимые методы для общения нужно описать в интерфейсе и реализовать в классе…

Старый 13.10.2006, 19:04
meiciuc вне форума Посмотреть профиль Отправить личное сообщение для meiciuc Найти все сообщения от meiciuc
  № 9  
Ответить с цитированием
meiciuc

Регистрация: Nov 2005
Сообщений: 149
это уже понятно, спасибо еще раз. Интуитивно понимаю, что интерфейсы - мощная штука, но вот вразумительных объяснений не находил. Теперь, на конкретном примере, разберусь.

Старый 13.10.2006, 19:05
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 10  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
сори если не в тему (тут такие механизмы в ход пошли..), но если ворос тока в том 'чтоб код, генерирующий события, прописывать не в _root ', то я не вижу почему бы его не прописыать где угодно, а вещать заставить третий объект, в глобале например

loader:
Код:
AsBroadcaster.initialize(_global.broadcaster={});
_global.broadcaster.addListener(this);
function fromGame(){
	trace("fromGame");
}
var game=createEmptyMovieClip("game_mc",0).loadMovie("loaded.swf");
laoded:
Код:
var game=new GameClass();
GameClass:
Код:
class GameClass{
	function GameClass(){
		Mouse.addListener(this);
	}
	function onMouseDown(){
		_global.broadcaster.broadcastMessage("fromGame");
	}
}

Создать новую тему Ответ Часовой пояс GMT +4, время: 07:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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