Flash AS3-删除添加到具有相同变量名的阶段的两个对象

Flash AS3-删除添加到具有相同变量名的阶段的两个对象,flash,actionscript-3,Flash,Actionscript 3,首先我要说的是,我对flash非常陌生,舞台的概念对我来说仍然非常陌生 我有以下问题: 在特定时间,我有: var foo:MyClass() = new Class(); stage.addChild(foo); ... foo = new myClass(); stage.addChild(object); 现在我在舞台上有两个或更多的foo对象。我的变量用于一个foo,我需要将它们全部从阶段中删除 怎么办? 谢谢我想说的是,不要对两个对象使用相同的变量 也就是说,您可以通过遍历所有子对象

首先我要说的是,我对flash非常陌生,舞台的概念对我来说仍然非常陌生

我有以下问题:
在特定时间,我有:

var foo:MyClass() = new Class();
stage.addChild(foo);
...
foo = new myClass();
stage.addChild(object);
现在我在舞台上有两个或更多的foo对象。我的变量用于一个foo,我需要将它们全部从阶段中删除

怎么办?
谢谢

我想说的是,不要对两个对象使用相同的变量

也就是说,您可以通过遍历所有子对象来删除对象,而无需对其进行唯一引用。执行此操作时,应向后循环,以便在操作计数时不会弄乱计数。在我的头顶上写下可能不完全正确的代码:

for (var i = stage.numChildren; i > 0; i--) {
  stage.remove(stage.getChildAt(i - 1));
}

虽然这两个对象现在确实存在,但您已经将foo引用值从一个新的MyClass更改为下一个。正如您所发现的,这个引用值==正好是一个对象

除了变量名之外,有许多方法可以捕获对这些对象的引用@jhocking正确地指出,您可以使用displayList的
children
参数提供访问(毕竟,displayList只是一个类似于数组的堆栈)。但是,如果在同一显示列表上下文中有其他项,则可能会产生问题

另一个好的替代方法是将对象推入一个数组(或向量),您可以在销毁时通过该数组进行循环

var objects:Array = [];

for (var i = 0; i< 10; i++){
    var newObject:MyClass = new MyClass();
    this.addchild(newObject as DisplayObject);
    objects.push(newObject);
}

for (var j = objects.length; j > 0; j--){
    this.removeChild(objects[j] as DisplayObject);
}
var对象:数组=[];
对于(变量i=0;i<10;i++){
var newObject:MyClass=newmyclass();
this.addchild(newObject作为DisplayObject);
objects.push(newObject);
}
对于(var j=objects.length;j>0;j--){
this.removeChild(对象[j]作为DisplayObject);
}

希望这有帮助-

从我看到的是,您没有向stage添加2个项目,而是重用了1个对象

// here you instantiated the object
var foo:MyClass() = new Class();

// here you added the object to stage
stage.addChild(foo);

// here you re-instantiated the object leaving it attached to the stage
foo = new myClass();

// because it was already added to the stage you just caused it to move to the top of the display list
stage.addChild(object);


// so with all that being said doing the following code one time
stage.removeChild( foo );
// should remove foo from the stage.

您要做的是创建一个变量,将其添加到stage中,然后丢弃引用,我建议您将引用存储在数组中。 在类中,添加一个数组变量来保存它们:

private var _foos:Array = [];
现在,您可以在每次创建Foo对象时存储引用:

var foo:MyClass() = new MyClass();
// Add it to the stage
stage.adddChild(foo);
// Store the reference
_foos.push(foo);

foo = new MyClass();
// Add it to the stage
stage.adddChild(foo);
// Store the reference
_foos.push(foo);
如果要将它们全部清除,只需在引用数组中循环:

for each (var foo:MyClass in _foos) {
    stage.removeChild(foo);
}
// Empty the array
_foos = [];
或者,就像乔金所说的,你可以在舞台上的所有孩子中间循环,看看他们是否是你班上的类型:

for (var i = stage.numChildren-1; i >= 0; i--) {
    var child:DisplayObject = stage.getChildAt(i);
    if (child is MyClass)
        stage.removeChild(child );
}

谢谢我理解你为什么说使用不同的变量,但这是一个巨大的项目,我不能乱写代码,因为我不相信我的知识。我知道你的代码,但我不认为它考虑了对象的类型(类),所以它会删除舞台上的所有对象,对吗?也就是说,我将找出如何将其过滤到我的类中。你是对的,该循环将获得舞台上的所有对象。如果要筛选特定类,请使用“is”关键字,如“If(child是myClass)”。很抱歉,比如If(foo是myClass)?我不知道sintaxeyetcleaner的方法是while(stage.numChildren){stage.remove(stage.getchildren(0));}聪明的,它利用了这样一个事实,即每次删除一个时numChildren都会下降。不幸的是,只有当你要删除所有的子对象,而不按照他想要的过滤它们时,这才有效。我希望,它只删除对它的最后一个引用。无论如何,谢谢对“new”的每次调用都会创建一个新对象。有趣的是,我运行了一些示例代码,发现您实际上是正确的。这是一个OOP噩梦,当你有一个对foo的引用时,无论你对它做什么,该引用都不应该改变。不,这不是一个OOP噩梦,这是预期的行为。如果您永远无法更改引用,那么您就永远无法删除它,如果您永远无法删除它,那么对象将永远不会成为垃圾进行收集。垃圾收集的整个概念都依赖于不再需要的反引用对象。请这样想:如果创建一个对象,不要将其添加到stage(因为这是另一个引用),然后使用同一个变量创建新对象,现在没有对第一个对象的引用,因此会将其从内存中删除。