我有一个简单的功能,当你点击一个按钮时,会在一个随机的x和y位置将一个影片剪辑添加到舞台上。我遇到的问题是新的电影剪辑最终掩盖了按钮。我试图将新创建的mc的z-index更改为低于按钮的z-index,但这并不能解决问题。如何阻止新的mc覆盖已经存在的元素。
friends1_btn.addEventListener(MouseEvent.CLICK, friendMaker);
function friendMaker(evt:MouseEvent):void {
var newFriend:Teddy = new Teddy();
newFriend.x = Math.random()*stage.width;
newFriend.y = Math.random()*stage.height;
newFriend.z = 0;
stage.addChild(newFriend);
}
答案 0 :(得分:12)
或者 - 或者更多地使用longterm - 不要将所有添加的对象作为与按钮相同的图层的子项。
所以而不是:
stage
|
+--- object 1
|
+--- object 2
|
+--- button
|
+--- object 3
有:
stage
|
+--- object layer
| |
| +--- object 1
| |
| +--- object 2
|
+--- button
甚至:
stage
|
+--- object layer
| |
| +--- object 1
| |
| +--- object 2
|
+--- button layer
|
+--- button
object layer
和button layer
只能是Sprite
个对象,即:
var objectLayer:Sprite=new Sprite();
var buttonLayer:Sprite=new Sprite();
stage.addChild(objectLayer);
stage.addChild(buttonLayer);
buttonLayer.addChild(myButton);
等等。
我认为你会发现长期思考这种方式更有用,而不仅仅是改变z指数。
顺便提一下,更新的Flash Player 10 具有.z
属性(即使它不在文档中) - 正如Reuben所说,它用于新的3D变换。遗憾的是,3D变换对z排序或z分层没有任何支持,所以在这种情况下没有帮助。
答案 1 :(得分:2)
我知道这个问题已经得到解答了,但您也可以使用addChildAt()来指定要添加DisplayObject的索引,可以使用numChildren,也可以保留自己的索引记录来添加。< / p>
private var friends1_btn:Sprite;
function friendMaker(evt:MouseEvent):void
{
var newFriend:Teddy = new Teddy();
newFriend.x = Math.random()*stage.width;
newFriend.y = Math.random()*stage.height;
stage.addChildAt(newFriend, stage.numChildren-1);
//or if your not sure if the button will always be on top
stage.addChildAt(newFriend, stage.getChildIndex(friends1_btn)-1);
}
您不希望继续将原始按钮添加到舞台,因为这将继续触发事件Event.ADDED_TO_STAGE,由于显示列表的工作方式,按钮将从舞台中短暂移除,因此也会导致闪烁。
答案 2 :(得分:0)
MovieClip在AS3 (reference)
中没有名为“z”的属性您应该阅读AS3的新display list模型。它应该可以帮助您了解对象如何相互叠加。
答案 3 :(得分:0)
swapChildren()应该这样做。
friends1_btn.addEventListener(MouseEvent.CLICK, friendMaker);
function friendMaker(evt:MouseEvent):void {
var newFriend:Teddy = new Teddy();
newFriend.x = Math.random()*stage.width;
newFriend.y = Math.random()*stage.height;
stage.addChild(newFriend);
stage.swapChildren(newFriend, friends1_btn);
}
答案 4 :(得分:0)
无论您做什么,这种方式都将确保按钮是最顶级的项目。在已添加的内容(在同一容器中)上调用addChild会将其读取到顶部。
friends1_btn.addEventListener(MouseEvent.CLICK, friendMaker);
function friendMaker(evt:MouseEvent):void {
var newFriend:Teddy = new Teddy();
newFriend.x = Math.random()*stage.width;
newFriend.y = Math.random()*stage.height;
stage.addChild(newFriend);
stage.addChild(friends1_btn);
}
您也可以通过替换
来做同样的事情stage.addChild(friends1_btn);
带
stage.swapChildrenAt(stage.getChildIndex(friends1_btn), stage.numChildren - 1);
答案 5 :(得分:0)
MovieClip的“z”属性用于Flash Player 10中的3D转换 - 而您需要明确设置MovieClip
的子索引
一种好方法是手动将friends1_btn
的索引设置为前面:
friends1_btn.addEventListener(MouseEvent.CLICK, friendMaker);
function friendMaker(evt:MouseEvent):void {
var newFriend:Teddy = new Teddy();
newFriend.x = Math.random()*stage.width;
newFriend.y = Math.random()*stage.height;
stage.addChild(newFriend);
stage.setChildIndex(friends1_btn,stage.numChildren-1);
}
(旁注 - 如果你想在舞台上随机定位一个MovieClip,你应该使用stage.stageWidth
和stage.stageHeight
,否则你只能得到舞台上物体的宽度和高度,不是舞台本身。)