彻底清除或摧毁孩子

时间:2014-01-07 14:26:29

标签: actionscript-3 removechild

我有一个名叫" viseur"出现在特定场景中并替换我的实际光标。

当事件" removeViseur"被称为,我想彻底删除孩子" viseur" (我将使用我之前的光标)。

我做到了:

stage.addEventListener("functionCalled", removeViseur, false, 0, true);


public function removeViseur(e:Event):void{
                    trace("removeViseur");
                    viseur.visible = false;
            viseur.parent.removeChild(viseur);
                    viseur = null;
        }

孩子" viseur"已经不在了,但如果做Alt + tab或更换窗口并回来,孩子" viseur"回来......

你知道我怎么能完全摧毁它吗? (在调用此函数后我不需要它)

谢谢,

修改

这是我的更多代码。

public static var viseur:Viseur;

var lookCocoDessous:Boolean = thisBack == "cocotierDessous";
if (lookCocoDessous) {
     viseur = new Viseur(stage);
    stage.addChild(viseur);
    viseur.visible = true;
stage.addEventListener("functionCalled", removeViseur, false, 0, true);

 public function removeViseur(e:Event):void{
                        trace("removeViseur");
                        viseur.visible = false;
                viseur.parent.removeChild(viseur);
                        viseur = null;
            }

" viseur"有像这样的自己的类

viseur.as:

public class Viseur extends MovieClip
    {
 private var engine:Engine;
        private var stageRef:Stage;
        private var p:Point = new Point(); 

        public function Viseur(stageRef:Stage)
        {

            Mouse.hide(); //make the mouse disappear
            mouseEnabled = false; //don't let our cursor block anything
mouseChildren = false;

            this.stageRef = stageRef;
            x = stageRef.mouseX;
            y = stageRef.mouseY;

            stageRef.addEventListener(MouseEvent.MOUSE_MOVE, updateMouse, false, 0, true);
            stageRef.addEventListener(Event.MOUSE_LEAVE, mouseLeaveHandler, false, 0, true);
            stageRef.addEventListener(Event.ADDED, updateStack, false, 0, true);


        }

        private function updateStack(e:Event) : void
        {
            stageRef.addChild(this);
        }


        private function mouseLeaveHandler(e:Event) : void
        {
            visible = false;
            Mouse.show(); //in case of right click
            stageRef.addEventListener(MouseEvent.MOUSE_MOVE, mouseReturnHandler, false, 0, true);
        }

        private function mouseReturnHandler(e:Event) : void
        {
            visible = true;
            Mouse.hide(); //in case of right click
            removeEventListener(MouseEvent.MOUSE_MOVE, mouseReturnHandler);
        }

        private function updateMouse(e:MouseEvent) : void
        {
            x = stageRef.mouseX;
            y = stageRef.mouseY;

            e.updateAfterEvent();
        }

    }

}
}

1 个答案:

答案 0 :(得分:0)

只要Viseur触发,

Event.ADDED就会将自己添加到舞台上。只要向舞台添加任何内容(不仅仅是Viseur),它就会触发。您还使Viseur成为静态属性,从而确保它不会从内存中消失。

简洁:只添加Viseur一次,并从外部添加(因此无需传递阶段参考)。请注意,一旦DisplayObject成为父级,它就会自动获得stage&您可以为mouseX和mouseY引用的root属性。

那就是说,如果你试图更换鼠标光标,我强烈建议采用不同的方法:原生游标。

请参阅http://inflagrantedelicto.memoryspiral.com/2012/07/as3-quickie-native-mouse-cursors/