(这里显示的数组并不是全部的,下面还有没有显示出来)
当检测碰撞时,你能够可以让某部分的帧作为墙(或者可拾取的东西,或者门)。例如,你可以让所有的帧数在0到100的方块都作为可通行的方块,所有的从101到200的是墙,大于200的是特殊的方块。
当你只有很少的方块类型,而且方块不会变化很多时,这是一个很好的很简单的方式。
OutsideOfSociety的文章: http://oos.moxiecode.com/tut_01/index.html
沙漠中的树
一些地图具有许多不同的方块,一些只有很少的几种。例如,想象在沙漠中,方圆几百公里都是沙子,如果你很幸运,你可以看到一片绿洲。或者在海上,除了水还是水,然后出现一个海岛。
如果你的地图大部分是相同的方块(沙子),而且只有少量的变化(树),那么二维数组并不是很好的选择。他会产生许多“死信息”,许多行的0,直到一些其他的frame数字出现。在这种情况下,你可以单独声明非沙子的方块,然后让剩下的方块都是沙子。
让我们假设你有一个100×100的地图,有3个树。你可以这样写:
当创建地图的时候,你遍历这个trees数组,放置trees方块,让其他的方块显示沙子。那样比写100×100的二维数组要简单多了。 当然,当你有更多的对象(树、灌木、草、石头、水……),这个方法的速度不是很快,而且你也很难记住什么地方放了什么方块。
S,M,XXXL
如果你有Flash MX或更新版本,估计你已经听到过XML。他的格式和HTML很像,他允许声明许多东西。你也可以用XML来保存你的地图数据。 下面的XML地图基于Jobe Makar的《Macromedia Flash MX Game Design Demystified》。看看这个XML的地图:
<map> <row> <cell type="1"> <cell type="1"> <cell type="1"> </row> <row> <cell type="1"> <cell type="4"> <cell type="1"> </row> <row> <cell type="1"> <cell type="1"> <cell type="1"> </row> </map>
这里我们设定了3×3的地图。首先是头部”map”,然后设置了3个”row” 结点。每个row结点有3个cell结点。
如果从外部文件中载入地图,XML可能是很好的方案,因为大部分的XML解析可以有Flash MX内建的函数完成。从外部文本文件中载入二维数组可没有那么简单,你经常要靠loadVariables得到字符串,然后又不得不把字符串分割成数组,这个过程是很慢的。
XML也有缺点:他会导致更大的文件大小(不过对于现在的网络,这种大小可以忽略),而且你需要Flash Player 6以上。 下面的所有例子都使用二维数组来存储地图数据,而且使用对象的方法来创建方块,就像在“地图的格式”中介绍的那样。
创建方块
现在我们将会让方块在屏幕上显示出来、定位到合适的地方,然后显示正确的帧。就像这个:
首先我们先定义一些对象和值:
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
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>