在 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 数组
那么,我们如何将一些东西放入我们的数组中呢?好吧,这是通过三种方式完成的,您不必只使用一种。最合适的方法将取决于您要构建的内容。
通过初始化:
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]
已被使用,我们的新元素元素将分配给 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 的名称。但是,如果您使用的是 Adobe 的 Flash Pro,则第一步会有所不同。
好久没用过Adobe的Flash Pro了,不过相信过程应该还是很相似的。假设您已经将对象转换为符号,步骤如下:
- 从
Window -> Library
菜单打开“库”面板(如果尚未打开)。
- 单击 select 您要为其创建实例的影片剪辑,以便它在“库”面板的列表中突出显示。
- 展开 "Advanced" 部分(如果尚未打开)。
- 启用"Export for Actionscript"。
- 启用 "Export in frame 1"(如果尚未启用)。 (这意味着您的 MovieClip 可以在您的游戏加载后立即与 ActionScript 一起使用,而不是仅在您在时间轴上的某个位置使用它时)
- 在 "Class" 文本框中输入您要为 MovieClip 使用的名称。默认情况下,这将设置为与您的 MovieClip 本身的名称相同,这通常是首选,但您可以在此处进行选择。 (在 AS3 中,选择 class 名称时,通常认为使用大驼峰式、不带符号且从不以数字开头是一种很好的做法。好:
Rock
、BigPizza
、Jersey11
. 错误: rock
, bigPizza
, 11Jersey
, 'Mashed_Potatoes`)
- 按下 "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++) {...
- 我们创建变量
i
,初始值为0
。
- 在每个循环开始时检查条件,如果条件计算结果为
true
,则循环 运行s。
- 最后一部分,"increment expression",运行在每个循环的结尾。
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 都是在完全相同的位置创建的;舞台的左上角。这是因为 MovieClips 的 x
和 y
属性默认都设置为 0
。
我们可以使用一些简单的函数和数学来分散它们。对于此示例,我们假设我们的舞台宽 1,000 像素,高 1,000 像素。我们需要为 MovieClip 的 x
和 y
坐标生成一个介于 0 和 1,000 之间的数字。我们可以使用 Math
class 的 random
函数来生成一个从 0 到 1 的十进制数,如下所示:
Math.random();
要使值介于 0 和 1,000 之间,我们只需将其相乘即可:
Math.random() * 1000;
您实际上不需要知道您的舞台有多大,因为大小是在 stage
对象的 stageHeight
和 stageWidth
属性中设置的。因此,要在生成实例时将我们的 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]);
}
希望对您有所帮助!
我一直在自学 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 数组
那么,我们如何将一些东西放入我们的数组中呢?好吧,这是通过三种方式完成的,您不必只使用一种。最合适的方法将取决于您要构建的内容。
通过初始化:
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]
已被使用,我们的新元素元素将分配给 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 的名称。但是,如果您使用的是 Adobe 的 Flash Pro,则第一步会有所不同。
好久没用过Adobe的Flash Pro了,不过相信过程应该还是很相似的。假设您已经将对象转换为符号,步骤如下:
- 从
Window -> Library
菜单打开“库”面板(如果尚未打开)。 - 单击 select 您要为其创建实例的影片剪辑,以便它在“库”面板的列表中突出显示。
- 展开 "Advanced" 部分(如果尚未打开)。
- 启用"Export for Actionscript"。
- 启用 "Export in frame 1"(如果尚未启用)。 (这意味着您的 MovieClip 可以在您的游戏加载后立即与 ActionScript 一起使用,而不是仅在您在时间轴上的某个位置使用它时)
- 在 "Class" 文本框中输入您要为 MovieClip 使用的名称。默认情况下,这将设置为与您的 MovieClip 本身的名称相同,这通常是首选,但您可以在此处进行选择。 (在 AS3 中,选择 class 名称时,通常认为使用大驼峰式、不带符号且从不以数字开头是一种很好的做法。好:
Rock
、BigPizza
、Jersey11
. 错误:rock
,bigPizza
,11Jersey
, 'Mashed_Potatoes`) - 按下 "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++) {...
- 我们创建变量
i
,初始值为0
。 - 在每个循环开始时检查条件,如果条件计算结果为
true
,则循环 运行s。 - 最后一部分,"increment expression",运行在每个循环的结尾。
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 都是在完全相同的位置创建的;舞台的左上角。这是因为 MovieClips 的 x
和 y
属性默认都设置为 0
。
我们可以使用一些简单的函数和数学来分散它们。对于此示例,我们假设我们的舞台宽 1,000 像素,高 1,000 像素。我们需要为 MovieClip 的 x
和 y
坐标生成一个介于 0 和 1,000 之间的数字。我们可以使用 Math
class 的 random
函数来生成一个从 0 到 1 的十进制数,如下所示:
Math.random();
要使值介于 0 和 1,000 之间,我们只需将其相乘即可:
Math.random() * 1000;
您实际上不需要知道您的舞台有多大,因为大小是在 stage
对象的 stageHeight
和 stageWidth
属性中设置的。因此,要在生成实例时将我们的 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]);
}
希望对您有所帮助!