Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Прослушивание событий одного класса из переменных другого (http://www.flasher.ru/forum/showthread.php?t=131147)

Xero201 13.10.2009 22:42

Прослушивание событий одного класса из переменных другого
 
По нажатию на кнопку в объекте класса B, объект класса A должен быть удален. Попробовал сделать так:
В классе B:
Код AS3:

del.addEventListener(MouseEvent.MOUSE_DOWN,deleteA); //del – название кнопки
//..
private function deleteA(e:Event){
        dispatchEvent(new Event(DEL));
}

В классе Main:
Код AS3:

var a:A = new A();
addChild(a);
var b:B = new B(a);
addChild(b);
a.addEventListener(B.DEL,DeleteA);//не ловит
//b.addEventListener(B.DEL,DeleteA);//ловит
                }
private function DeleteA(e:Event){
trace(e.target);
//removeChild(e.target);
}

Подскажите, пожалуйста, как сделать так, чтобы переменная из класса A воспринимала события из B или как вообще грамотно решать такие задачи.

Felicast 14.10.2009 11:16

надо:
Код AS3:

b.addEventListener(B.DEL,DeleteA);//ловит

и
Код AS3:

removeChild(a);

в вашем случае вы подписываетесь к "a", а он не генерирует событие.
а в обработчике удаляете e.target, который является "b"

Psycho Tiger 14.10.2009 11:42

Ловите её от b, а в родителе уже отдавайте приказ a.

Xero201 14.10.2009 19:03

Цитата:

Сообщение от Felicast (Сообщение 857673)
а в обработчике удаляете e.target, который является "b"

Это ясно, просто расчет был на то, что обработчик будит вызываться с помощью
Код AS3:

a.addEventListener(B.DEL,DeleteA);//не ловит

to Felicast, Psycho Tiger: беда в том, что объектов "а" не один, а много. Поэтому придется перебирать их все, и сравнивать с тем, ссылка на который хранится в переменной "b". Не то, чтобы это отнимает много времени, просто выглядит странно..
А можно внутри объекта b, удалить a, если есть ссылка на неё?
Например в классе B:
Код AS3:

del.addEventListener(MouseEvent.MOUSE_DOWN,deleteA); //del – название кнопки
//..
private function deleteA(e:Event){
УдалитьОбъектПоСсылке(cur_a);//cur_a - хранит ссылку на "a"
}

И почему всё-таки нельзя сделать так, чтобы "а" могла слушать события генерируемые "b"

Psycho Tiger 14.10.2009 19:09

Представьте себе дерево, его каркас, с ветками. Ветки все разветвляются, и ветки веток разветвляются. Как добраться от крайней левой ветки до крайней правой?
Можно только подняться вверх по дереву к их первому общему родителю, и уже оттуда опуститься.

Xero201 14.10.2009 19:18

Но зачем добираться, если можно просто хорошенько крикнуть, и кому надо, тот услышит?)

alecsisk 14.10.2009 20:40

У нас есть студент, который хочет позвонить директору. Но он знает только номер классного руководителя, потому что при поступлении он даёт номер своего телефона всем студентам.

Студент должен позвонить кл.руководителю, чтобы кл.рук. передал директору сообщение или удалил его. Так понятнее ?

Felicast 14.10.2009 20:55

Код AS3:

class A
{
        private var _b:B;
        public function A(b:B)
        {
                _b = b;
                if (_b)
                {
                        _b.addEventListener("superMegaEvent", superMegaEventHandler);
                }
        }
        public function superMegaEventHandler(event:Event):void
        {
                //тут всеми мыслимыми и немыслимыми способами удаляем this
        }
}

надеюсь мысль понятна. писал на коленке. так что может стоит подправить

Xero201 14.10.2009 21:29

Мысль понятна, но реализовать не получается(. Наверное по той же причине. Нельзя отловить событие, посланное из «чужого» класса, ведь переменная _b содержит только ссылку, и роднее от этого не становиться).
Но с перебором всех элементов я действительно сморозил. Зачем, если и так есть ссылка!) Поэтому делаю все, как и предлагали выше. В родительском классе ловлю событие переменной b, а потом удаляю нужный объект «а», взяв из b ссылку на него. Все пучком, всем спасибо.
Если я не правильно понял, и можно удалить и по-другому, дайте пожалуйста знать.

Artic 14.10.2009 21:48

Код:

//class A Root
private function createNewClassB():void
{
    var sameClassB:ClassB = new ClassB();
    sameClassB.addEventListener(ClassB.HELLOWORLD, testMessagefromClassB);
    addChild(sameClassB);

}
private function testMessagefromClassB(event:Event):void
{
    // im here
}

Код:

//class B
public static var HELLOWORLD:String = "helloworld";
public function ClassB()
{
var sameSprite:Sprite = new Sprite();
sameSprite.graphics.beginFill(0x666666);
sameSprite.graphics.drawRect( 0, 0, 50,50);
sameSprite.graphics.endFill();
sameSprite.addEventListener(MouseEvent.CLICK, sendMessage);
addChild(sameSprite);
}
private function sendMessage(event:Event):void
{
    dispatchEvent(new Event(ClassB.HELLOWORLD,true));
}



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

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