创建方块
现在我们将会让方块在屏幕上显示出来、定位到合适的地方,然后显示正确的帧。就像这个:
首先我们先定义一些对象和值:
myMap = [ [1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1] ]; game={tileW:30, tileH:30}; //可通行的方块 game.Tile0= function () {}; game.Tile0.prototype.walkable=true; game.Tile0.prototype.frame=1; //墙 game.Tile1= function () {}; game.Tile1.prototype.walkable=false; game.Tile1.prototype.frame=2;
你可以看到,我们把地图保存在myMap数组中。 地图定义的下一行,定义了一个叫game的对象。 我们会把所有用到的其他对象(方块、敌人……)都作为game的子对象,我们也可以不这样做,直接把所有的对象都放在主场景_root或者其他任何地方, 但是这样做(把对象都放在一个固定的地方)更加清晰一些。
注意我们给了game对象2个属性:tileW和tileH, 两个属性的值都是30。那表示我们的方块的宽度(tileW)和高度(tileH)。方块不一定是个正方形,你也可以使用长宽不相等的矩形。 一旦我们想要知道,方块的宽度和高度,我们可以这样写:
game.tileW game.tileH
而且如果你想要改变方块的大小,只要在一行代码中改就行了。
下面的几行代码在game对象里面构造了Tile0对象,然后用prototype构造了他的2个属性。 game.Tile0= function () {}; game.Tile0.prototype.walkable=true; game.Tile0.prototype.frame=1;
第一行的 game.Tile0=function(){} 声明了一个新的对象类型。 当我们从地图的二维数组中得到0时,我们就会使用Tile0作为相应方块的类型。
下面2行告诉我们Tile0对象和所有用Tile0创建的对象都具有的一些属性。我们会设置他们的walkable为true(意味着无法通行)还有frame为1(复制方块mc后,显示在第一帧)。
显示地图
你准备好做整个地图了吗?我们将要写个函数来布置所有的方块了,函数名取做buildMap。如果你要显示别的地图,你也可以使用这个函数。buildMap将要做的是:
+复制一个空mc作为容器(放置各种对象) +遍历地图数组 +为每个小格子创建相应的方块对象 +复制所有的方块mc +定位所有的方块mc +让所有的方块mc显示在正确的帧
这是代码:
function buildMap (map) { _root.attachMovie("empty", "tiles", ++d); game.clip=_root.tiles; var mapWidth = map[0].length; var mapHeight = map.length; for (var i = 0; i < mapHeight; ++i) { for (var j = 0; j < mapWidth; ++j) { var name = "t_"+i+"_"+j; game[name]= new game["Tile"+map[i][j]]; game.clip.attachMovie("tile", name, i*100+j*2); game.clip[name]._x = (j*game.tileW); game.clip[name]._y = (i*game.tileH); game.clip[name].gotoAndStop(game[name].frame); } } }
第一行声明了buildMap作为一个函数,并且参数是map。当我们调用这个函数的时候,我们会同时传递地图数组给他。
下面的一行复制了一个空mc到舞台上: _root.attachMovie("empty", "tiles", ++d);
你需要一个空mc(里面没有任何东西)在库中。 在库面板中右键单击这个mc,选择”Linkage…”(链接),选择”Export this symbol”(导出这个符号),在ID栏填上”empty”。 现在,attachMovie命令会在库中查找链接名称是empty的mc, 找到之后他会在舞台上复制一个这样的mc,并给他一个新的名字tiles。 这个mc将会收容舞台上所有的方块,就相当于一个容器。 使用这样的容器有个很美妙的事情,就是每当我们想要删除所有的方块时(比如游戏结束), 我们只需要删除tiles这个mc就行了,然后所有的方块都消失了。 如果你不用容器,直接把方块都复制到_root(主场景)中, 那么当你进入下一场景的时候(比如游戏结束),这些复制的方块不会消失,你不得不使用更多的actionscript来删除他们。
复制了这个tiles之后,我们还要把他连接到我们的game对象中: game.clip = _root.tiles 现在,当我们需要访问tiles时,我们只需要使用game.clip,这很便利。 如果我们需要把tiles放到别的地方,我们只需要改一下这行就行了,不需要改动整个代码。
然后我们创建了两个新的变量:mapWidth和mapHeight。 我们通过这两个变量遍历整个地图数组。 mapWidth的值是地图数组的第一个元素的长度。 如果你忘了地图数组什么样子,回头看看。 地图数组的第一个元素是一个数组[1,1,1,1,1,1,1,1],mapWidth就是他的长度值(数组的长度就是数组的元素个数),在这里就是8。 现在我们从地图数组中知道了地图的宽度。
同理,mapHeight的值就是地图数组的长度值,他是数组的行数,也是地图的行数。
我们这样遍历地图数组:
for (var i = 0; i < mapHeight; ++i) { for (var j = 0; j < mapWidth; ++j) {
我们让变量i从0开始,每次自加1,直到他比mapHeight大。 变量j从0循环到mapWidth。 var name = "t_"+i+"_"+j 变量name的到的值是和i、j的值有关的。 假设i=0,j=1,那么name=”t_0_1”; 如果i=34,j=78,那么name=”t_34_78”。
现在我们创建新的方块game[name]= new game["Tile"+map[i][j]]
左边的game[name]表示新的方块对象将会放置在game对象里面,就像其他对象一样。 map[i][j]的值告诉我们这个点(i,j)的方块类型, 如果是0,就创建一个Tile0对象;如果是1,就创建一个Tile1对象。 这个点的方块具有的属性在相应的Tile对象中都事先定义好了。 当i=0,j=0时,相当于这样的形式: game[“t_0_0”]=new game[“Tile0“]
记住:所有的方块都作为game对象的子对象。
在下一行中,我们复制了一个新的mc到舞台上,并使用game.clip[name]来访问他。 mc的坐标可以通过i,j值乘以方块宽度和方块高度得到。 我们通过gotoAndStop命令让他跳到正确的帧,借助他继承得到的frame属性。
当我们需要创建地图时,我们这样调用buildMap函数就行了: buildMap(myMap);
下载源文件
出处:蓝色理想
责任编辑:qhwa
上一页 关于地图的东西 下一页 再谈谈区块原型的定义
◎进入论坛Flash专栏 版块参加讨论