我在这里是一个令人困惑的菜鸟。我有以下代码:
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();声明。我吸烟的东西不应该是吗?
提前致谢,〜沮丧的公司
答案 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");
}