数组在flash中有很广泛的应用,通常我们可以用它来定义地图、棋盘等,用来判断位置等很方便。数组的应用在各类游戏中运用也很多,其实也都大同小异,主要是数值映射,理解并掌握了这个,大家一定能做出许多优秀的flash作品和游戏来。
本文我们通过一个骷髅在数组设定的迷宫中行走的例子简单介绍一下数组的应用实例,文章末尾提供fla源文件下载。
左边是该实例的层次图。
整个场景中只 有map和player两个mc,几乎所有的as控制都捆绑在map上。
用方向键控制骷髅在迷宫中行走。(文件稍大,请耐心等候)
在这个实例中,我们通过数组的应用,实现了角色在行走过程中与障碍物碰撞的判定。有些朋友可能会认为还是用hittest来判断碰撞比较方便,但是用数组来判定碰撞更有利于障碍物的设定。这是个一劳永逸的方法,只要灵活运用就可以把它做成动作游戏或是rpg游戏。
一、场景和元素的准备
1、迷宫地图 map
设场景大小为425×325。新建一个movieclip(下称mc),用ctrl+r导入预先做好的800*600的迷宫地图。
返回场景,按ctrl+l快捷键打开库,把这个mc拖到场景中,设置它的比例为250,并命名为map,这就是我们的迷宫mc。这样做的目的是为了在场景中只能看见迷宫的局部。
2、行走的骷髅 player
将事先准备好的骷髅各个方向以及行走的静态图片导入库中备用。
现在我们来做8个方向行走的mc。新建一个mc,在各帧加入库中合适的图片做成骷髅向右下行走的mc动画act(n),一共5帧。再按同样的方法做好上、下、右、右上4个方向行走的mc,其他的3个方向(左、左上、左下)可以由此翻转而成,方法是:修改→变形→……。
再新建一个mc,依次在前8帧中分别导入角色各方向站立时的静态图片,顺序为左下、右上、右下、左上、下、上、左、右;然后在9~16帧中依次导入8个方向行走的mc(有三个是通过翻转得到)。最后在这个mc的第一帧的as写上stop();把这个mc拖到场景中,命名为player,这就是迷宫中行走的那个骷髅。
二、actionscript控制
本实例的as控制代码都是写在场景中的map上的。
先来讲讲数组的创建方式:
1、new array(); 建立一个空数组
2、new array(length); 建立一个以length为长度(数组元素的个数)的数组
3、new array(element0,element1,......elementn); 建立一个数组,element0,element1,......elementn为数组元素的值。
这儿我们用到第一种和第三种结合的方法来建立2维数组。
现在我们要建立一个60*80的2维数组blk,用来表示60行80列的迷宫。我们用循环初始化2维数组,赋值数组blk[1]~blk[60]的数组元素blk[1][1],blk[1][2]……blk[60][80]的值等于0,用来表示player可以行走。这儿用到了上文提到的第三种方法,可以这样理解,blk[1]~blk[60]是60个1维数组,而它们又是数组blk[][]里面的60个数组元素,这就形成了一个2维数组blk[][]。接着初始化障碍,如blk[9][23] = 1;即player不能通过数组blk的第9行12列元素映射在map上的矩形,依次设定障碍。(我是做了个简单的地图编辑器来设定障碍,然后把障碍的数据,如"blk[9][23] = 1;"用trace输出,然后复制出来的,有兴趣的朋友可以试试。)
我们用_root.map.y和_root.map.x来表示player在数组中的位置,如_root.map.y=3,_root.map.x=4,那么就表示player在数组中3行4列的位置,因为这个actionscript写在map上面,所以我写成了this.y和this.x。请不要与this._y和this._x搞混。
迷宫地图的大小是2000*1500,数组的每个元素在映射到map上,每个元素相当于25*25的矩形。player行走的速度speed初始化为5,而数组的元素映射在map上的矩形的中心点与中心点之间距离是25,说明player需要走5步才能到达下一个矩形中心,这时就需要一个步长变量来控制player的位置在数组中的变化。stepy和stepx分别表示纵步长和横步长,初始化stepy=5;stepx=5。
1、迷宫底图的初始化
onclipevent (load) { //当map载入时
this.speed = 5; //初始化速度speed为5
this.x = 1; //初始化player在数组中的列x,第1列
this.y = 60; //初始化player在数组中的行y,第60行,即定义骷髅最开始的位置在左下角
this.stepx = 5; //初始化横的步长stepx
this.stepy = 5; //初始化纵的步长stepy
blk = new array(); //建立数组blk
for (var i = 1; i<=60; i++) {
blk[i] = new array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
//初始化数组,把数组的元素赋值为0,即设定地图上所有的地方都为可以行走。这里这样写诗为了演示数组的用法和提高运行效率,大家也可以用双重for循环定义blk[i][j]=0;
blk[9][23] = 1;
blk[9][24] = 1;
......
blk[60][36] = 1;
//初始化障碍
}
2、键盘控制行走
这部分我以向左走为例用注释来讲,容易看明白些。
onclipevent (enterframe) {
if (key.isdown(37)) { //如果left键按下
if (!(key.isdown(39) && key.getcode() == 39)) {
//如果right键没按下并且最后按下的不是right键,这种情况看上去似乎不存在,实际确是存在的,如先按住right键不放,然后按下left键,这时你希望是向左走,而不是向右走,所以必须判断最后按下的键是否是为right键,这样做有利于控制的流畅性,但在后面的按up键和down键中没加类似这句的语法,是因为同时按下up键和down键的情况一般不存在。
if (_root.player._x-this.speed>=-38 && (!(blk[y][x-1] == 1 && this.stepx == 5)) && (!((blk[y-1][x-1] == 1 && this.stepy<5 && this.stepx == 5) (blk[y+1][x-1] == 1 && this.stepy>5 && this.stepx == 5)))) {
//如果player的x坐标减去速度speed大于等于player的最小x坐标即-38,并且在数组中y行x-1列元素的值不等于1(当前player在数组中的位置是y列x行,这是为了判断player在数组中左边的元素映射到map上的矩形是否为障碍),而且此时stepx的值为5,(这是为了防止边碰撞的时候stepx不为5时player离障碍还有一段距离的情况下就不能前进了好像有一堵空气墙一样。)并且满足以下两个条件之一或者都满足:1、在数组中y-1行x-1列的元素不等于1并且stepy小于5,stepx等于5。2、在数组中y+1行x-1列的元素不等于1并且stepy小于5,stepx等于5。这两个条件是为了防止player从右走向左时向左上或左下等斜方向走时走入角一类的障碍物中去,正确的应该是下图这样的。
if (this._x+this.speed>1000 _root.player._x>162) {
//如果map的x坐标加上速度speed大于map的最小x坐标即1000或player的x坐标大于162(当map的x坐标等于1000的时候,map已经不能再往右移动了,这时就需要移动player的x坐标了。player在这个flash中的x中间坐标是162,当大于162的时候,就也需要移动player的x坐标了,所以这儿用(或),只要两个条件的其中一个条件满足就可以了)
_root.player._x -= this.speed;
//赋值player的x坐标等于当前player的x坐标减去速度speed,即player向左移
} else {
this._x += this.speed;
//赋值map的x坐标等于当前map的x坐标加上速度speed,即map向右移
}
this.stepx--; //横步长stepx自减1;
if (this.stepx == 0) {
this.x--;
this.stepx = 5;
}
//如果横步长等于0,即player已经向左移动了25(1格)的距离,那么player在数组中的位置y行x列变成y行x-1列,并重新赋值横步长stepx为5。
}
if (key.isdown(38)) { //如果同时按下up键
_root.player.gotoandstop(12);
//player跳转并停止在它的第12帧上,即player开始播放向左上走的动画
_root.dir = 4;
//设player方向的变量dir为4,对应player前8帧的某个静止状态,这在后面的松开按键后人物停止行走中会用到
} else if (key.isdown(40)) {
_root.player.gotoandstop(9);
_root.dir = 1;
} else {
//不满足条件,即只按下了left键
_root.player.gotoandstop(15);
_root.dir = 7;
}
}
}
其它方向也可以如法炮制。
3、控制行走的停止状态
onclipevent (keyup) {
_root.player.gotoandstop(_root.dir);
}
当松开按键的时候,跳转并停止在player第dir帧上(也就是前8帧的某个静止图片),于是人物就停在了最后行走的方向上。
最后谈谈如何使它成为一个行走模块,主要是应用变量,把map的移动范围和player的移动范围设成变量,那么以后如果更换map或player的话,只要调节这几个变量就可以了。
数组在flash游戏中有很广泛的应用,如方块类游戏、考记忆类游戏、棋类游戏中常常会使用到。拿俄罗斯方块来说,可以把各种方块的形状定义成不同的数组,背景定义成一个数组,赋值数组中各元素的值为0,并且每个数组元素映射到背景上的一个对应矩形mc,当方块产生落下时,把那个方块的数组映射在背景数组中的数组元素赋值为1,然后把它对应到的背景上的矩形mc显示成方块,这样几个方块就组成了正方形或者条形的方块。依次深化就可以做出俄罗斯方块来,在这儿我也不细谈了,留给各位读者去慢慢琢磨。fla源文件下载学习
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器