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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.04.2009, 14:00
lolovo вне форума Посмотреть профиль Отправить личное сообщение для lolovo Найти все сообщения от lolovo
  № 1  
Ответить с цитированием
lolovo

Регистрация: Jun 2008
Сообщений: 30
По умолчанию События и дети

Всем привет!

Есть ли способ сделать детей "прозрачными" и не реагирующими на события отца. Знаю, что это mouseEnabled=false & mouseChildren=false, но в данном примере это не работает:

Код AS3:
var obj:Sprite = new Sprite();
obj.x=200;
obj.y=200;
obj.graphics.beginFill(1);
obj.graphics.drawRect(0,0,50,50);
obj.graphics.endFill();
addChild(obj);
obj.addEventListener(Event.ENTER_FRAME,abc);
obj.addEventListener(MouseEvent.MOUSE_OUT,abcOut);
obj.addEventListener(MouseEvent.MOUSE_OVER,abcOver);
 
 
 
function abcOver(e:MouseEvent)
{
	var obj:Sprite = Sprite(e.currentTarget);
	obj.graphics.clear();
	obj.graphics.beginFill(0x00ff00);
	obj.graphics.drawRect(0,0,50,50);
	obj.graphics.endFill();	
}
function abcOut(e:MouseEvent)
{
	var obj:Sprite = Sprite(e.currentTarget);
	obj.graphics.clear();
	obj.graphics.beginFill(1);
	obj.graphics.drawRect(0,0,50,50);
	obj.graphics.endFill();	
}
 
function abc(e:Event)
{
	var obj:Sprite = Sprite(e.currentTarget);
	if(obj.getChildByName("child")==null)
	{
		var obj2:Sprite = new Sprite();
		obj2.graphics.beginFill(0xff0000,0.5);
		obj2.graphics.drawCircle(0,0,50);
		obj2.graphics.endFill();
		obj2.name="child";
		obj2.mouseChildren=false; // не работает
		obj2.mouseEnabled=false; // не работает
		obj.addChild(obj2);
		obj2.removeEventListener(MouseEvent.MOUSE_OVER,abcOver); // не работает
		obj2.removeEventListener(MouseEvent.MOUSE_OUT,abcOut); // не работает
	}else
	{
		var obj2:Sprite = Sprite(obj.getChildByName("child"));
		obj2.width++;
		obj2.height++;
		obj2.alpha-=0.05;
		if(obj2.alpha<=0.0001)
			obj2.parent.removeChild(obj2);
	}
}
Цель заставить красный шар не реагировать на события квадрата, при этом нужно чтобы шар был ребенком квадрата. Иначе говоря, идея добавить шар в другое место (т.е. в другого родителя) с теми же координатами отпадает.

Насколько я понимаю, когда ребенок выходит за границы отца (width & height), то границы отца изменяются, чтобы в эти границы попадал и ребенок. Поэтому, формально мы "якобы" вызывает событие квадрата, когда мышка на красном шаре. Можно ли как-то это дело обойти?


Последний раз редактировалось lolovo; 28.04.2009 в 14:05.
Старый 28.04.2009, 14:23
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 2  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Боже, как-то у вас все сложно получилось
На вскидку это работать и не будет:
Код AS3:
obj2.removeEventListener(MouseEvent.MOUSE_OVER,abcOver); // не работает
		obj2.removeEventListener(MouseEvent.MOUSE_OUT,abcOut); // не работает
т.к. вешаете вы обработчики на родителя, а пытаетесь удалить с каких-то его детей, которых у него и нет, судя по коду
Код AS3:
obj2.mouseChildren=false; // не работает
		obj2.mouseEnabled=false; // не работает
Попробуйте применить это к самому obj

Старый 28.04.2009, 14:41
lolovo вне форума Посмотреть профиль Отправить личное сообщение для lolovo Найти все сообщения от lolovo
  № 3  
Ответить с цитированием
lolovo

Регистрация: Jun 2008
Сообщений: 30
применить это к родителю нельзя, т.к. при mouseEnabled=false у родителя не будут отвечать события MOUSE_OVER & MOUSE_OUT. А mouseChildren=false у родителя не помогает.

Старый 28.04.2009, 14:47
lolovo вне форума Посмотреть профиль Отправить личное сообщение для lolovo Найти все сообщения от lolovo
  № 4  
Ответить с цитированием
lolovo

Регистрация: Jun 2008
Сообщений: 30
смотрите внимательно код
Код AS3:
function abc(e:Event)
{
...
		obj.addChild(obj2);
...
}

Старый 28.04.2009, 14:49
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 5  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
да, добавляете, не заметил

Старый 28.04.2009, 14:55
lolovo вне форума Посмотреть профиль Отправить личное сообщение для lolovo Найти все сообщения от lolovo
  № 6  
Ответить с цитированием
lolovo

Регистрация: Jun 2008
Сообщений: 30
вы так же не заметили то, что суть проблемы не в mouseEnabled & mouseChildren. А в том что происходит resize родителя вследствие resize ребенка и его выхода за границы родителя (читай последние строки первого сообщения).

P.S. Так же хочу напомнить еще об одном упомянутом выше факте (предпоследняя строчка) ... решение этой проблемы есть, но оно не очень хорошее и мне не годится - подложить под квадрат еще один объект-пустышку и на нее нацепить шар с mouseEnabled=false. Этот способ для меня не годится, т.к. есть уже устоявшаяся иерархия всех объектов и вносить изменения - геморрой на голову. Хотелось лишь узнать, можно ли этот геморрой избежать не прибегая к мучительным процедурам и созданием лишних объектов.


Последний раз редактировалось lolovo; 28.04.2009 в 15:04.
Старый 28.04.2009, 15:24
kirea вне форума Посмотреть профиль Отправить личное сообщение для kirea Найти все сообщения от kirea
  № 7  
Ответить с цитированием
kirea
 
Аватар для kirea

Регистрация: Mar 2009
Адрес: UA -- Kherson
Сообщений: 29
можно так: если нужно реагировать на мышь только в прямоугольнике, то реагируй на все события, но в его обработчике отслеживай координаты целевого прямоугольника и проверяй, попадает ли мышь в эти диапазоны...

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

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Возможно, нужно поиграться с фазами событий, например, такойо вариант:
Код AS3:
var obj:Sprite = new Sprite();
obj.x=200;
obj.y=200;
obj.graphics.beginFill(1);
obj.graphics.drawRect(0,0,50,50);
obj.graphics.endFill();
addChild(obj);
obj.addEventListener(Event.ENTER_FRAME,abc);
obj.addEventListener(MouseEvent.MOUSE_OUT,abcOut);
obj.addEventListener(MouseEvent.MOUSE_OVER,abcOver);
 
function abcOver(e:MouseEvent)
{
	var obj:Sprite = Sprite(e.currentTarget);
	obj.graphics.clear();
	obj.graphics.beginFill(0x00ff00);
	obj.graphics.drawRect(0,0,50,50);
	obj.graphics.endFill();	
}
function abcOut(e:MouseEvent)
{
	var obj:Sprite = Sprite(e.currentTarget);
	obj.graphics.clear();
	obj.graphics.beginFill(1);
	obj.graphics.drawRect(0,0,50,50);
	obj.graphics.endFill();	
}
 
function abc(e:Event)
{
	var obj:Sprite = Sprite(e.currentTarget);
	if(obj.getChildByName("child")==null)
	{
		var obj2:Sprite = new Sprite();
		obj2.graphics.beginFill(0xff0000,0.5);
		obj2.graphics.drawCircle(0,0,50);
		obj2.graphics.endFill();
		obj2.name="child";
 
		obj.addChild(obj2);
		obj2.addEventListener(MouseEvent.MOUSE_OVER,abcOver2); // не работает
		obj2.addEventListener(MouseEvent.MOUSE_OUT,abcOut2); // не работает
	}else
	{
		var obj2:Sprite = Sprite(obj.getChildByName("child"));
		obj2.width++;
		obj2.height++;
		obj2.alpha-=0.05;
		if(obj2.alpha<=0.0001)
			obj2.parent.removeChild(obj2);
	}
}
 
function abcOver2(e:MouseEvent)
{
	e.stopPropagation();
}
function abcOut2(e:MouseEvent)
{
	e.stopPropagation();
}
приводит к тому, что при попадании курсора в область круга, событие "душится", и теперь область реагирования клипа - это часть квадрата, не пересекающаяся с кругом

Старый 28.04.2009, 16:17
lolovo вне форума Посмотреть профиль Отправить личное сообщение для lolovo Найти все сообщения от lolovo
  № 9  
Ответить с цитированием
lolovo

Регистрация: Jun 2008
Сообщений: 30
2kirea:
это еще геморройней, чем вариант с "подкладкой"... т.к. я писал, что сам квадрат в размерах меняется... если вставить trace() и выводить его width & height, то можно это лицезреть при увеличении размера шара (при этом, прошу заметить, речь идет о width & height спрайта, а не отрисованной области, поэтому эти изменения не видны глазом).

2litebox:
не годится такой вариант.... шар должен быть "прозрачный", т.е. должны реагировать объекты под шаром на свои события...а сам шар делает свою анимацию и только.

Ладно, я понял, что это иным макаром не обойти...пойду путем геморройным Всем спасибо за отклики!


Последний раз редактировалось lolovo; 28.04.2009 в 16:20.
Старый 28.04.2009, 21:02
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 10  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Проще запихнуть квадрат и шар в общий контейнер, события подвесить на квадрат, а на круге поставить mouseChildren = false. И не морочить себе голову

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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