【问题标题】:var mC:mc = new mc is adding the mc immediately?var mC:mc = new mc 是否立即添加 mc?
【发布时间】:2016-03-17 23:58:59
【问题描述】:

我在这里是一个困惑的菜鸟。我有以下代码:

var mC:mc = new mc();

我确实用 addChild(mC) 实例化 mC;

但是,在代码的后面,我有一个使用 onEnterFrame 的循环,在这个循环中我有以下跟踪函数:

if(mC){
    trace("mC is here");
}

这会在输出窗口中返回“mC is here”。 哈???

问题是我想用这个'if'语句来removeChild(mC); [稍后我将使用 addChild(mC) 将其添加到代码中;基于发生的某些事情],但即使在“if”条件下,它也会不断抛出“错误的调用者的孩子”消息......

什么我做错了吗?我不知道声明变量会将它们添加到舞台/显示列表中,我认为您需要一个 addChild();陈述。我是不是在抽不该抽的东西?

提前致谢,~Frustrated Inc.

【问题讨论】:

  • 正在执行“var mC:mc = new mc();”被称为“实例化”,它是创建对象的过程。您所说的实例化“addChild”与该过程无关。

标签: actionscript-3 variable-declaration addchild


【解决方案1】:

在您的代码中,您只需控制变量是否为空。

您可以在要添加到的显示对象上使用contains 方法。

如果您将 mC 添加到某个名为 sprite 的容器中,您可以简单地检查它是否存在于该容器中:

if (!container.contains(mC))
     container.addChild(mC);

编辑:控制影片剪辑是否在舞台上更安全的方法是控制它的舞台值。

if (mC.stage) {
     mC.parent.removeChild(mC); // this is how you remove, if you simply want to check existence, don't remove it
}

如果您将影片剪辑添加到舞台或添加到舞台的容器,则它必须具有舞台值。

希望这样更清楚。

【讨论】:

  • 谢谢你!我接下来会学习这个技术,它看起来很有用。
  • 投了反对票。这是一个错误的答案。 contains 方法并非用于此目的,也不会提供正确的结果。 contains 方法是检查 DisplayObject 是否在调用者的整个显示列表中的任何位置。这意味着即使选中的 DisplayObject 位于显示列表的下方 1、3 或 30 级,它也会返回 true。因此,使用它并使用 removeChild 是完全错误的,因为 removeChild 仍然会引发错误,因为 contains 不能保证 DisplayObject 是调用者的子对象。
  • 我的答案和你的@BotMaster 没有太大区别是的,如果你不知道你把你​​的电影剪辑放在哪里,在寻找包含之前检查父母会更安全。在您的情况下,您可以将 mC 添加到另一个容器中,并且您可能在阶段中看不到,因为您添加的容器未添加到阶段,但 mc.parent 返回不为空。这是开发人员的偏好,因为我知道我喜欢使用包含的电影剪辑放在哪里。如果您没有将父级添加到舞台,您的回答也可能表现异常。
  • 即使父级不在显示列表中,我的答案也会起作用,因为它所做的只是检查父级,然后从该父级中删除。如果整件事情都在舞台上或不在舞台上,它不会阻止它的工作。 contains 方法不仅不意味着检查孩子是否在直接父显示列表中,而且根据定义它也很慢,因为它必须遍历所有后代的所有显示列表。让我们在 Nk(让我们从 5000 开始)循环中对复杂场景进行性能比较,看看哪个系统会更快。使用 contains 会远远落后 + 并不能保证任何事情。
  • 阶段检查更好,取消投票。检查父母仍然会更重要。
【解决方案2】:

AS3 中的复杂对象(即任何非字符串或数字)的默认值为 null。 WHen 评估 null 的默认值等于 false:

var mymc:MovieClip;//that MC is NOT instantiated yet so it has a default value of null
if(mymc)
{
    //mymc is null so this evaluates to false
    //and this statement DOES NOT execute

现在,当一个复杂对象被实例化并存在时,它的值现在将评估为 true

var mymc:MovieClip = new MovieClip();//that MC IS instantiated 
if(mymc)
{
    //mymc exits so this evaluates to true and this statement EXECUTE
    //notice that "!= null" is not necessary

现在您的问题与显示列表有关。 DisplayObject 的 parent 属性在该对象未添加到显示列表时为 null,而当该对象添加到显示列表时该属性指向父项:

var mc:MovieClip = new MovieClip()
trace(mc.parent);//this is null
addChild(mc);
trace(mc.parent);//this is not null anymore and points to the parent

所以你的意思是:

if(mC.parent){//this means mC has a parent and can be removed from it
    trace("mC is here");        
}

【讨论】:

  • +1,我想用同样的例子回答mc.parent,你打败了我;)我认为最好和最简单的方法是验证对象的父级。
【解决方案3】:

当你新建一个对象时,它存在于内存中,即使你没有将它添加到舞台上。这就是为什么当您检查 mC 是否存在时,它会返回 true。您想检查它是否存在于舞台上。比如:

var mc:MovieClip = new MovieClip();
mc.name = "test";
if (this.getChildByName("test") != null) {
  trace("mc is on stage");
}

我很久没用过Flash了,所以没有测试这段代码。希望它有效。

【讨论】:

  • 谢谢弗雷泽。好的,我知道'!= null' 的意思是'不等于null',但是每次我想建立一个关于mC 的'if' 语句时,我是否应该使用相同的方法?所以,如果我想在舞台上移动它,将它从舞台上移除等等。我需要每次都使用'if(this.getChildByName()!= null'?似乎我添加的其他MovieClips不需要这段代码,但这个确实......〜困惑
  • @coderJoker 通常,您会在实例化之后立即将 MovieClip 添加到舞台。在大多数情况下,您可以假设 MovieClip 将出现在舞台上。只有在您出于某种原因需要从舞台上移除 MovieClip 的情况下,您才需要检查它。当您遇到运行时错误时,您将添加 if 语句以防止错误再次发生。
  • 现在它抛出错误 #1006: getChildByName is not a function...我只是不明白我做错了什么。肯定有别的东西在工作中扔扳手......
  • 也许你可以在这里找到答案:stackoverflow.com/questions/7280203/…
  • 谢谢弗雷泽。我显然还有更多关于展示、舞台和地址的知识要了解。我从您的示例中删除了“this”,它现在可以工作了。我不知道为什么,在我成为一名程序员之前,我需要了解原因。知道要问什么问题与获得问题的答案一样重要。感谢您的所有帮助! CJ
猜你喜欢
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
相关资源
最近更新 更多