【问题标题】:ActionScript 3 - Add and remove child from stageActionScript 3 - 在舞台上添加和删除孩子
【发布时间】: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);
}

【问题讨论】:

    标签: actionscript-3


    【解决方案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);*/
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-20
        • 2020-03-06
        • 1970-01-01
        相关资源
        最近更新 更多