方括号表示法动态加载库项目?

时间:2014-04-14 22:37:47

标签: actionscript-3 flash eval swc square-bracket

所以我花了几个小时的时间试图节省自己几分钟,让我的代码更整洁,谷歌没有产生任何东西,所以现在我爬到stackoverflow。问题在于方括号表示法+库项目:

所以,让我们假设您有一个名为" myMC_5"的MovieClip,并且您想要将其X位置设置为0 ..

myMC_5.x = 0;

..如果你不想对MC的名称进行硬编码,而是想要一行代码根据变量移动特定的MovieClip,你可以这样做:

var selectMC = 5;
root["myMC_"+selectMC]x = 0;

..这将与myMC_5.x = 0具有完全相同的效果,除了这次你必须指定位置(" root"或"这个"或者什么)

问题:

我正在制作一个游戏,其中背景图片是从图书馆加载的,并且每个级别的图片都不同。从库中初始加载矢量看起来像这样:

private var land:vector_land0 = new vector_land0();

..这工作正常,但它只加载一个特定的向量。应该有大约30或更多。我想在构造函数中只有一行代码来加载它们中的任何代码,基于跟踪当前级别的变量,如下所示:

private var land:["vector_land"+theLevel] = new ["vector_land"+theLevel]();

..但这不起作用。我得到语法错误("在leftbracket&#34之前期待标识符),因为您需要指定对象的位置,如第一个示例所示:

root["myMC_"+"whatever"].x = 0;

..但是这个图书馆项目没有"位置"。那么,如何动态加载来自库的向量?它不是"在根"或其他任何地方。它没有位置。我拒绝相信实现这一目标的标准方法是创建30个不同的类或用30&#34写一个巨大的代码块;如果"声明,但搜索谷歌一无所获。 :(

2 个答案:

答案 0 :(得分:1)

听起来你正在寻找 getDefinitionByName() ,你可以用来做这样的事情:

import flash.utils.getDefinitionByName;

private var LevelVectorClass:Class = getDefinitionByName("vector_land" + theLevel) as Class;
private var land:Object = new LevelVectorClass();

答案 1 :(得分:-1)

这是一种解决问题的可怕方法,我不建议在arrays之外的任何地方使用方括号。我建议你将“土地”放入LandContainer MovieClipMovieClip的每一帧都是容器1图形。它更清晰,你可以创建常量来存储框架的“身份”。
例如:

var land:LandContainer = new LandContainer();
land.gotoAndStop(FIRST_LEVEL); //FIRST_LEVEL is a constant integer

您甚至可以重复使用此LandContainer实例,因为您可以设置它的可见性,从显示列表中删除,将其帧设置为下一级别而不创建其他实例。第二个想法,我会写一个这个类的包装器。 Aka将它链接到您自己的类,它扩展了MovieClip类并创建自定义函数,字段......等。

这种充满活力的东西很可怕,很难维护,根本没有效率。不知道他们为什么不从AS3删除它......他们应该有。