До сих пор мне приходилось обрабатывать свои собственные пользовательские события, добавляя прослушиватель событий к объекту, который отправлял пользовательское событие.хотя этот метод обработки событий работает очень хорошо, я пришел к тому, что мне бы хотелось, чтобы мои пользовательские события были глобально доступны, когда прослушивающий объект не обязательно должен быть тем же объектом, который отправляет событие.
в этом примере мой основной контроллер создает и добавляет в список отображения 2 класса спрайтов: Квадрат и Треугольник .4-й и последний класс - это пользовательское событие с именем ColorChangeEvent .
Я пытаюсь отправить новый ColorChangeEvent из класса Square, который использует таймер для отправкиновый случайный цвет раз в секунду, в то время как треугольник будет прослушивать отправленное событие и изменяет цвет заливки на цвет, который был отправлен квадратом.
Controller.as:
package
{
import flash.display.Sprite;
public class Controller extends Sprite
{
public function Controller()
{
var sq:Square = new Square();
sq.x = sq.y = 100;
var tr:Triangle = new Triangle();
tr.x = tr.y = 250;
addChild(sq);
addChild(tr);
}
}
}
Square.as:
package
{
import flash.display.Sprite;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class Square extends Sprite
{
public function Square()
{
graphics.beginFill(0x999999);
graphics.drawRect(0, 0, 100, 100);
graphics.endFill();
var myTimer:Timer = new Timer(1000);
myTimer.addEventListener(TimerEvent.TIMER, dispatchNewColor);
myTimer.start();
}
private function dispatchNewColor(evt:TimerEvent):void
{
var randomColor:Number = Math.random() * 0xFFFFFF;
trace("Square Class Dispatched: " + randomColor);
dispatchEvent(new ColorChangeEvent(ColorChangeEvent.CHANGE, randomColor));
}
}
}
Triangle.as:
package
{
import flash.display.Sprite;
import flash.geom.ColorTransform;
public class Triangle extends Sprite
{
public function Triangle()
{
graphics.beginFill(0x999999);
graphics.moveTo(0, 0);
graphics.lineTo(100, 50);
graphics.lineTo(-50, 150);
graphics.endFill();
addEventListener(ColorChangeEvent.CHANGE, changeColor);
}
private function changeColor(evt:ColorChangeEvent):void
{
var ct:ColorTransform = new ColorTransform;
ct.color = evt.color;
transform.colorTransform = ct;
trace("Triangle Class Received: " + evt.color);
}
}
}
ColorChangeEvent.as:
package
{
import flash.events.Event;
public class ColorChangeEvent extends Event
{
public static const CHANGE:String = "change";
public var color:Number;
public function ColorChangeEvent(type:String, color:Number)
{
super(type);
this.color = color;
}
override public function clone():Event
{
return new ColorChangeEvent(type, color);
}
}
}
Излишне говорить, что это не работает.
Конечно, я мог бы добавить прослушиватель событий к экземпляру Square в классе Controller, чей обработчик событий мог быпередать это значение в треугольник через открытую функцию для изменения цвета, но это именно то ограничение, которого я пытаюсь избежать.
не всегда легко получить доступ и передать значение в класс, откудапользовательское событие отправляется, поэтому я смотрюng для фактического глобального решения для обработки пользовательских событий.