2012-09-09 3 views
2

무대에서 나는 내부에 그려진 간단한 사각형이있는 "mc"라는 MovieClip을 가지고 있습니다. 또한 mc에는 "btn"이라는 이름의 Button 자식이 있습니다.이 자식은 (mc의 사각형보다 분명히 작은) 다른 간단한 사각형입니다. 그럼이 코드는 무대에 있습니다.AS3 - MovieClip의 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 이벤트는 트리거를하고 "MC"와 "BTN"모두를 추적합니다.

버튼을 클릭하면 bcnown과 btnClick 만 트리거되도록하려면 어떻게해야합니까? 나는 CLICK 대신에 MOUSE_UP을 시도했다. 그리고 mcDown 이벤트는 MOUSE_DOWN을 유지해야합니다.

답변

1

dispatchEvent에서 bubbles 매개 변수를 false로 설정하는 것 외에는 버블 링을 방지 할 수있는 방법이 없습니다.

그러나 체크를하면 거품이 생기는 것을 피할 수 있습니다. 아래 라인을 리스너 함수의 첫 번째 라인으로 사용하면 대상 이외의 모든 객체에서 전달되는 이벤트를 피할 수 있습니다.

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

따라서, 샘플 코드, 당신은 버튼을 모두 이벤트 디스패치를 ​​클릭하면하지만 위의 라인이 말했다 후 mcDown 함수는 실행되지 않습니다.

+0

감사합니다. 이것은 하나의 수표로 트릭을 수행하는 것 같습니다! – Murat

+0

당신은 환영합니다 :) – 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 
} 

나는이 방법이 훨씬 더 effiecient이라고 생각하고 그것은 것 잘 작동하고 빠르게 시스템을 과부하 많은 작은 기회를 가질 수 있습니다.

+0

답변을 주셔서 감사합니다. 적어도 지금은 내가 원하는대로 할 수 없다는 것을 알고 있습니다. 불행히도 "mc"는 실제 프로젝트에서 이름이 없으므로 더 많은 자식 단추와 다양한 유형의 대화 형 콘텐츠가 있으므로 메서드를 사용할 수 없습니다. 제 첫 계획을 고수해야겠군요. 나는 모든 것 아래에있는 "mc"에 보이지 않는 1x1 버튼을 만들고 그 대신에 mcDown 이벤트를 추가합니다. 그런 다음 scaleX 및 scaleY 속성을 "mc"의 폭과 높이로 설정합니다. 그 여분의 버튼없이 이것을 달성 할 수 있었으면 좋았을 텐데 가장 쉬운 방법은 그렇게 보였습니다. – Murat

+0

왜 작동하지 않을지 알 수 없습니다. 'mc'에 이름이 있으면 아무 것도 변경되지 않으므로 인스턴스 이름을 지정하는 것이 좋습니다. 또한이 코드는 무한히 많은 수의 객체에서 사용할 수 있습니다. 객체 당 몇 줄을 추가하기 만하면됩니다. 업데이트를 확인하십시오. – Stefan4024

+0

나는이 문제를 간소화하려고 노력했다. 실제 프로젝트에서 "mc"클립 인스턴스는 빈 클립으로 먼저 만들어지고 동적으로 추가됩니다. 둘 이상일 수 있습니다. 그리고 아이들은 너무 많은 다른 것들이 될 수 있습니다, 그것들을 모두 추가하는 것은 불가능합니다. 너무 많은 여분의 줄이 될 것입니다. 어쩌면 "mc"클립이 라이브러리에 있고 클래스 대신 getQualifiedClassName() 또는 그와 비슷한 클래스가 사용할 수있는 Linkage 클래스가있는 경우 일 수 있습니다. 클래스 이름이 mc의 사용법과 다른 경우 반환하면 중단됩니다. – Murat

관련 문제