芝麻開門-地圖切換
你能在一個(gè)房子里面呆多久?一張圖片能看多久?是的,我們需要提供更多的空間給英雄。那意味著要改變地圖、創(chuàng)建新的房間、把英雄放置到合適的位置。
為了創(chuàng)建兩個(gè)房間,我們聲明了兩個(gè)地圖數(shù)組: myMap1 = [ [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, 2], [1, 1, 1, 1, 1, 1, 1, 1] ];
myMap2 = [ [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], [2, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1] ];
在game對象中設(shè)置當(dāng)前的地圖序號: game={tileW:30, tileH:30, currentMap:1}
然后,我們開始掃描地圖myMap1,通過buildMap函數(shù)把它實(shí)現(xiàn)到屏幕上。我們可以把myMap1作為一個(gè)參數(shù)傳遞給buildMap函數(shù),這樣buildMap函數(shù)就具備更好的通用性。
buildMap(_root[“myMap”+game.currentMap]);
接下來,我們還需要一個(gè)描繪”門”的對象:
game.Doors = function (newmap, newcharx, newchary) { this.newmap = newmap; this.newcharx = newcharx; this.newchary = newchary; };
game.Doors.prototype.walkable = true; game.Doors.prototype.frame = 3; game.Doors.prototype.door = true; game.Tile2 = function () { }; game.Tile2.prototype = new game.Doors(2, 1, 4); game.Tile3 = function () { }; game.Tile3.prototype = new game.Doors(1, 6, 4);
你可能已經(jīng)猜到了,Doors對象是可以通行的,它是mc的第3幀,它還有一個(gè)屬性door,而且值是true.我們后面將會(huì)利用這個(gè)屬性來判斷英雄是不是走到了門口.
這里用到一個(gè)東西,叫做”繼承”,聽起來有些恐怖?呵呵,其實(shí)很簡單也很有用.所有的門對象創(chuàng)建的時(shí)候都用了Doors模板,Doors對象擁有的所有的所有屬性都傳遞給了他們.比如他們都是可通行的,而且都是第3幀.
我們創(chuàng)建一個(gè)門的時(shí)候,必須指定幾個(gè)必要的信息: 它是通往哪個(gè)房間(map)的,還有,英雄的新坐標(biāo)是多少?
你可能要問,為什么要給英雄指定新坐標(biāo)呢?因?yàn)閯?chuàng)建新的房間以后,如果英雄還在原來的坐標(biāo),就有可能看起來不正確.還有,要避免英雄的新坐標(biāo)所在的方塊是不可通行的障礙物,或者是另外一個(gè)門.最糟糕的結(jié)果是英雄不停地被傳送于兩個(gè)房間,天哪~ 最合理的應(yīng)該是把英雄放在新地圖中門的旁邊。
在創(chuàng)建門方塊的時(shí)候,我們傳遞了3個(gè)參數(shù):newMap、newCharX、newCharY。 他們分別是新的地圖序號,新的X坐標(biāo)和新的Y坐標(biāo)。當(dāng)?shù)貓D數(shù)組中出現(xiàn)數(shù)字2的時(shí)候,buildMap函數(shù)會(huì)在相應(yīng)的地方創(chuàng)建一個(gè)Tile2方塊。英雄穿過Tile2方塊后,他將到達(dá)myMap2,他的新坐標(biāo)是(1,4)。你可以在多個(gè)地圖中都用2,他們都可以讓英雄回到myMap2。
更多的代碼
在moveChar函數(shù)中插入下面這段代碼,放在return語句之前: if (game["t_" + ob.ytile + "_" + ob.xtile].door and ob == _root.char) { changeMap(ob); }
他的作用是,我們在移動(dòng)了對象之后判斷是不是站到了門口,而且對象要是英雄才行,如果都滿足要求,那么就換個(gè)地圖。我們利用changMap函數(shù)實(shí)現(xiàn)更換地圖的功能:
function changeMap(ob) { var name = "t_" + ob.ytile + "_" + ob.xtile; game.currentMap = game[name].newMap; ob.ytile = game[name].newchary; ob.xtile = game[name].newcharx; ob.frame = ob.clip._currentframe; buildMap(_root["myMap" + game.currentMap]); }
這個(gè)函數(shù)很好理解,我們從門對象(game[name])中得到newMap、newCharX、newCharY參數(shù),然后調(diào)用buildMap函數(shù)創(chuàng)建新地圖。
這里用到了一個(gè)新的屬性:frame,它是用來記錄英雄當(dāng)前的方向的,如果沒有記錄,在新地圖里面,英雄總是停在第一幀。我們同時(shí)還要加這句as到buildMap函數(shù)中(設(shè)置了英雄的坐標(biāo)以后): char.clip.gotoAndStop(char.frame);
這就是關(guān)于門的全部了,好了,多串串門吧~
下載源文件
出處:藍(lán)色理想
責(zé)任編輯:qhwa
上一頁 碰撞檢測 下一頁 跳躍
◎進(jìn)入論壇Flash專欄版塊參加討論
|