2011-11-28 126 views
0

我有一個剪輯,我正在繪製並添加到舞臺上,當它被點擊時,它將自己的兩個副本添加爲兒童。我希望這些孩子可點擊,但問題是,如果他們被點擊,它會將點擊註冊爲父點擊和其子點。因此,不是添加兩個新剪輯,而是添加4.我可以通過將mouseChildren = false添加到movieClip來解決此問題,但是當我這樣做時,新剪輯從父剪輯的中心繪製,而不是從被點擊的剪輯的來源。我該如何解決這個問題?這是我的代碼:flash as3 mouseChildren問題

function clickCircle(e:MouseEvent):void { 
    var thisCircle = e.target; 
    for (var i=0; i<thisCircle.childCircles;i++){ 
     trace('drawCircle' + i); 
     drawCircle(thisCircle); 
    } 
} 

function drawCircle(parentCircle){ 

    //trace('draw circle' + childCircles); 
    var xPos; 
    var yPos; 
    if (circleCount == 0){ 
     xPos = centerStageX; 
     yPos = centerStageY; 
    } else { 
     //xPos = parentCircle.x; 
     //yPos = parentCircle.y; 
     xPos = yPos = 0; 
    } 

    var newCircle:Shape = new Shape(); 
    newCircle.graphics.beginFill(circleColor); 
    newCircle.graphics.drawCircle(0,0,cr); //x, y, radius 
    newCircle.graphics.endFill(); 

    var circleClip:MovieClip = new MovieClip(); 
    //circleClip.mouseChildren = false; 
    circleClip.childCircles = numCircles; 
    circleClip.x = xPos; 
    circleClip.y = yPos; 
    circleClip.addChild(newCircle); 
    circleClip.id = circleCount; 
    if (circleCount == 0){ 
     addChild(circleClip); 
    } else { 
     parentCircle.addChild(circleClip); 
    } 

    circleArray.push(circleClip); 
    circleClip.addEventListener(MouseEvent.CLICK,clickCircle); 
    if (circleCount != 0){ 
     moveCircle(parentCircle,circleClip,xPos,yPos); 
    } 
    circleCount++; 
} 

回答

2

事件偵聽器只登記了一個對象,但它接收到來自它的孩子click事件,因爲MouseEvents冒泡顯示列表(即它們在層次結構向上前進) ,所以每個父母對象都會收到事件,甚至是舞臺。

要停止發生這種情況,您必須明確停止事件的傳播。動作腳本事件有兩種方法是:

stopPropagation

==>從在稍後執行的節點正在接收停止事件(即其它目的currentTarget,但允許同一對象到火災內的其它聽衆。

stopImmediatePropagation

==>在此刻停止事件是收到,無論還有誰在聽的。

除非你要做的事情不是你的代碼中的東西,它們都應該可以正常工作。因此,在您clickCircle處理程序中添加一行:

function clickCircle(e:MouseEvent):void { 

    // --- This should stop the event from bubbling up in the display list 
    e.stopPropagation(); 

    var thisCircle = e.target; 
+0

在附加的註釋:你應該考慮包裝這個代碼放到一個MyCircle類 - 與基於時間軸的ActionScript的是我會限制簡單'停止()'或'gotoAndPlay()'種類的程序。如果您要用ActionScript做更多工作,請查看本教程:http://www.adobe.com/devnet/flash/quickstart/creating_class_as3.html或此視頻:http://www.adobe.com/ devnet/flash/articles/first_as3_class.html – weltraumpirat

+0

謝謝 - 會做。是的 - 這開始只是一個實驗,但它開始有點廣泛,所以我要回去重構和重組代碼。我以前從未見過stopPropagation方法,這非常有幫助。 – mheavers