我一直在自学AS3并计划制作一个简单的游戏,你可以选择一些石头,然后获得积分。问题在于,根据我的知识(AS3 / Flash),我可以简单地制作更多的石头,然后把它放在舞台上,这使得游戏可预测和无聊,因为他们的位置在一个位置,而且它使我的脚本凌乱,因为我必须命名我创建的那些石头物品。
我做了一些研究,我发现了数组,它实际上使它更有条理,但问题是我真的不明白它是如何工作的,就像你如何将符号链接到它一样,例如:
我画了一个框>将它转换为符号(影片剪辑)>将其命名为stone。 然后我创建一个大圆圈>将其转换为符号(图形)>将其命名为bgSpace。 让我们假设bgSpace的大小是300px(如果太大或太小,可以更低或更高)
现在我想要的是让bgSpace在其空间中随机生成石头然后当点击/拾取石头时它会消失然后你得到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.
}
我的移民让你很困惑,但我想要的是一种将符号链接到阵列的方法,这让我很困惑。我也希望你每次开始游戏时都会改变石头的位置/它是随机的。我读了几篇文章,每次读一篇文章时都会给我一些新的问题,所以我想先问这里然后继续前进,这样我就不会绕过或忘记一些我想学的细节。我可能无法回复,因为我要睡觉了,谢谢你提前和信息。
答案 0 :(得分:4)
变量很像物理世界中的容器。如果我在一个容器中有一个对象,我可以将它取出并放在任何地方或对它做任何事情,几乎不管该容器中有什么对象。我不一定需要知道关于物体的任何信息,甚至不知道它是什么。这也适用于代码,并且是使用数组的一种特别常见的方式。
可以将数组视为具有无限分区的容器。在数组内部,每个隔离区都分配了一个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开始按顺序分配一个数字。以下是我们阵列的直观表示:
--------------------------------------
| 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]
已被使用,则我们的新元素将被分配到myArray[1]
。
数组是强大的,我们可以使用它们来存储任何类型的数据。虽然它通常最好避免,但我们甚至可以混合我们存储在数组中的数据类型。例如,看看这个:
var myArray:Array = new Array('squirrel', 7, true);
此代码完全有效,并以原生格式存储字符串,int和boolean。
我们可以使用与之前所有示例中相同的语法将任何类型的对象存储在数组中,包括Sprites和MovieClip:
myArray.push(myMovieClip);
在我们使用MovieClip加载数组(在你的情况下为rock)并将它们分散到屏幕上之前,我们需要学习如何生成新的数组。
每一个" copy"你制作的MovieClip被称为"实例"。实际上称他们为"副本"并不是描述它们的最佳方式。他们更喜欢"克隆"从某种意义上说,它们都可以被动画化,并且可以完全相互独立地进行交互。
要生成新实例,过程很简单。我们只需告诉Flash我们想要生成哪些MovieClip。当然,我们的MovieClip需要某种名称或ID,因此Flash可以知道我们想要使用哪一个。如果您使用纯粹的面向代码的软件在AS3(如FlashDevelop或Eclipse)中进行开发,您将知道在哪里可以找到MovieClip的名称。但是,如果您使用的是Adobe的Flash Pro,则第一步是不同的。
我很久没有使用Adobe的Flash Pro,但我相信这个过程应该仍然非常相似。假设您已将对象转换为符号,则执行以下步骤:
Window -> Library
菜单中打开“库”面板(如果尚未打开)。Rock
,BigPizza
,{{ 1}}。错误:Jersey11
,rock
,bigPizza
,' Mashed_Potatoes`)从现在开始,我假设您已经设置了" Class"您的MovieClip的名称为" Rock"。
让我们做一个实例:
11Jersey
瞧!这太容易了吧?对。如果您运行脚本,您会注意到屏幕上没有新的MovieClip;我们需要将MovieClip添加到阶段。
Flash电影(或游戏/视频/应用,如果您愿意)中显示的任何内容和所有内容都在舞台上。我们可以把它想象成剧院的真实舞台。即使我们制作了一个新的MovieClip实例,在我们将它放在舞台上之前也无法看到它。以下是我们如何在舞台上放置一块石头:
new Rock();
这样可以正常工作,但它通常不是一种非常优雅或有组织的方式,因为如果我们想做某事,我们就没有简单的方法来引用我们的实例它(就像移动它一样)。
相反,我们应该做的是将我们的实例放入一个变量中:
addChild(new Rock());
现在我们可以通过名称来引用它:
var myRock:Rock = new Rock();
addChild(myRock);
现在我们已经遇到了你在帖子中提到过的问题:如何命名我想要折腾的所有这些岩石?显然,为每一块岩石编写一行代码并不是很有效。如果我想进行岩场模拟并且我需要100块岩石怎么办?对于这种困境,有一种常见且易于使用的解决方案: Arrays !
但那不是整个故事;我们需要学习生成MovieClip的实例而不指定它们,并且通过循环来实现这一点。
我不会详细介绍编写循环。他们的语法起初可能看起来很奇怪,但是一旦你过去,这个概念就很简单了。和他们一起玩,直到你对他们的理解感到满意为止。
他们的语法如下:
// Here we place our instance 50 pixels from the left edge of the stage:
myRock.x = 50;
现在,这可能不是很有意义,所以让我们看看一些真正的代码:
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
增加1,每次检查i
是否更小比i
。由于100
从i
开始,这意味着我们的循环将完全运行100次。
我们可以使用循环来填充任意数量的MovieClip数组,如下所示:
0
请注意,我们使用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]
相同。
恭喜!你可以生成实例!
我们所有的MovieClip都是在完全相同的位置创建的;舞台的左上角。这是因为默认情况下,MovieClip的myMovieClips[5]
和x
属性都设置为y
。
我们可以使用一些简单的函数和数学来分散它们。对于此示例,我们假设我们的舞台宽1,000像素,高1,000像素。我们需要为MovieClip的0
和x
坐标生成0到1,000之间的数字。我们可以使用y
类的random
函数生成一个从0到1的十进制数,如下所示:
Math
要使值介于0和1,000之间,我们只需将其相乘:
Math.random();
您实际上并不需要知道您的舞台有多大,因为大小是在Math.random() * 1000;
对象的stageHeight
和stageWidth
属性中设置的。因此,要在生成实例时将MovieClip设置为随机位置,我们的最终代码将如下所示:
stage
希望这有帮助!