2011-11-28 99 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