【问题标题】:Spawning Objects in AS3? (dont have actual codes)在 AS3 中生成对象? (没有实际代码)
【发布时间】:2017-05-10 07:31:27
【问题描述】:

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

我做了一些研究,发现了数组,它实际上使它更有条理,但问题是我真的不明白它是如何工作的,例如如何将符号链接到它:

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

现在我想要的是让 bgSpace 在其空间中随机生成石头,然后当点击/拾取石头时它会消失,然后你得到 1 分,但我不知道如何编码。

因此,如果我要根据我的知识制作此内容,我将离开 bgSpace,然后在该区域放置许多石头,然后将它们命名为石头 1、石头 2 等等。并像这样编码:

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.
}

我很困惑你们,但我想要的是一种将符号链接到数组的方法,这真的让我很困惑。我还希望每次开始游戏时,石头的位置都会改变/它是随机的。我读了几篇文章,每次我读一篇文章时都会提出新的问题,所以我想先在这里提问,然后继续前进,这样我就不会绕过或忘记一些我想学习的细节。由于我要去睡觉,我可能无法回复,提前致谢和信息。

【问题讨论】:

标签: actionscript-3 flash


【解决方案1】:

数组简介

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

可以将数组视为具有无限隔间的容器。在数组中,每个隔间都分配有一个 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

数组中的精灵/电影剪辑

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

  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]已经被使用,我们的新元素将被分配给@ 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 的名称。但是,如果您使用的是 Adob​​e 的 Flash Pro,第一步就不同了。

我已经很久没有使用 Adob​​e 的 Flash Pro 了,但是我相信这个过程应该还是非常相似的。假设您已经将对象转换为符号,这些是步骤:

  1. 如果库面板尚未打开,请从 Window -> Library 菜单打开。
  2. 单击以选择您要创建实例的影片剪辑,以便它在“库”面板的列表中突出显示。
  3. 如果“高级”部分尚未打开,请展开它。
  4. 启用“为 Actionscript 导出”。
  5. 如果尚未启用“在帧 1 中导出”,请启用它。 (这意味着您的 MovieClip 可以在您的游戏加载后立即与 ActionScript 一起使用,而不是仅在您在时间轴的某处使用时才使用)
  6. 在“类”文本框中输入您希望用于影片剪辑的名称。默认情况下,这将设置为与通常首选的 MovieClip 本身的名称相同,但您可以在此处进行选择。 (在AS3时,在选择类名时,通常被认为使用上骆驼盒的良好做法,没有符号,而且从不从数字开始。好:RockBigPizzaJersey11。Bad:rockbigPizza, 11Jersey, 'Mashed_Potatoes`)
  7. 按“确定”并发出一点欢呼声,因为您现在已准备好开始在 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++) {...
  1. 我们创建变量i,初始值为0
  2. 在每个循环开始时都会检查条件,如果条件计算结果为 true,则循环运行。
  3. 最后一部分“增量表达式”在每个循环结束时运行。 i++i = i + 1 的一种更短的写法。

因此,换句话说,我们的循环首先将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 的xy 属性都设置为0

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

Math.random();

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

Math.random() * 1000;

您实际上不需要知道您的舞台有多大,因为大小是在stage 对象的stageHeightstageWidth 属性中设置的。因此,为了在生成实例时将我们的 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]);
}

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2015-06-16
    • 2023-01-06
    相关资源
    最近更新 更多