![]() |
|
||||||||||
|
|||||
|
[+3 18.04.11]
Регистрация: Dec 2010
Сообщений: 342
|
Никак не могу разобраться с пользовательскими событиями. Вроде пишу что-то, но не работает.
Поэтому, уважаемые форумчане, скиньте пожалуйста полный код какого-нить своего простого пользовательского события, чтобы я его разжувал и наконец таки все понял. А то по примерам, которые у меня есть, мне мало что понятно. Или же объясните простым языком, что да как. Заранее благодарен. |
|
|||||
|
А может для начала вы скажете что именно не получается, и свой код скинете, а мы уж коллективным разумом ошибки поищем?
![]() Здается мне, так эффективнее получится)
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
|
Само событие, расширяющее стандартный event 2 параметрами - x и y(по типу как mouse event);
package { import flash.events.Event; /** * ... * @author Denis `Jack` Vinogradsky */ public class EventChangePos extends Event { public static const CHANGE_POS : String = "changePos"; private var _x:Number; private var _y:Number; public function EventChangePos(type:String,x:Number,y:Number) { super(type); _x = x; _y = y; } public function get x():Number { return _x; } public function set x(value:Number):void { _x = value; } public function get y():Number { return _y; } public function set y(value:Number):void { _y = value; } } } package { import flash.events.EventDispatcher; /** * ... * @author Denis `Jack` Vinogradsky */ public class TestObject extends EventDispatcher { private var _x:Number; private var _y:Number; public function TestObject() { } public function get x():Number { return _x; } public function set x(value:Number):void { _x = value; dispatchEvent(new EventChangePos(EventChangePos.CHANGE_POS, _x, _y); } public function get y():Number { return _y; } public function set y(value:Number):void { _y = value; dispatchEvent(new EventChangePos(EventChangePos.CHANGE_POS, _x, _y); } } }
__________________
Искренне Ваш, Джек. |
|
|||||
|
Ну, как бы правила хорошего тона, в ООП... можно и публичные переменные, дело вкуса...
Но хочу обратить ваше внимание на то, что во flash нет ни одного события с открытыми членами, все реализовано через свойства... Подозреваю, что так обстоит дело не только с событиями, а и со всеми стандартными классами flash. Константы, естественно, не в счет... Добавлено через 3 минуты Там в примере еще атрибутов по хорошему не хватает, вроде такого: Как для самого события, так и для класса с этим событием... Но это конечно не обязательно... Решил не запутывать человека сверх меры...
__________________
Искренне Ваш, Джек. |
|
|||||
|
Вы немножко заблуждаетесь. Правило хорошего тона — не использовать сеттеры в эвентах, так как события выполняют функцию оповещения (тавтология мой конек), и отдают данные.
Использовать сеттеры в событиях это мягко скажем моветон. Ваше же объяснение совсем не по теме вышло. |
|
|||||
|
в чем моветон то?
ну сеттер и сеттер... хочешь 1 раз при создании передать в него что-то - передай всего 1 раз. благо if никто не отменял) Добавлено через 8 минут п.с. я, просто, вообще не сторонник "много параметров в конструктор". в отношении Ивентов - больше одного кастомного параметра для ивента - моветон (ИМХО). в данном случае х,у легко заменяется одним поинтом.
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Ну вот событие, которое у меня посылается при взлете вертолета в игре:
package { import flash.events.Event; public class UpEvent extends Event { public static const INAIR:String = "inair"; public function UpEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); } public override function clone():Event { return new UpEvent(type, bubbles, cancelable); } public override function toString():String { return formatToString("UpEvent", "type", "bubbles", "cancelable", "eventPhase"); } } } |
|
|||||
|
Цитата:
Вы спросили, для чего тут "СЕТТЕРЫ". я для себя прочел/подумал, для чего тут свойства Да, вы правы, данном случае сеттер, в общем то не нужен.Но это вовсе не значит, что в событиях не нужны сеттеры, просто они не нужны конкретно здесь... К примеру взгляните на тот же MouseEvent, и вы найдете там сеттеры, и не случайно ![]() Впрочем когда я писал код примера, я как то об этом не задумывался, нужны там сеттеры или нет... На вопрос, как сделать пользовательские события, такие тонкости, как наличие сеттеров... врятли имеет какое то значение....
__________________
Искренне Ваш, Джек. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
goodguyабсолютно не понял, в чем "кастомность" Вашего события, в каком месте оно "расширяет" обычное Событие и, в частности, чем отличается метод clone в Вашем событии от исходного, что его пришлось оверрайдить. Не логичнее было бы создать класс ВертолётИвэнт, а в нем уже разные ТИПЫ этого события - ап, даун, дестрой и т.п.? Даже в этом ключе в нем нет особой необходимости - можно создать класс-список констант типа HELICOPTER_UP, HELICOPTER_DOWN, HELICOPTER_DESTROYED и диспатчить обычные экземпляры Event с нужным Типом из этого списка. Нет смысла множить сущности.
Кастомные классы событий нужны, когда Вы хотите передавать в событиях дополнительные параметры. По поводу количества параметров - можно иногда отказаться от передачи типа в конструктор кастомного события, если тип в реальности один. Например package { import flash.events.Event; /* * * * * * * * * * * * * @author wolsh * * * \* * * * * * * * * */ public class SizeEvent extends Event { public static const CHANGED:String = "sizeChanged"; public var width:Number; public var height:Number; public function SizeEvent(width:Number, height:Number, bubbles:Boolean=false, cancelable:Boolean=false) { super(CHANGED, bubbles, cancelable); this.width = width; this.height = height; } public override function clone():Event { return new SizeEvent(width, height, bubbles, cancelable); } public override function toString():String { return formatToString("SizeEvent", CHANGED, "width", "height", "bubbles", "cancelable", "eventPhase"); } } }
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:12. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|