flash as3 mouseChildren问题
问题描述:
我有一个剪辑,我正在绘制并添加到舞台上,当它被点击时,它将自己的两个副本添加为儿童。我希望这些孩子可点击,但问题是,如果他们被点击,它会将点击注册为父点击和其子点。因此,不是添加两个新剪辑,而是添加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++;
}
答
事件侦听器只登记了一个对象,但它接收到来自它的孩子click
事件,因为MouseEvents冒泡显示列表(即它们在层次结构向上前进) ,所以每个父母对象都会收到事件,甚至是舞台。
要停止发生这种情况,您必须明确停止事件的传播。动作脚本事件有两种方法是:
==>从在稍后执行的节点正在接收停止事件(即其它目的后的currentTarget
,但允许同一对象到火灾内的其它听众。
==>在此刻停止事件是收到,无论还有谁在听的。
除非你要做的事情不是你的代码中的东西,它们都应该可以正常工作。因此,在您clickCircle处理程序中添加一行:
function clickCircle(e:MouseEvent):void {
// --- This should stop the event from bubbling up in the display list
e.stopPropagation();
var thisCircle = e.target;
在附加的注释:你应该考虑包装这个代码放到一个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
谢谢 - 会做。是的 - 这开始只是一个实验,但它开始有点广泛,所以我要回去重构和重组代码。我以前从未见过stopPropagation方法,这非常有帮助。 – mheavers