Вопрос по actionscript-3, movieclip, button, mouseevent – AS3 - кнопка внутри MovieClip запускает событие MC

2

На сцене у меня есть MovieClip с именем "тс» с простым прямоугольником, нарисованным внутри. У mc также есть дочерний элемент Button с именем "БТН» который является еще одним простым прямоугольником (меньше, чем mc 'с прямоугольником очевидно). Тогда у меня есть этот код на сцене.

function mcDown( _e:MouseEvent):void{
    trace( "mc" );
}
function btnClick( _e:MouseEvent):void{
    trace( "btn" );
}
mc.addEventListener( MouseEvent.MOUSE_DOWN, mcDown );
mc.btn.addEventListener( MouseEvent.CLICK, btnClick );

Проблема, с которой я сталкиваюсь, заключается в том, что при нажатии кнопки запускается событие mcDown, которое отслеживает и то, и другое.тс» а также "БТН».

Как сделать так, чтобы при нажатии на кнопку запускалась только btnClick, а не mcDown? Я попробовал MOUSE_UP вместо CLICK, та же проблема. И событие mcDown должно оставаться MOUSE_DOWN.

Ваш Ответ

2   ответа
1

Невозможно предотвратить образование пузырьков, за исключением того, что в диспетчере dispatchEvent для параметра пузырей указано значение false

dispatchEvent(EVENT_TYPE, BUBBLES,....);

Тем не менее, вы можете избежать пузырей, выполнив проверку. Просто используйте нижнюю строку в качестве первой строки функции слушателя, чтобы избежать событий, отправляемых из всех объектов, кроме целей.

if(e.eventPhase != EventPhase.AT_TARGET) return;

Итак, для вашего примера кода, когда вы нажимаете на кнопку, оба события отправляются, но вmcDown функция это выиграетвыполнить после указанной выше строки.

Спасибо, это похоже на одну проверку! Murat
Добро пожаловать:) Moorthy
0

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

Так что'Хорошая идея - создать функцию, которая будет проверять, нажата ли кнопка, в противном случае она будет запускать функцию для всего MC.

Этот должен сделать это.

//add this in you constructor

mc.addEventListener(MouseEvent.MOUSE_DOWN, myReleaseFunc);
function myReleaseFunc(e:MouseEvent):void {
    if(e.currentTarget.name == Btn1) //Btn1 is instance name for a button
    {
         Btn_func1();
    }
    else if(e.currentTarget.name == Btn2) //Btn2 is another button.
    {
         Btn_func2();
         //For every button you'll need to add another function and if statement to check if that button was clicked.
    }
    else
    {
         Mc_func();
    }

} 

// this outside the main class

function Mc_func():void{
    //you code here
}
function Btn_func1():void{
    //you code here
}
function Btn_func2():void{
    //you code here
}

Я думаю, что этот способ намного эффективнее, и он будет работать лучше и быстрее, и выу вас будет намного меньше шансов перегрузить систему.

Я попытался упростить проблему под рукой. В актуальном проекте "тс» Экземпляры клипа сначала создаются как пустые клипы и добавляются динамически, их может быть больше одного. И дети могут быть очень разными,Просто невозможно добавить их все, будет слишком много лишних строк. Может быть еслитс» клип находится в библиотеке и имеет класс связывания, вместо имени, который класс может использовать getQualifiedClassName () или что-то в этом роде. Если имя класса отличается от mc 's использовать возврат, чтобы прервать. Murat
Я могу'не понимаю, почему это не будетт работа. Если 'тс» имеет имя не изменит ничего, так чтобудет хорошо, чтобы дать ему имя экземпляра. Также этот код может использоваться бесконечным количеством объектов. Вам просто нужно добавить несколько строк на объект. Смотрите на обновление. Stefan4024
Спасибо за ответ, по крайней мере, теперь я знаю, что это не так, как я надеялся. К сожалению, я могут твой метод, потому что "тс» будет безымянным в реальном проекте и будет иметь больше дочерних кнопок и различного типа интерактивного контента. Думаю яПридется придерживаться моего первого плана. Я создаю невидимую кнопку 1x1 втс» ниже всего и добавьте к нему событие mcDown. Затем я установил его свойства scaleX и scaleY на любую ширину и высоту "тс» есть. Я надеялся, что смогу достичь этого без этой дополнительной кнопки, но, похоже, проще всего было. Murat

Похожие вопросы