Actionscript 3 如何在AS3中使用变量编写对象名以进行迭代?
假设我想制作几个(或更多)具有实例名称的按钮,如“button_1”等。是否有一种方法可以通过迭代实例名称的number组件来循环一个函数或事件处理程序中的所有实例 例如: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 =
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
如果现在将该类与库中的按钮符号相关联,则会导致拖放到时间线上的按钮实例按照该类定义进行操作
免责声明:该类不需要