var mC:mc = new mc是否立即添加mc?

时间:2015-12-11 23:31:07

标签: actionscript-3 variable-declaration addchild

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

var mC:mc = new mc();

我使用addChild(mC) NOT 实例化mC;

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

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

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

问题是我想将这个'if'语句用于removeChild(mC); [稍后我将使用addChild(mC)在代码中添加它;根据发生的某些事情]但是它仍然会在“如果”的条件下投掷dang“呼叫者的错误子”消息......

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

提前致谢,〜沮丧的公司

3 个答案:

答案 0 :(得分:1)

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

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

我很长时间没有使用Flash,所以我没有测试这段代码。希望它有效。

答案 1 :(得分:1)

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

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

如果要将mC添加到某个名为container的精灵中,您只需检查该容器中是否存在:

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
}

如果您将动画片段添加到舞台或添加到舞台的容器,则必须具有舞台值。

希望这种方式更清晰。

答案 2 :(得分:1)

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的父属性为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");        
}