Почему в AS3 события мыши пропускают root и переходят на этап?

Запустите следующий код, один раз с block.mouseEnabled = true и еще раз с block.mouseEnabled = false, щелкая блок один раз во время каждого запуска.

var block:Sprite = new Sprite();
block.name = "block";
with(block.graphics){beginFill(0x000000,1);moveTo(0,0);lineTo(100,0);lineTo(100,100);lineTo(0,100);lineTo(0,0);endFill();}
block.mouseEnabled = true; //change to false to see how event target skips root
addChild(block)
stage.addEventListener( MouseEvent.MOUSE_DOWN, mouse_down, false, 0, true );
function mouse_down( e:MouseEvent ):void{trace( e.target );}

Почему «root» пропущен в качестве цели? Это по дизайну? Что является или что может быть конструктивной причиной этой аномалии?

Я спрашиваю об этом, потому что это явное отклонение от обычного шаблона, когда, когда для дочернего объекта mouseEnabled установлено значение false, родительский объект становится целью при нажатии на его дочернюю область.

Может случиться так, что корень является просто конечной точкой, не участвующей в захвате/цели/пузырьковом круговороте события, и все, что достигает его, применяется к этапу вместо корня.


person Triynko    schedule 14.03.2012    source источник
comment
Примечание модератора Комментарии к этому вопросу были удалены, поскольку они растворились в чистом шуме, нулевом сигнале. Пожалуйста, избегайте продолжительных дискуссий или споров в комментариях, вместо этого используйте чат.   -  person Tim Post♦    schedule 14.03.2012
comment
Это действительно интересно. Вы можете вручную отправить событие мыши в корень, и оно будет всплывать на сцену, как и ожидалось, но никакое количество взаимодействий мыши с фигурами или графикой, прикрепленными или нарисованными в корне, не приведет к тому, что корень станет целью; вместо этого он всегда по умолчанию использует сцену. По крайней мере, приятно знать, что вы можете рисовать по всему корню без какой-либо такой графики, мешающей взаимодействию с мышью, и эффективно функционирующей в качестве фона сцены (а не корневого фона).   -  person Triynko    schedule 14.03.2012
comment
Смотрите мои комментарии к ответу Мартиса. Корневой объект является относительным. В случае со стадией stage.root == stage. То есть это циклическая ссылка. Цель объекта никогда не будет установлена ​​как корень, потому что она уже установлена ​​как корень, то есть стадия.   -  person    schedule 14.03.2012
comment
Я удалил свой ответ до того, как @Triynko взорвал себя в результате собственного гнева по этому поводу.   -  person Marty    schedule 14.03.2012
comment
root - это DisplayObject, поэтому он не может получать события мыши. Чтобы создать повторно используемый и поддерживаемый код, вы в любом случае не должны обращаться к корню или полагаться на него. Просто сделайте фоновый спрайт достаточно большим, чтобы покрыть соответствующую область.   -  person laurent    schedule 06.04.2012


Ответы (1)


Любые штрихи и векторные заливки на графике не являются интерактивными и не могут улавливать интерактивные события. Вы можете использовать метод graphics.beginBitmapFill или добавить Bitmap (или любой другой) в качестве дочернего элемента.

person Alex Koz.    schedule 06.04.2012