![]() |
|
||||||||||
|
|||||
|
Регистрация: May 2009
Сообщений: 134
|
ЗДравствуйте, уважаемые программисты.
Задам наверно глупый вопрос. Но у Мука я не могу найти ответ.... может не там ищу, конечно, тогда буду рада подсказке ) В общем есть проект, состоящий из главного класса, в нем созданы дети-контейнеры (типа Sprite), в которых также созданы другие дети (например кнопки навгации для переходов между сценами). Переменная, которая отслеживает на какой сцене находимся сидит в главном классе.... или нет? И вот вопрос: Как мне передать в главный класс событие нажатия кнопки? Через события? В контейнере я могу отловить это события - он родитель, а главный класс все-таки дедушка..... не выходит..... Может есть какие-то классические варианты и совсем не связанные с событиями? |
|
|||||
|
Посмотрите в хелпе по ключевому слову bubbles
__________________
Дело не в тебе |
|
|||||
|
Регистрация: May 2009
Сообщений: 134
|
Спасибо. Пытаюсь вникнуть, про фазы событий уже давно читала, но вот как их применить на практике - пока не додумалась.....
|
|
|||||
|
Цитата:
Например имеем класс для SimpleButton которые раскиданы по сцене //SimButton package{ import flash.display.* import flash.events.*; import flash.text.*; import lex.*; public class SimButton extends SimpleButton{ public var label:String; public function SimButton(){ addEventListener(MouseEvent.CLICK, mouseClickHandler); } private function mouseClickHandler(evt:MouseEvent):void{ stage.dispatchEvent(new LexEvent(LexEvent.SIM_BTN_CLICK, {btn:this})); } public function changeLabel(_label:String):void{ label = _label; ((upState as DisplayObjectContainer).getChildAt(1) as TextField).text = _label; ((downState as DisplayObjectContainer).getChildAt(1) as TextField).text = _label; ((overState as DisplayObjectContainer).getChildAt(1) as TextField).text = _label; } } } package lex{ import flash.events.Event; public class LexEvent extends Event { //public static const OBJ_SELECT:String = "objSelect"; public static const SIM_BTN_CLICK:String = "simBtnClick"; public var params:Object; public function LexEvent($type:String, $params:Object, $bubbles:Boolean = false, $cancelable:Boolean = false ) { super( $type, $bubbles, $cancelable ); this.params = $params; } public override function toString():String { return formatToString("CustomEvent","params","type","bubbles","cancelable"); } } } //DocEventCustom package{ import flash.display.* import flash.events.*; import flash.text.*; import lex.*; public class DocEventCustom extends Sprite { private var labelArr:Array = ["один","два","три","четыре","пять","шесть","семь"], obj:Object; public function DocEventCustom(){ var i:int, j:int; for (i=0; i<this.numChildren; i++) { obj = this.getChildAt(i); if (obj.toString()=='[object SimButton]') { obj.changeLabel(labelArr[j]); j++; if (j > labelArr.length) break; } } stage.addEventListener(LexEvent.SIM_BTN_CLICK, simBtnClickHandler); } private function simBtnClickHandler(evt:LexEvent):void{ obj = evt.params.btn; trace(obj.label); } } } |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Alex Lexcuk, вы знаете, что такое is?
![]() |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Alex Lexcuk, а зачем вместо?
Зачем вообще такие утопичные классы? Всё делается элементарно и без каких-либо костылей вроде LexEvent, кастомных событий и другой чуши: package { import flash.display.* import flash.events.*; import flash.text.*; public class SimButton extends SimpleButton { public function SimButton(){ super(); } /** * @private */ private var _label:String; public function get label():String { return this._label; } public function set label(value:String):void { if (this._label == value) return; this._label = value; ((super.upState as DisplayObjectContainer).getChildAt(1) as TextField).text = value; ((super.downState as DisplayObjectContainer).getChildAt(1) as TextField).text = value; ((super.overState as DisplayObjectContainer).getChildAt(1) as TextField).text = value; } } } package { import flash.display.* import flash.events.*; import flash.text.*; public class DocEventCustom extends Sprite { public function DocEventCustom(){ super(); var i:uint; var j:uint = 0; var l:uint = super.numChildren; var o:DisplayObject; for (i = 0; i< l; i++) { o = super.getChildAt(i); if (o is SimButton) { (o as SimButton).label = this._labels[j]; j++; if (j >= this._labels.length) break; } } super.addEventListener(MouseEvent.CLICK, this.handler_click); } /** * @private */ private const _labels:Array = new Array("один","два","три","четыре","пять","шесть","семь"); /** * @private */ private function handler_click(event:MouseEvent):void { if (event.target is SimButton) { trace((event.target as SimButton).label); } } } } |
|
|||||
|
Регистрация: May 2009
Сообщений: 134
|
Тэээкс....
а DocEventCustom - это основной класс? Что-то ругается на super() в конструкторе.... |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Да, это Document Class. Ругаться там не на что.
|
|
|||||
|
Регистрация: May 2009
Сообщений: 134
|
Что не так сделала?
Вот что пишет: |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:38. |
|
|
« Предыдущая тема | Следующая тема » |
|
|