(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);
下载源文件
再谈谈区块原型的定义
既然我们把区块作为对象处理,我们可以利用对象的许多优点。对象有个美丽的特性是他们可以继承属性。如果你认真阅读了上一章,你会记得我们这样写区块的原型:
game.Tile0= function () {}; game.Tile0.prototype.walkable=true; game.Tile0.prototype.frame=1;
这些让我们写一次原型就可以在其他地方应用,创建新的方块时候就使用这个模板。我们还可以深入研究一下逻辑,再减少一些工作量。
让我们声明一个通用的区块类:
game.TileClass = function () {}; game.TileClass.prototype.walkable=false; game.TileClass.prototype.frame=20;
这里我们用了一个假设。假设每个区块都是不可通行的,而且都显示在第20帧。当然了,实际的区块不全是不可通行的,否则我们不能移动。而且他们也不会都显示在第20帧。问题看起来很严重,实际上不然。我们只是定义了这两个通用属性而已,我们会让他完美工作的。
现在我们创建新的区块类型:
game.Tile0 = function () {}; game.Tile0.prototype.__proto__ = game.TileClass.prototype; game.Tile0.prototype.walkable=true; game.Tile0.prototype.frame=1; game.Tile1 = function () {}; game.Tile1.prototype.__proto__ = game.TileClass.prototype; game.Tile1.prototype.frame=2; game.Tile2 = function () {}; game.Tile2.prototype.__proto__ = game.TileClass.prototype;
通过使用聪明的__proto__,我们不需要重复写同样的属性了。我们的区块从TileClass类中获得了所有必要的材料。当我们这样创建新的区块类型后:
game.Tile2 = function () {}; game.Tile2.prototype.__proto__ = game.TileClass.prototype;
所有后来创建的Tile2区块都继承了属性walkable=false、frame=20。这是不是很美妙呢?但是还没有结束,我们可以改变这两个属性。看:
game.Tile0 = function () {}; game.Tile0.prototype.__proto__ = game.TileClass.prototype; game.Tile0.prototype.walkable=true; game.Tile0.prototype.frame=1;
我们在继承了TileClass类的属性之后,又改写了walkable、frame的值。最后的结果是Tile0区块的walkable为true,frame为1。
所有这些可能太复杂了些,毕竟我们只有少量的区块类型和属性。但是你如果要做一个复杂的区块游戏,每个区块都有很多属性,那么单单定义这些重复的属性就已经够繁的了
英雄
每个游戏都有英雄。英雄要打败坏蛋、拯救公主,还要拯救全世界。我们也要加一个英雄,不过他暂时还不会拯救世界,他什么也干不会,但是他已经来了:
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>