在 AS3 中生成对象? (没有实际代码)

Spawning Objects in AS3? (dont have actual codes)

我一直在自学 AS3,并计划制作一个简单的游戏,您可以在其中挑选一些石头然后获得分数。问题是,据我所知(AS3/Flash),我可以简单地制作更多石头,然后将其放在舞台上,这使游戏变得可预测且无聊,因为它们的位置在一个位置,而且这使我的脚本变得混乱因为我必须命名我创建的那些石头对象。

我做了一些研究,我发现了数组,它实际上使它更有条理,但问题是我真的不明白它是如何工作的,就像你如何 link 它的符号一样示例:

我画了一个盒子>将它转换成符号(影片剪辑)>命名为石头。 然后我创建一个大圆圈>将其转换为符号(图形)>将其命名为bgSpace。 假设 bgSpace 的大小为 300px(如果太大或太小,可以更低或更高)

现在我想要的是让 bgSpace 在其 space 中随机生成石头,然后当石头 clicked/picked 时它会消失,然后你得到 1 点,但我不知道如何代码吧。

因此,如果我会利用我的知识完成此操作,我将离开 bgSpace,然后在该区域放置许多石头,然后将它们命名为 stone1、stone2 等。并像这样编码:

var pick = 0;
var total = 0;

this.stone1.addEventListener(MouseEvent.CLICK, stoneGet);
this.stone2.addEventListener(MouseEvent.CLICK, stoneGet);
this.stone3.addEventListener(MouseEvent.CLICK, stoneGet);
this.stone4.addEventListener(MouseEvent.CLICK, stoneGet);

function stoneGet(event:MouseEvent):void
{
pick = pick + 1;
total = total + 1;
if (pick == 4)
{
gotoAndStop(2);//Indicated you move to next level
}
}//no need to check this and correct if i made an error this is just a sample on my logic

看了一些文章,最常见的就是这种代码

var thing:Array = new Array[4];//what i understand var = variable, thing = name of array or name of symbol?, :Array indication its an array?, = new Array[4] = making an array with 4 slot?

function makeThing() {//function

addChild(thing);//add the symbol?
thing.addEventListener(MouseEvent.CLICK, removeThing);
}

function removeThing(event:MouseEvent):void {
    event.target.pick();
    removeChild(event.target);// does this remove the symbol? and where do you type the code where you add 1 point per pick.
}

我可能会让你们感到困惑,但我想要的是一种将 link 符号转化为数组的方法,这真的让我很困惑。此外,我希望每次开始游戏时,石头的放置都是 changed/it 随机的。我读了几篇文章,每次读一篇都会给我提出新的问题,所以我想先在这里问,然后继续,这样我就不会绕过或忘记一些我想学习的细节。由于我要睡觉了,我可能无法回复,在此先感谢您提供信息。

数组简介

变量很像物理世界中的容器。如果我在容器中有一个对象,我可以将它取出并放置在任何地方或用它做任何事情,几乎不管那个容器中可能有什么对象。我不一定需要了解有关该对象的任何信息,甚至对它是什么有一个大概的了解。这也适用于代码,并且是处理数组的一种特别常见的方式。

数组可以被认为是一个有无限隔间的容器。在数组中,每个隔间都分配有一个 ID - 通常称为 "index" 或 "key"(记住这一点!) - 我们可以使用它来标识我们想要访问的隔间。

这是在 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

数组中的每个项目或条目通常称为 "element"。我们也可以单独访问这些元素。例如,在上一个示例的基础上构建:

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

Sprites/Movieclips 数组

那么,我们如何将一些东西放入我们的数组中呢?好吧,这是通过三种方式完成的,您不必只使用一种。最合适的方法将取决于您要构建的内容。

  1. 通过初始化:

    var myArray:Array = new Array('moose', 'newspaper', 'smoothie');

  2. 通过显式赋值:

    var myArray:Array = new Array(); myArray[5] = 'potato';

  3. 通过push函数:

    var myArray:Array = new Array(); myArray.push('This is my data. Guard it with your life.');

当使用 push 函数时,您的新元素将被分配给数组中编号最大的索引,再加上 1。例如,如果 myArray[0] 已被使用,我们的新元素元素将分配给 myArray[1].

数组很强大,我们可以用它们来存储任何类型的数据。虽然通常最好避免,但我们甚至可以混合存储在数组中的数据类型。例如,看看这个:

var myArray:Array = new Array('squirrel', 7, true);

此代码完全有效,将以其本机格式存储字符串、整数和布尔值。

我们可以在数组中存储 任何 种对象,包括 Sprites 和 MovieClips,使用与前面所有示例相同的语法:

myArray.push(myMovieClip);

即时制作新影片剪辑

在我们用 MovieClips(在你的情况下是岩石)加载我们的数组并将它们散布在屏幕上之前,我们需要学习如何生成新的。

您制作的每个 "copy" 影片剪辑都称为 "instance"。实际上称它们为 "copy" 并不是描述它们的最佳方式。从某种意义上说,它们更像是 "clones",它们都可以是动画的,并且可以完全独立于彼此进行交互。

生成新实例的过程很简单。我们只需要告诉 Flash 我们要生成什么 MovieClip。自然地,我们需要为 MovieClip 提供某种名称或 ID,以便 Flash 可以知道我们要使用哪一个。如果您使用纯粹的面向代码的软件在 AS3 中进行开发,例如 FlashDevelop 或 Eclipse,您将已经知道在哪里可以找到您的 MovieClip 的名称。但是,如果您使用的是 Adob​​e 的 Flash Pro,则第一步会有所不同。

好久没用过Adobe的Flash Pro了,不过相信过程应该还是很相似的。假设您已经将对象转换为符号,步骤如下:

  1. Window -> Library 菜单打开“库”面板(如果尚未打开)。
  2. 单击 select 您要为其创建实例的影片剪辑,以便它在“库”面板的列表中突出显示。
  3. 展开 "Advanced" 部分(如果尚未打开)。
  4. 启用"Export for Actionscript"。
  5. 启用 "Export in frame 1"(如果尚未启用)。 (这意味着您的 MovieClip 可以在您的游戏加载后立即与 ActionScript 一起使用,而不是仅在您在时间轴上的某个位置使用它时)
  6. 在 "Class" 文本框中输入您要为 MovieClip 使用的名称。默认情况下,这将设置为与您的 MovieClip 本身的名称相同,这通常是首选,但您可以在此处进行选择。 (在 AS3 中,选择 class 名称时,通常认为使用大驼峰式、不带符号且从不以数字开头是一种很好的做法。好:RockBigPizzaJersey11. 错误: rock, bigPizza, 11Jersey, 'Mashed_Potatoes`)
  7. 按下 "OK" 并小声欢呼,因为您现在已准备好开始在 ActionScript 中生成 MovieClip 的实例。

生成实例

从现在开始,我假设您已将 MovieClip 的 "Class" 名称设置为 "Rock"。

举个例子:

new Rock();

瞧!那也太容易了吧?正确的。如果您 运行 您的脚本,您会注意到屏幕上没有新的 MovieClip;我们需要将 MovieClip 添加到 stage.

您的 Flash 电影(或 game/video/app,如果您愿意)中显示的所有内容都在 舞台 上。我们可以把它想象成剧院里的真实舞台。即使我们创建了 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;

现在我们遇到了您在 post 中提到的问题:如何命名所有这些我想扔掉的石头?显然,为每一块石头写一行代码并不是很高效。如果我想制作一个岩石农场模拟并且需要 100 块石头怎么办?对于这种困境,有一个常见且易于使用的解决方案:Arrays!

但这还不是全部;我们需要学习在不命名的情况下生成 MovieClips 实例,方法是通过 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++) {...
  1. 我们创建变量i,初始值为0
  2. 在每个循环开始时检查条件,如果条件计算结果为 true,则循环 运行s。
  3. 最后一部分,"increment expression",运行在每个循环的结尾。 i++i = i + 1.
  4. 的简写形式

所以,换句话说,我们的循环开始时将 i 设置为 0,然后在每次循环后将 i 增加 1,并且每次检查 i小于 100。由于 i0 开始,这意味着我们的循环将 运行 恰好 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 都是在完全相同的位置创建的;舞台的左上角。这是因为 MovieClips 的 xy 属性默认都设置为 0

我们可以使用一些简单的函数和数学来分散它们。对于此示例,我们假设我们的舞台宽 1,000 像素,高 1,000 像素。我们需要为 MovieClip 的 xy 坐标生成一个介于 0 和 1,000 之间的数字。我们可以使用 Math class 的 random 函数来生成一个从 0 到 1 的十进制数,如下所示:

Math.random();

要使值介于 0 和 1,000 之间,我们只需将其相乘即可:

Math.random() * 1000;

您实际上不需要知道您的舞台有多大,因为大小是在 stage 对象的 stageHeightstageWidth 属性中设置的。因此,要在生成实例时将我们的 MovieClip 设置在随机位置,我们的最终代码将如下所示:

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]);
}

希望对您有所帮助!