![]() |
|
||||||||||
|
|||||
|
Регистрация: Jun 2008
Сообщений: 30
|
Всем привет!
Есть ли способ сделать детей "прозрачными" и не реагирующими на события отца. Знаю, что это mouseEnabled=false & mouseChildren=false, но в данном примере это не работает: 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. |
|
|||||
|
Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
|
Боже, как-то у вас все сложно получилось
![]() На вскидку это работать и не будет: obj2.removeEventListener(MouseEvent.MOUSE_OVER,abcOver); // не работает obj2.removeEventListener(MouseEvent.MOUSE_OUT,abcOut); // не работает Попробуйте применить это к самому obj |
|
|||||
|
Регистрация: Jun 2008
Сообщений: 30
|
применить это к родителю нельзя, т.к. при mouseEnabled=false у родителя не будут отвечать события MOUSE_OVER & MOUSE_OUT. А mouseChildren=false у родителя не помогает.
|
|
|||||
|
Регистрация: Jun 2008
Сообщений: 30
|
|
|
|||||
|
Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
|
да, добавляете, не заметил
![]() |
|
|||||
|
Регистрация: Jun 2008
Сообщений: 30
|
вы так же не заметили то, что суть проблемы не в mouseEnabled & mouseChildren. А в том что происходит resize родителя вследствие resize ребенка и его выхода за границы родителя (читай последние строки первого сообщения).
P.S. Так же хочу напомнить еще об одном упомянутом выше факте (предпоследняя строчка) ... решение этой проблемы есть, но оно не очень хорошее и мне не годится - подложить под квадрат еще один объект-пустышку и на нее нацепить шар с mouseEnabled=false. Этот способ для меня не годится, т.к. есть уже устоявшаяся иерархия всех объектов и вносить изменения - геморрой на голову. Хотелось лишь узнать, можно ли этот геморрой избежать не прибегая к мучительным процедурам и созданием лишних объектов.Последний раз редактировалось lolovo; 28.04.2009 в 15:04. |
|
|||||
|
Регистрация: Mar 2009
Адрес: UA -- Kherson
Сообщений: 29
|
можно так: если нужно реагировать на мышь только в прямоугольнике, то реагируй на все события, но в его обработчике отслеживай координаты целевого прямоугольника и проверяй, попадает ли мышь в эти диапазоны...
|
|
|||||
|
Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
|
Возможно, нужно поиграться с фазами событий, например, такойо вариант:
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(); } |
|
|||||
|
Регистрация: Jun 2008
Сообщений: 30
|
2kirea:
это еще геморройней, чем вариант с "подкладкой"... т.к. я писал, что сам квадрат в размерах меняется... если вставить trace() и выводить его width & height, то можно это лицезреть при увеличении размера шара (при этом, прошу заметить, речь идет о width & height спрайта, а не отрисованной области, поэтому эти изменения не видны глазом). 2litebox: не годится такой вариант.... шар должен быть "прозрачный", т.е. должны реагировать объекты под шаром на свои события...а сам шар делает свою анимацию и только. Ладно, я понял, что это иным макаром не обойти...пойду путем геморройным Всем спасибо за отклики!Последний раз редактировалось lolovo; 28.04.2009 в 16:20. |
![]() |
![]() |
Часовой пояс GMT +4, время: 12:05. |
|
|
« Предыдущая тема | Следующая тема » |
|
|