![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2006
Сообщений: 33
|
subj
Здесь (http://flasher.ru/forum/showthread.php?t=79873) понятно написано как это делать в одном классе. А как правильно указать то, что обработчик является методом другого класса? Так или нет? addEventListener(MouseEvent.CLICK, экземлярДругогоКласса.handler); И есть ли возможность отлова события в каких либо объектах не подписанных на обработку. Предположим у меня есть некоторый объект, кот. посылает некое событие и неизвестно существует ли он на данный момент или нет. И есть некоторые объекты, кот. должны обработать это событие, если оно вдруг произойдет, но они не знают создан ли объект или нет, да и не надо им это знать. Как правильно реализовать такое? Спасибо. |
|
|||||
|
стервочка (я мужик)
|
так низя делать. обработчики должны быть приватными.
|
|
|||||
|
1. Можно подписать любой обработчик из области видимости:
2. Или юзать третий объект, который существует всегда и знает когда существует нужный объект, или заюзать что-то кроме обсервера. |
|
|||||
|
4AM Games
|
Единственное требование, handler должен иметь 1ым аргументом Event, или что нибудь что пройдет как Event (* или Object)
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^ |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Лучше см. пост #2.
|
|
|||||
|
Регистрация: Oct 2007
Сообщений: 53
|
Если listener сделать публичным.
Main.as3: package {
import flash.display.Sprite;
import foo.Foo;
import bar.Bar;
import flash.events.MouseEvent;
public class Main extends Sprite
{
public function Main()
{
var f:Foo = new Foo();
var b:Bar = new Bar();
f.addEventListener(MouseEvent.CLICK, b.mouseClickListener);
addChild(f);
addChild(b);
}
}
}
package foo
{
import flash.display.Sprite;
import flash.text.TextField;
public class Foo extends Sprite
{
public function Foo()
{
x = 50;
y = 50;
graphics.beginFill(0x009900);
graphics.drawCircle(0, 0, 10);
var text:TextField = new TextField();
text.text = "Foo";
text.x = 10;
text.y = 10;
addChild(text);
}
}
}
package bar
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
public class Bar extends Sprite
{
public function Bar()
{
x = 100;
y = 100;
graphics.beginFill(0x990000);
graphics.drawCircle(0, 0, 10);
var text:TextField = new TextField();
text.text = "Bar";
text.x = 10;
text.y = 10;
addChild(text);
}
public function mouseClickListener(e:MouseEvent):void
{
trace("Вызван Bar.mouseClickListener()");
}
}
}
В Main.as3: package {
import flash.display.Sprite;
import foo.Foo;
import bar.Bar;
import flash.events.MouseEvent;
public class Main extends Sprite
{
protected var bClickListener:Function;
public function Main()
{
var f:Foo = new Foo();
var b:Bar = new Bar();
bClickListener = function(e:MouseEvent):void {
trace("MAIN: Foo CLICKED");
b.getClickListener(e)();
};
f.addEventListener(MouseEvent.CLICK, bClickListener);
addChild(f);
addChild(b);
}
}
}
public function getClickListener(e:MouseEvent):Function
{
return function():void {
mouseClickListener(e);
};
}
Код только для примера, набросал не для реального применения.
__________________
Новичок Последний раз редактировалось LokiDi L0ck; 23.10.2007 в 13:06. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Плохой пример.
|
|
|||||
|
Регистрация: Oct 2007
Сообщений: 53
|
Я знаю.
__________________
Новичок |
|
|||||
|
Я бы делал так:
public class ClassWithEvents {
public var clickFunction:Function = null;
public function ClassWithEvents() {
this.addEventListener(MouseEvent.CLICK,myClickFunction);
}
private function myClickFunction(event:MouseEvent) {
if (clickFunction != null)
clickFunction(event);
}
}
public class ClassWithEvents {
public function ClassWithEvents(clickFunction:Function) {
this.addEventListener(MouseEvent.CLICK,clickFunction);
}
}
И второй вариант: |
|
|||||
|
Регистрация: Oct 2007
Сообщений: 53
|
А можно просто напросто заюзать event dispatcher =)
__________________
Новичок |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:15. |
|
|
« Предыдущая тема | Следующая тема » |
|
|