Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.10.2009, 22:42
  № 1  
Ответить с цитированием
Xero201
Guest

Сообщений: n/a
По умолчанию Прослушивание событий одного класса из переменных другого

По нажатию на кнопку в объекте класса 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 или как вообще грамотно решать такие задачи.

Старый 14.10.2009, 11:16
Felicast вне форума Посмотреть профиль Отправить личное сообщение для Felicast Найти все сообщения от Felicast
  № 2  
Ответить с цитированием
Felicast
 
Аватар для Felicast

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
надо:
Код AS3:
b.addEventListener(B.DEL,DeleteA);//ловит
и
Код AS3:
removeChild(a);
в вашем случае вы подписываетесь к "a", а он не генерирует событие.
а в обработчике удаляете e.target, который является "b"
__________________
я могу стать всем, если только захочу

Старый 14.10.2009, 11:42
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 3  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Новосибирск :D
Сообщений: 6,597
Записей в блоге: 17
Ловите её от b, а в родителе уже отдавайте приказ a.

Старый 14.10.2009, 19:03
  № 4  
Ответить с цитированием
Xero201
Guest

Сообщений: n/a
Цитата:
Сообщение от Felicast Посмотреть сообщение
а в обработчике удаляете 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"

Старый 14.10.2009, 19:09
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 5  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Новосибирск :D
Сообщений: 6,597
Записей в блоге: 17
Представьте себе дерево, его каркас, с ветками. Ветки все разветвляются, и ветки веток разветвляются. Как добраться от крайней левой ветки до крайней правой?
Можно только подняться вверх по дереву к их первому общему родителю, и уже оттуда опуститься.

Старый 14.10.2009, 19:18
  № 6  
Ответить с цитированием
Xero201
Guest

Сообщений: n/a
Но зачем добираться, если можно просто хорошенько крикнуть, и кому надо, тот услышит?)

Старый 14.10.2009, 20:40
alecsisk вне форума Посмотреть профиль Отправить личное сообщение для alecsisk Найти все сообщения от alecsisk
  № 7  
Ответить с цитированием
alecsisk

Регистрация: Feb 2008
Адрес: N.Novgorod
Сообщений: 80
Отправить сообщение для alecsisk с помощью ICQ
У нас есть студент, который хочет позвонить директору. Но он знает только номер классного руководителя, потому что при поступлении он даёт номер своего телефона всем студентам.

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

Старый 14.10.2009, 20:55
Felicast вне форума Посмотреть профиль Отправить личное сообщение для Felicast Найти все сообщения от Felicast
  № 8  
Ответить с цитированием
Felicast
 
Аватар для Felicast

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
Код 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
	}
}
надеюсь мысль понятна. писал на коленке. так что может стоит подправить
__________________
я могу стать всем, если только захочу

Старый 14.10.2009, 21:29
  № 9  
Ответить с цитированием
Xero201
Guest

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

Старый 14.10.2009, 21:48
Artic вне форума Посмотреть профиль Найти все сообщения от Artic
  № 10  
Ответить с цитированием
Artic
Banned

Регистрация: Jun 2009
Сообщений: 298
Код:
//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, время: 18:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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