ActionScript 3 - 在舞台上添加和删除孩子

Posted

技术标签:

【中文标题】ActionScript 3 - 在舞台上添加和删除孩子【英文标题】:ActionScript 3 - Add and remove child from stage 【发布时间】:2011-08-03 05:33:12 【问题描述】:

我只是在学习 ActionScript 3,所以对于专业人士来说,这可能是一个简单的问题。 我创建了想要通过使用按钮添加到舞台(从库中)的影片剪辑。我总共有六个按钮(和六个moviclips),但我试图让前两个工作,然后再继续下一个按钮。问题是当单击另一个按钮或同一个按钮时,我似乎无法删除影片剪辑......就像我说我是新手,我认为这造成了一堆乱七八糟的东西......我收到错误2007 年现在

import flash.events.MouseEvent;
import flash.display.MovieClip;

mix_btn.addEventListener(MouseEvent.CLICK, addbear);
function addbear(event:MouseEvent):void

    var movieClip:bear1 = new bear1();
    addChild(movieClip);
    movieClip.x = 240;
    movieClip.y = 45;


mix_btn.removeEventListener(MouseEvent.CLICK, addbear);
mix_btn.addEventListener(MouseEvent.CLICK, removebear);

function removebear(event:MouseEvent):void

    var movieClip:bear1 = null;
    removeChild(movieClip);
    mix_btn.removeEventListener(MouseEvent.CLICK, removebear);
/*  mix_btn.addEventListener(MouseEvent.CLICK, addbear);*/

shake_btn.addEventListener(MouseEvent.CLICK, addbear3);
function addbear3(event:MouseEvent):void

    var movieClip:bear3 = new bear3();
    addChild(movieClip);
    movieClip.x = 240;
    movieClip.y = 45;

    shake_btn.removeEventListener(MouseEvent.CLICK, addbear3);
    shake_btn.addEventListener(MouseEvent.CLICK, removebear3);

function removebear3(event:MouseEvent):void

    var movieClip:bear3 = null;
    removeChild(movieClip);
    shake_btn.removeEventListener(MouseEvent.CLICK, removebear3);
    shake_btn.addEventListener(MouseEvent.CLICK, addbear3);

【问题讨论】:

【参考方案1】:
var movieClip:bear1 = null;
removeChild(movieClip);
mix_btn.removeEventListener(MouseEvent.CLICK, removebear);

这里的这一部分,你基本上是尝试删除一个空对象,这通常很糟糕:)。这也适用于“snake”和其他按钮或影片剪辑。如果你想移除你点击的熊,试试这个:

var movieClip:bear1 = bear1(event.currentTarget);
removeChild(movieClip);
mix_btn.removeEventListener(MouseEvent.CLICK, removebear);

【讨论】:

【参考方案2】:

问题是您将movieClip 引用为函数级变量,该函数完成后该变量消失。当您的删除功能稍后发生时,movieclip 本身仍然存在,但您用来引用它的movieclip 变量已经消失。

如果remove事件直接在bear上,你可以使用event.currentTarget来访问和移除它。

相反,由于您的侦听器看起来像是在一个单独的按钮上,因此您需要对可以在任何地方工作的影片剪辑的引用。如果您为影片剪辑分配一个实例名称,您可以在以后使用它来访问和删除它。

function addbear(event:MouseEvent):void 
 
    var movieClip:bear1 = new bear1();
    addChild(movieClip); 
    movieClip.x = 240; 
    movieClip.y = 45;
    movieClip.name = "bear1";  
 

function removebear(event:MouseEvent):void 
 
    removeChild(getChildByName("bear1"));
 

【讨论】:

只要添加到显示列表中,它就不能“消失”。不仅如此,他还使用了 2 个不同的局部变量,所以肯定不是这样的。【参考方案3】:

这完全是范围问题 在您的函数 addbear 中,您创建一个作用域为该函数的 var,称为 movieClip

mix_btn.addEventListener(MouseEvent.CLICK, addbear);
function addbear(event:MouseEvent):void

    var movieClip:bear1 = new bear1();
    addChild(movieClip);
    movieClip.x = 240;
    movieClip.y = 45;


mix_btn.removeEventListener(MouseEvent.CLICK, addbear);
mix_btn.addEventListener(MouseEvent.CLICK, removebear);

function removebear(event:MouseEvent):void

    var movieClip:bear1 = null;
    removeChild(movieClip);
    mix_btn.removeEventListener(MouseEvent.CLICK, removebear);
/*  mix_btn.addEventListener(MouseEvent.CLICK, addbear);*/

要纠正这个问题,您需要将 mopvieClip 的范围移到函数之外

   mix_btn.addEventListener(MouseEvent.CLICK, addbear);
    var movieClip:bear1 // **********************global scoping
    function addbear(event:MouseEvent):void
    
        movieClip = new bear1(); // *************constructing new GLOBAL object here
        addChild(movieClip);
        movieClip.x = 240;
        movieClip.y = 45;


    mix_btn.removeEventListener(MouseEvent.CLICK, addbear);
    mix_btn.addEventListener(MouseEvent.CLICK, removebear);
    
    function removebear(event:MouseEvent):void
    
        removeChild(movieClip);//****************** remove movieClip first
        movieClip= null; // **********************destroying GLOBAL object here
        mix_btn.removeEventListener(MouseEvent.CLICK, removebear);
    /*  mix_btn.addEventListener(MouseEvent.CLICK, addbear);*/
    

【讨论】:

以上是关于ActionScript 3 - 在舞台上添加和删除孩子的主要内容,如果未能解决你的问题,请参考以下文章

Actionscript 3.0 - 检测已放置在舞台上的多个实例并将它们添加到数组中

ActionScript 3 使用动作脚本将子项添加到舞台

ActionScript 3 AS3:在舞台实用程序上对齐对象

在舞台上有多个玩家 actionscript 3.0 php MySQL

ActionScript 3 AS3:安全地从舞台上删除内容

无法识别数组中的 Actionscript 3 子项