0

所以我花了令人尴尬的几个小时试图为自己节省几分钟并让我的代码更整洁,而 Google 什么也没产生,所以现在我爬到 stackoverflow 上。问题在于方括号符号+库项目:

因此,假设您有一个名为“myMC_5”的影片剪辑,并且您想将其 X 位置设置为 0..

myMC_5.x = 0;

..如果您不想硬编码 MC 的名称,而是希望一行代码根据变量移动特定的 MovieClip,您可以执行以下操作:

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

..这将具有与 myMC_5.x = 0 完全相同的效果,只是这次您必须指定位置(“root”或“this”或其他内容)。

问题:

我正在开发一个游戏,其中背景的图形是从库中加载的,并且每个级别都不同。从库中初始加载向量如下所示:

private var land:vector_land0 = new vector_land0();

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

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

..但这不起作用。我收到语法错误(“在左括号之前需要标识符”),因为您需要指定对象的位置,就像在第一个示例中一样:

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

..但是这个图书馆项目没有“位置”。那么,我到底如何从库中动态加载向量呢?它不是“在根上”,也不是在其他任何地方。它没有位置。我不相信实现这一点的标准方法是创建 30 个不同的类或用 30 个“if”语句编写一个巨大的代码块,但搜索 Google 却一无所获。:(

4

2 回答 2

1

听起来您正在寻找getDefinitionByName(),您可以使用它来执行以下操作:

import flash.utils.getDefinitionByName;

private var LevelVectorClass:Class = getDefinitionByName("vector_land" + theLevel) as Class;
private var land:Object = new LevelVectorClass();
于 2014-04-14T23:54:28.347 回答
-1

这是解决这种情况的一种可怕方法,我不建议在任何地方使用方括号,但arrays. 我建议您将“土地”放入 aLandContainer MovieClip中,其中的每一帧都MovieClip将包含 1 个图形。它更干净,您可以创建常量来存储帧的“身份”。
例子:

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

您甚至可以重用此 LandContainer 实例,因为您可以设置它的可见性、从显示列表中删除、将其框架设置到下一个级别,而无需创建另一个实例。再三考虑,我会为这个类写一个包装器。Aka 将其链接到您自己的类,该类扩展了MovieClip该类并创建自定义函数、字段...等。

这种动态的东西是可怕的,难以维护,而且根本没有效率。不知道他们为什么不从 AS3 中删除它......他们应该有。

于 2014-04-14T22:50:04.247 回答