数组简介
变量很像物理世界中的容器。如果我在容器中有一个对象,我可以将它取出并放在任何地方或用它做任何事情,几乎不管那个容器中可能有什么对象。我不一定需要了解有关该对象的任何信息,甚至不需要大致了解它是什么。这也适用于代码,并且是处理数组的一种特别常见的方式。
可以将数组视为具有无限隔间的容器。在数组中,每个隔间都分配有一个 ID——通常称为“索引”或“键”(记住这一点!)——我们可以使用它来标识我们想要访问的隔间。
这是一个在 AS3 中创建和读取字符串数组的简单示例:
var myArray:Array = new Array('first value here', 'this is the second entry', 'just another string');
trace(myArray);
在调试日志中会打印出来:
first value here,this is the second entry,just another string
数组中的每个项目或条目通常称为“元素”。我们也可以单独访问这些元素。例如,在上一个示例的基础上构建:
trace(myArray[0]);
将输出:
first value here
这里发生了什么?好吧,数组中的每个元素都会自动分配一个数字,从零开始按顺序分配。这是我们数组的可视化表示:
--------------------------------------
| 0 |
| first value here |
--------------------------------------
--------------------------------------
| 1 |
| this is the second entry |
--------------------------------------
--------------------------------------
| 2 |
| just another string |
--------------------------------------
...我们使用方括号[] 通过索引访问任何元素。如果我们运行trace(myArray[1]),我们会得到什么?你猜对了:this is the second entry
数组中的精灵/电影剪辑
那么,我们如何将一些东西放入我们的数组中?好吧,这是通过三种方式完成的,您不必只使用一种。最合适的方法取决于您要构建的内容。
-
通过初始化:
var myArray:Array = new Array('moose', 'newspaper', 'smoothie');
-
通过显式赋值:
var myArray:Array = new Array();
myArray[5] = 'potato';
-
通过push函数:
var myArray:Array = new Array();
myArray.push('This is my data. Guard it with your life.');
当使用push函数时,你的新元素将被分配给你数组中最大数字的索引,加1。例如,如果myArray[0]已经被使用,我们的新元素将被分配给@ 987654335@.
数组很强大,我们可以使用它们来存储任何类型的数据。虽然通常最好避免这种情况,但我们甚至可以混合存储在数组中的数据类型。例如,看看这个:
var myArray:Array = new Array('squirrel', 7, true);
此代码完全有效,并将以其本机格式存储字符串、int 和 boolean。
我们可以在数组中存储任何种对象,包括 Sprite 和 MovieClip,使用与前面所有示例相同的语法:
myArray.push(myMovieClip);
即时制作新的电影剪辑
在我们用 MovieClips(在你的例子中是石头)加载我们的数组并将它们散布在屏幕上之前,我们需要学习如何生成新的。
您为影片剪辑制作的每个“副本”都称为一个“实例”。实际上称它们为“副本”并不是描述它们的最佳方式。从某种意义上说,它们更像是“克隆”,它们都可以被动画化,并且可以完全独立地进行交互。
要生成一个新实例,过程很简单。我们只需要告诉 Flash 我们想要生成什么 MovieClip。自然地,我们需要为我们的 MovieClip 提供某种名称或 ID,以便 Flash 可以知道我们想要使用哪一个。如果您使用纯面向代码的软件在 AS3 中进行开发,例如 FlashDevelop 或 Eclipse,那么您已经知道在哪里可以找到您的 MovieClip 的名称。但是,如果您使用的是 Adobe 的 Flash Pro,第一步就不同了。
我已经很久没有使用 Adobe 的 Flash Pro 了,但是我相信这个过程应该还是非常相似的。假设您已经将对象转换为符号,这些是步骤:
- 如果库面板尚未打开,请从
Window -> Library 菜单打开。
- 单击以选择您要创建实例的影片剪辑,以便它在“库”面板的列表中突出显示。
- 如果“高级”部分尚未打开,请展开它。
- 启用“为 Actionscript 导出”。
- 如果尚未启用“在帧 1 中导出”,请启用它。 (这意味着您的 MovieClip 可以在您的游戏加载后立即与 ActionScript 一起使用,而不是仅在您在时间轴的某处使用时才使用)
- 在“类”文本框中输入您希望用于影片剪辑的名称。默认情况下,这将设置为与通常首选的 MovieClip 本身的名称相同,但您可以在此处进行选择。 (在AS3时,在选择类名时,通常被认为使用上骆驼盒的良好做法,没有符号,而且从不从数字开始。好:
Rock,BigPizza,Jersey11。Bad:rock, bigPizza, 11Jersey, 'Mashed_Potatoes`)
- 按“确定”并发出一点欢呼声,因为您现在已准备好开始在 ActionScript 中生成 MovieClip 的实例。
生成实例
从现在开始,我假设您已将 MovieClip 的“类”名称设置为“Rock”。
让我们创建一个实例:
new Rock();
瞧!那太容易了,对吧?对。如果您运行脚本,您会注意到屏幕上没有新的 MovieClip;我们需要将 MovieClip 添加到 stage。
您的 Flash 电影(或您喜欢的游戏/视频/应用程序)中显示的所有内容都在舞台上。我们可以把它想象成剧院中的真实舞台。即使我们制作了一个新的 MovieClip 实例,在我们将它放在舞台上之前也无法看到它。下面是我们如何在舞台上放一块石头:
addChild(new Rock());
这可以正常工作,但它通常不是一种非常优雅或有条理的方式,因为如果我们想对它做点什么(比如移动它),我们没有一个简单的方法来引用我们的实例)。
我们应该做的是将我们的实例放入一个变量中,如下所示:
var myRock:Rock = new Rock();
addChild(myRock);
现在我们可以通过名称来引用它:
// Here we place our instance 50 pixels from the left edge of the stage:
myRock.x = 50;
现在我们遇到了您在帖子中提到的问题:如何命名所有我想折腾的石头?显然,为每一块石头写一行代码并不是很有效。如果我想做一个岩石农场模拟并且需要 100 块岩石怎么办?有一个常见且易于使用的解决方案可以解决这种困境:数组!
但这还不是全部;我们需要学习在不命名的情况下生成 MovieClip 的实例,而做到这一点的方法是通过 loops。
循环
我不会详细介绍编写循环。它们的语法一开始可能看起来很奇怪,但是一旦你了解了这个概念就很简单了。与他们一起玩,直到您对他们的理解感到满意为止。
它们的语法如下:
for (initialization; condition; increment expression) {
// The code you want to repeat goes here
}
现在,这本身可能没有多大意义,所以让我们看看一些真实代码:
for (var i:int = 0; i < 100; i++) {
// The code you want to repeat goes here
trace ('This is iteration number ' + i);
}
这是发生了什么:
|initialization|condition|increment expression|
vvvvvvvvvvvvv vvvvvvv vvvv
for (var i:int = 0; i < 100; i++) {...
- 我们创建变量
i,初始值为0。
- 在每个循环开始时都会检查条件,如果条件计算结果为
true,则循环运行。
- 最后一部分“增量表达式”在每个循环结束时运行。
i++ 是i = i + 1 的一种更短的写法。
因此,换句话说,我们的循环首先将i 设置为0,然后在每个循环之后将i 增加1,并且每次检查i 是否小于100。由于i 从0 开始,这意味着我们的循环将运行100 次。
循环和数组
我们可以使用循环来用任意数量的 MovieClip 填充数组,如下所示:
var myMovieClips:Array = new Array();
for (var i:int = 0; i < 100; i++) {
myMovieClips[i] = new Rock();
addChild(myMovieClips[i]);
}
请注意,我们使用myMovieClips[i] 来引用我们创建的最后一个实例。我们可以使用变量的值作为引用数组中特定索引的一种方式。所以如果i = 5,那么myMovieClips[i]和myMovieClips[5]是一样的。
恭喜!您可以生成实例!
奖励:散落岩石
我们所有的电影剪辑都是在同一个地方创建的;舞台的左上角。这是因为默认情况下,MovieClips 的x 和y 属性都设置为0。
我们可以使用一些简单的函数和数学来分散它们。对于这个例子,我们假设我们的舞台是 1,000 像素宽和 1,000 像素高。我们需要为 MovieClip 的 x 和 y 坐标生成一个介于 0 和 1,000 之间的数字。我们可以使用Math类的random函数来生成一个从0到1的十进制数,如下所示:
Math.random();
要使值介于 0 和 1,000 之间,我们只需将其相乘即可:
Math.random() * 1000;
您实际上不需要知道您的舞台有多大,因为大小是在stage 对象的stageHeight 和stageWidth 属性中设置的。因此,为了在生成实例时将我们的 MovieClips 设置在随机位置,我们的最终代码如下所示:
var myMovieClips:Array = new Array();
for (var i:int = 0; i < 100; i++) {
myMovieClips[i] = new Rock();
myMovieClips[i].x = Math.random() * stage.stageWidth;
myMovieClips[i].y = Math.random() * stage.stageHeight;
addChild(myMovieClips[i]);
}
希望这会有所帮助!