創(chuàng)建方塊
現(xiàn)在我們將會(huì)讓方塊在屏幕上顯示出來(lái)、定位到合適的地方,然后顯示正確的幀。就像這個(gè):
首先我們先定義一些對(duì)象和值:
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數(shù)組中。 地圖定義的下一行,定義了一個(gè)叫g(shù)ame的對(duì)象。 我們會(huì)把所有用到的其他對(duì)象(方塊、敵人……)都作為game的子對(duì)象,我們也可以不這樣做,直接把所有的對(duì)象都放在主場(chǎng)景_root或者其他任何地方, 但是這樣做(把對(duì)象都放在一個(gè)固定的地方)更加清晰一些。
注意我們給了game對(duì)象2個(gè)屬性:tileW和tileH, 兩個(gè)屬性的值都是30。那表示我們的方塊的寬度(tileW)和高度(tileH)。方塊不一定是個(gè)正方形,你也可以使用長(zhǎng)寬不相等的矩形。 一旦我們想要知道,方塊的寬度和高度,我們可以這樣寫(xiě):
game.tileW game.tileH
而且如果你想要改變方塊的大小,只要在一行代碼中改就行了。
下面的幾行代碼在game對(duì)象里面構(gòu)造了Tile0對(duì)象,然后用prototype構(gòu)造了他的2個(gè)屬性。 game.Tile0= function () {}; game.Tile0.prototype.walkable=true; game.Tile0.prototype.frame=1;
第一行的 game.Tile0=function(){} 聲明了一個(gè)新的對(duì)象類(lèi)型。 當(dāng)我們從地圖的二維數(shù)組中得到0時(shí),我們就會(huì)使用Tile0作為相應(yīng)方塊的類(lèi)型。
下面2行告訴我們Tile0對(duì)象和所有用Tile0創(chuàng)建的對(duì)象都具有的一些屬性。我們會(huì)設(shè)置他們的walkable為true(意味著無(wú)法通行)還有frame為1(復(fù)制方塊mc后,顯示在第一幀)。
顯示地圖
你準(zhǔn)備好做整個(gè)地圖了嗎?我們將要寫(xiě)個(gè)函數(shù)來(lái)布置所有的方塊了,函數(shù)名取做buildMap。如果你要顯示別的地圖,你也可以使用這個(gè)函數(shù)。buildMap將要做的是:
+復(fù)制一個(gè)空mc作為容器(放置各種對(duì)象) +遍歷地圖數(shù)組 +為每個(gè)小格子創(chuàng)建相應(yīng)的方塊對(duì)象 +復(fù)制所有的方塊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作為一個(gè)函數(shù),并且參數(shù)是map。當(dāng)我們調(diào)用這個(gè)函數(shù)的時(shí)候,我們會(huì)同時(shí)傳遞地圖數(shù)組給他。
下面的一行復(fù)制了一個(gè)空mc到舞臺(tái)上: _root.attachMovie("empty", "tiles", ++d);
你需要一個(gè)空mc(里面沒(méi)有任何東西)在庫(kù)中。 在庫(kù)面板中右鍵單擊這個(gè)mc,選擇”Linkage…”(鏈接),選擇”Export this symbol”(導(dǎo)出這個(gè)符號(hào)),在ID欄填上”empty”。 現(xiàn)在,attachMovie命令會(huì)在庫(kù)中查找鏈接名稱是empty的mc, 找到之后他會(huì)在舞臺(tái)上復(fù)制一個(gè)這樣的mc,并給他一個(gè)新的名字tiles。 這個(gè)mc將會(huì)收容舞臺(tái)上所有的方塊,就相當(dāng)于一個(gè)容器。 使用這樣的容器有個(gè)很美妙的事情,就是每當(dāng)我們想要?jiǎng)h除所有的方塊時(shí)(比如游戲結(jié)束), 我們只需要?jiǎng)h除tiles這個(gè)mc就行了,然后所有的方塊都消失了。 如果你不用容器,直接把方塊都復(fù)制到_root(主場(chǎng)景)中, 那么當(dāng)你進(jìn)入下一場(chǎng)景的時(shí)候(比如游戲結(jié)束),這些復(fù)制的方塊不會(huì)消失,你不得不使用更多的actionscript來(lái)刪除他們。
復(fù)制了這個(gè)tiles之后,我們還要把他連接到我們的game對(duì)象中: game.clip = _root.tiles 現(xiàn)在,當(dāng)我們需要訪問(wèn)tiles時(shí),我們只需要使用game.clip,這很便利。 如果我們需要把tiles放到別的地方,我們只需要改一下這行就行了,不需要改動(dòng)整個(gè)代碼。
然后我們創(chuàng)建了兩個(gè)新的變量:mapWidth和mapHeight。 我們通過(guò)這兩個(gè)變量遍歷整個(gè)地圖數(shù)組。 mapWidth的值是地圖數(shù)組的第一個(gè)元素的長(zhǎng)度。 如果你忘了地圖數(shù)組什么樣子,回頭看看。 地圖數(shù)組的第一個(gè)元素是一個(gè)數(shù)組[1,1,1,1,1,1,1,1],mapWidth就是他的長(zhǎng)度值(數(shù)組的長(zhǎng)度就是數(shù)組的元素個(gè)數(shù)),在這里就是8。 現(xiàn)在我們從地圖數(shù)組中知道了地圖的寬度。
同理,mapHeight的值就是地圖數(shù)組的長(zhǎng)度值,他是數(shù)組的行數(shù),也是地圖的行數(shù)。
我們這樣遍歷地圖數(shù)組:
for (var i = 0; i < mapHeight; ++i) { for (var j = 0; j < mapWidth; ++j) {
我們讓變量i從0開(kāi)始,每次自加1,直到他比mapHeight大。 變量j從0循環(huán)到mapWidth。 var name = "t_"+i+"_"+j 變量name的到的值是和i、j的值有關(guān)的。 假設(shè)i=0,j=1,那么name=”t_0_1”; 如果i=34,j=78,那么name=”t_34_78”。
現(xiàn)在我們創(chuàng)建新的方塊game[name]= new game["Tile"+map[i][j]]
左邊的game[name]表示新的方塊對(duì)象將會(huì)放置在game對(duì)象里面,就像其他對(duì)象一樣。 map[i][j]的值告訴我們這個(gè)點(diǎn)(i,j)的方塊類(lèi)型, 如果是0,就創(chuàng)建一個(gè)Tile0對(duì)象;如果是1,就創(chuàng)建一個(gè)Tile1對(duì)象。 這個(gè)點(diǎn)的方塊具有的屬性在相應(yīng)的Tile對(duì)象中都事先定義好了。 當(dāng)i=0,j=0時(shí),相當(dāng)于這樣的形式: game[“t_0_0”]=new game[“Tile0“]
記。核械姆綁K都作為game對(duì)象的子對(duì)象。
在下一行中,我們復(fù)制了一個(gè)新的mc到舞臺(tái)上,并使用game.clip[name]來(lái)訪問(wèn)他。 mc的坐標(biāo)可以通過(guò)i,j值乘以方塊寬度和方塊高度得到。 我們通過(guò)gotoAndStop命令讓他跳到正確的幀,借助他繼承得到的frame屬性。
當(dāng)我們需要?jiǎng)?chuàng)建地圖時(shí),我們這樣調(diào)用buildMap函數(shù)就行了: buildMap(myMap);
下載源文件
出處:藍(lán)色理想
責(zé)任編輯:qhwa
上一頁(yè) 關(guān)于地圖的東西 下一頁(yè) 再談?wù)剠^(qū)塊原型的定義
◎進(jìn)入論壇Flash專欄 版塊參加討論