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 AS3:在舞台实用程序上对齐对象
在舞台上有多个玩家 actionscript 3.0 php MySQL