你应该在哪里处理事情取决于很多因素,我的列表中的第一个是你是否使用 Flex 框架,第二个是最适合给定应用程序的。对于您的情况,您似乎只是在使用 Flash IDE。
您需要收集添加到显示树的花卉对象。然后在点击时,您将希望使用点击的目标来了解他们采摘了哪朵“花”,而不是随意移除一些花。
收集花朵的另一个好处是您实际上可以切换可见性(这也可以切换触摸/单击与对象交互的能力)。然后,您可以一次创建全部 Flower 对象,或者至少重复使用,而不必进行垃圾收集并制造大量对象(正如 Daniel 在下面所指出的,该术语是对象池)。
import flash.events.MouseEvent;
var allFlowers:Array = [];
var oldFlowers:Array = [];
function makeFlower() {
var flower:Flower;
if(oldFlowers.length>0) //if there's stale ones, already created but since picked
{
flower = oldFlowers.pop();//grab the last one from the list
flower.visible=true;//show it, update to position below should happen fast enough so you won't see it move
}
else
flower = new Flower();
allFlowers.push(flower);
addChild(flower);
flower.addEventListener(MouseEvent.CLICK, removeFlower); //Adding the listener directly to the Flower object, assuming it's a Sprite/MovieClip/InteractiveObject of some sort
flower.x = Math.random() * 500;
flower.y = Math.random() * 400;
}
function removeFlower(event:MouseEvent):void {
var clickedFlower:Flower = (event.target as Flower); //this is a local reference
clickedFlower.pick(); //assuming this toggles the visibility
oldFlowers.push(allFlowers.splice(clickedFlower,1)); //removing it from the "active array" putting it in the "stale array"
}
setInterval(makeFlower, 2500);
理想情况下,这将全部包含在一个类中,真正的作用域变量在类的上下文中对我来说比仅仅在某个地方的某个代码块中晃来晃去更有意义。
由于在您的原始代码中您声明花是一个 var 并为其提供存储在该 var (Flower) 中的对象类型,因此它的范围仅限于该函数的打开和关闭花括号。对于我定义的变量,只要包含代码的对象可用,它们就应该可用。
在 AS3 中的类中声明变量或函数时,可以使用三种主要的“作用域修饰符”(即 public、protected 或 private)。使用公共意味着属性/方法(成员)可以在类定义(通常是文件,something.as)以及其他任何东西中访问,如果你将变量设为公共,它可以被任何使用代码的东西修改,这个如果来自外部的更改是无意的,可能会导致您的应用程序出现不可预测的行为。使用受保护意味着从类继承或扩展类的任何东西都可以访问/使用受保护的成员,但是只有对象实例的任何东西都不能访问这些成员(因此称为访问修饰符)。第三级是私有的,这意味着只有该类中的代码(跨所有方法)可以访问该成员,但该类的继承/子类不能访问该成员。这本质上是计算机科学中通常称为封装的概念的实现。还有更多细节,但实际上对于一个像样的 SO 帖子来说已经太长了。