Actionscript 3 如何在AS3中使用变量编写对象名以进行迭代?

Actionscript 3 如何在AS3中使用变量编写对象名以进行迭代?,actionscript-3,Actionscript 3,假设我想制作几个(或更多)具有实例名称的按钮,如“button_1”等。是否有一种方法可以通过迭代实例名称的number组件来循环一个函数或事件处理程序中的所有实例 例如: for (i = 1; i < 5; i++) { btn_[i].addEventListener(MouseEvent.CLICK, onBtn_[i]Click); } var buttons:Array = []; //creating an empty array for (var i:int =

假设我想制作几个(或更多)具有实例名称的按钮,如“button_1”等。是否有一种方法可以通过迭代实例名称的number组件来循环一个函数或事件处理程序中的所有实例

例如:

for (i = 1; i < 5; i++) {
    btn_[i].addEventListener(MouseEvent.CLICK, onBtn_[i]Click);
}
var buttons:Array = []; //creating an empty array

for (var i:int = 1; i < 5; i++) {
    buttons.push(this["button_" + i]);
}
谢谢你能提供的任何帮助

我认为有更好的方法可以做到这一点,让事件监听器引用回事件的目标?但我现在不太担心这一点,只是想知道具体如何迭代对象实例

哦,我发布的代码抛出了以下内容:

1084: Syntax error: expecting rightparen before Click.

谢谢大家

您可以通过数组语法访问属性,如下所示

Obj["foo"] = "baz";
trace(Obj.foo);     // baz
但是,下面的代码出现生成错误

["btn_1"].addEventListener      // NG
您可以通过添加“this”来避免错误


这就是修复示例代码的答案。

for (i = 1; i <= 5; i++) {  // Fixed "<" to "<=". Because it seems you want to create 1 to 5.
    this["btn_"+i.toString()].addEventListener(MouseEvent.CLICK, this["onBtn_"+i.toString()+"Click"]);
}

此外,如果
onBtn\u 1单击
onBtn\u 2单击
onBtn\u 3单击
。。。如果是类似或常见的方法,我建议您将它们集成到一个函数中 像这样

for (i = 1; i <= 5; i++) {
    this["btn_"+i].addEventListener(MouseEvent.CLICK, onBtnClick);
}

function onBtnClick(event: MouseEvent): void{

    // Some common process.
    Button(event.target).visible = false;

    // You can get the id by using event.target.name
    if (event.target.name == "btn_1"){

    }
    else if (event.target.name == "btn_2"){

    }
    else{

    }

    // Some common process.
    doSomething();
}

for(i=1;i您可以通过数组语法访问属性,如下所示

Obj["foo"] = "baz";
trace(Obj.foo);     // baz
但是,下面的代码出现生成错误

["btn_1"].addEventListener      // NG
您可以通过添加“this”来避免错误


这就是修复示例代码的答案。

for (i = 1; i <= 5; i++) {  // Fixed "<" to "<=". Because it seems you want to create 1 to 5.
    this["btn_"+i.toString()].addEventListener(MouseEvent.CLICK, this["onBtn_"+i.toString()+"Click"]);
}

此外,如果
onBtn_1单击
onBtn_2单击
onBtn_3单击
…是类似或常见的方法,我建议您将它们集成到一个函数
onBtn单击

像这样

for (i = 1; i <= 5; i++) {
    this["btn_"+i].addEventListener(MouseEvent.CLICK, onBtnClick);
}

function onBtnClick(event: MouseEvent): void{

    // Some common process.
    Button(event.target).visible = false;

    // You can get the id by using event.target.name
    if (event.target.name == "btn_1"){

    }
    else if (event.target.name == "btn_2"){

    }
    else{

    }

    // Some common process.
    doSomething();
}
for(i=1;我知道你想要什么
我想制作几个(或更多)具有实例名称的按钮,如“button_1”

不,你真的不想那样做,那是

  • 乏味:如果你需要50个按钮怎么办?你真的想手工命名吗
  • 容易出错:如果你在某处打错了字怎么办?或者你在复制和粘贴名字的公共部分时把事情弄糟了怎么办?如果你忘记了数字,或者用了一个两次怎么办
  • 不容易维护:如果你想删除按钮3到7怎么办?你如何处理这个数字的鸿沟?如果你想在中间包括2个按钮?如果你重命名所有的按钮?< /LI>
实例名称的数字组件

名称很适合识别特定的单个对象,但是如果列表应该详尽无遗,那么列出单个名称并不是一个理想的解决方案

如果你的兄弟是杰克、山姆和罗宾,你会在演讲中提到他们的名单,还是说我的兄弟

你需要什么 难道没有一种方法可以循环遍历所有实例吗

这才是真正需要的。你有几个对象,你需要一些机制来对它们进行分组

有几种这样的机制可以结合使用:

数组只是一个事物列表。所有按钮的列表是您正在寻找的分组机制。在数组中包含所有按钮和函数允许您在数组中迭代:

var buttons:Array = [btn_1, btn_2];
var functions:Array = [onBtn_1Click, onBtn_2Click];
这将允许你做一些与你要求的非常相似的事情:

for (var i:int = 1; i < buttons.length; i++) {
    buttons[i].addEventListener(MouseEvent.CLICK, functions[i]);
}
您有两种可能访问此属性。点语法:

trace(object.property);
和括号:

trace(object["property"]);
使用括号,可以动态选择特性名称:

var object:Object = {property:"hello world"};
var propertyName:String = "property";
trace(object[propertyName]);
因此可以以任何方式进行组装:

var object:Object = {property:"hello world"};
var propertyName:String = "prop";
propertyName += "erty";
trace(object[propertyName]);
由于实例名称已转换为时间线的属性名称,因此可以通过以下方式访问实例:

this["button_" + 1]
现在,您可以轻松地填充数组,例如,使用其中一个按钮:

for (i = 1; i < 5; i++) {
    btn_[i].addEventListener(MouseEvent.CLICK, onBtn_[i]Click);
}
var buttons:Array = []; //creating an empty array

for (var i:int = 1; i < 5; i++) {
    buttons.push(this["button_" + i]);
}
这段代码适用于该容器中几乎任意数量的按钮。 您所要做的就是确保将按钮添加到容器中

好的,很好,现在我如何处理函数呢

这就是问题所在:你不能。没有一种内置机制可以像显示对象那样将功能组合在一起

事件系统 我认为有更好的方法可以做到这一点,让事件监听器引用回事件的目标

确实存在,这解决了每个按钮都有单独功能的问题。相反,只有一个与事件源一起工作的功能:
currentTarget
。下面是这样一个功能的外观,即半透明度:

function onClick(e:MouseEvent):void
{
    currentTarget.alpha = 0.5;
}
现在,您可以将此功能添加到所有按钮:

for (var i:int = 0; i < buttonContainer.numChildren; i++) {
        buttonContainer.getChildAt(i).addEventListener(MouseEvent.CLICK, onClick);
}
数组是独立于显示列表的超级容器。 这仍然很糟糕。如果按钮分散在周围,无法按容器分组,该怎么办

你还记得杰克、山姆和罗宾吗?把他们称为“我的兄弟”作为他们名字的一种列表是多么容易

如果你想提到世界上所有的兄弟呢? 这似乎是一项荒谬的任务,但实际上“所有兄弟”一词恰恰做到了这一点。它没有说有多少兄弟,也没有说他们在哪里,但肯定是指他们。它这样做不是通过创建一个明确的所有兄弟的列表,而是符合兄弟的定义:男性兄弟姐妹

您也不需要所有按钮的显式列表,您只需要通过定义按钮是什么来隐式引用现有的所有按钮

类就是这样一个定义。与其通过名称、容器或任何你想象的其他方式来标识按钮对象,不如定义按钮是什么并从该定义派生对象

下面是文件透明按钮.as的外观:

package
{
    public class TransparentButton extends SimpleButton
    {
        public function TransparentButton()
        {
            addEventListener(MouseEvent.CLICK, onClick);
        }

        private function onClick(e:MouseEvent):void
        {
            this.alpha = 0.5;
        }
    }
}
本质上,这定义了当一个按钮被创建时,它会为自己添加一个监听器。该函数将其透明度降低到0.5

如果现在将该类与库中的按钮符号相关联,则会导致拖放到时间线上的按钮实例按照该类定义进行操作

免责声明:该类不需要