拾取物品
本章我們將會(huì)讓英雄從地上拾取各種物品,例如:水晶、金幣、死的蜘蛛、生命藥水、彈藥……
物品可以有很多種,有的用來增加生命值,有的用來增加彈藥。這個(gè)例子里面的物品只有一個(gè)功能,增加你的point值(顯示在下面的那個(gè)東西)。創(chuàng)建其他種類的物品就由你自己來完成了。
我們從“芝麻開門”這一章的影片開始,這樣我們可以去掉許多復(fù)雜的代碼,或許這樣更容易看明白。
首先要畫一個(gè)物品的影片剪輯。把各種物品的圖片都放在一個(gè)剪輯的不同幀。和英雄、敵人一樣,這個(gè)剪輯的注冊點(diǎn)也在中心。在第一幀添加stop()動(dòng)作。導(dǎo)出as鏈接,ID是items。和梯子類似,把物品單獨(dú)做成一個(gè)剪輯,放置物品到舞臺(tái)時(shí),不用重新繪制背景方塊。
你撿了多少?
為了顯示撿起了多少物品,在舞臺(tái)上添加一個(gè)動(dòng)態(tài)文本。把它放到區(qū)塊的外面,然后把它的“變量(variale)”設(shè)成points:
變量point用來記錄拾取的物品數(shù)。我們可以先把它添加到game對象中。改一下定義game對象的語句,添加一個(gè)points屬性,值為0(大部分都是從0開始的):
game = {tileW:30, tileH:30, currentMap:1, points:0};
放置物品
和其他東西一樣,首先我們要聲明一個(gè)物品(items)對象,然后創(chuàng)建數(shù)組,用來放置位置信息。
myItems = [ [0], [[1,1,1],[1,1,2],[2,1,3]], [[2,1,3],[2,6,3],[1,5,4]] ]; game.Item1= function () {}; game.Item1.prototype.points=1; game.Item2= function () {}; game.Item2.prototype.points=10;
myItems數(shù)組的結(jié)構(gòu)和enemies數(shù)組一樣(見《愚蠢的敵人》)。它包含了每個(gè)地圖的物品數(shù)組,我們沒有用到map0,所以第一個(gè)數(shù)組為空。在map1中我們設(shè)置了3個(gè)物品:[1,1,1],[1,1,2],[2,1,3]。每個(gè)物品都有3個(gè)數(shù)字,第一個(gè)是物品類型(這里的1或2),也就是物品影片剪輯顯示的幀數(shù)。第二、第三個(gè)數(shù)是物品的坐標(biāo),我們已經(jīng)很多次用這種形式了。以[2,1,3]為例,它是第二種類型的物品,坐標(biāo)是x=1,y=3。
最后部分的代碼聲明了兩種物品類型。目前他們只有一個(gè)point屬性,用來表示玩家得到后增加的point值。Item1只有1點(diǎn),Item2卻有10點(diǎn)。
現(xiàn)在修改buildMap函數(shù),增加一些創(chuàng)建物品的動(dòng)作,把下面的代碼放在創(chuàng)建英雄部分的前面:
game.items = myItems[game.currentMap]; for (var i = 0; i<game.items.length; ++i) { var name = "item"+game.items[i][2]+"_"+game.items[i][1]; game[name]= new game["Item"+game.items[i][0]]; game[name].position= i; game.clip.attachMovie("items", name, 10001+i); game[name].clip=game.clip[name]; game[name].clip._x = (game.items[i][1]*game.tileW)+game.tileW/2; game[name].clip._y = (game.items[i][2]*game.tileH)+game.tileH/2; game[name].clip.gotoAndStop(game.items[i][0]); } _root.points=game.points;
首先我們復(fù)制當(dāng)前地圖用到的物品到game.items對象中,然后循環(huán)game.items對象(數(shù)組)。
從這行開始:
var name = "item"+game.items[i][2]+"_"+game.items[i][1];
我們給新的物品命名。名字由物品的坐標(biāo)決定,比如一個(gè)物品所在的區(qū)塊坐標(biāo)是x=1,y=3,那它的名稱是item3_1。
創(chuàng)建了物品對象以后,我們給他添加了一個(gè)position屬性。這個(gè)屬性就是物品在game.items數(shù)組中的索引值。通過這個(gè)屬性可以很方便地在game.items數(shù)組中找到當(dāng)前的物品,這樣就可以在撿到物品后在數(shù)組中刪除掉它。
放置物品到正確的位置之后,下一步就是讓他顯示正確的幀。
最后,我們更新一下points變量,在場景的相應(yīng)地方顯示出來。游戲開始的時(shí)候點(diǎn)數(shù)可能只有0,但是改變地圖的時(shí)候,可能英雄已經(jīng)撿到了幾個(gè)物品。
拾取
我們已經(jīng)有了英雄、物品,下一步要做的就是讓英雄碰到物品的時(shí)候撿起它。把這段代碼添加到moveChar函數(shù)的末尾:
var itemname=game["item"+ob.ytile+"_"+ob.xtile]; if (itemname and ob == _root.char) { game.points=game.points+itemname.points; _root.points=game.points; removeMovieClip(itemname.clip); game.items[itemname.position]=0; delete game["item"+ob.ytile+"_"+ob.xtile]; }
變量itemname的值由英雄當(dāng)前的位置決定。比如英雄的坐標(biāo)是x=4,y=9,那么itemname的值就是"item9_4"。如果這個(gè)item9_4確實(shí)是存在的,itemname就是物品對象;如果不巧不存在這樣的item9_4對象,itemname就是undefined(未定義值)。
如果英雄得到了物品,我們首先把物品的points值加到game.points變量,然后更新_root.points以顯示到文本框中。
現(xiàn)在要做的就是把物品從舞臺(tái)上刪除。每一個(gè)物品在三個(gè)地方都要?jiǎng)h除:物品剪輯、物品數(shù)組中相應(yīng)的物品,以及物品對象本身。目前我們不必在數(shù)組中刪除掉他,僅僅將物品用0替換就行了。另外不要忘了,物品數(shù)組僅僅是myItems數(shù)組的一部分,如果我們離開地圖然后又返回,原先已經(jīng)拾取的物品又會(huì)出現(xiàn)。為了阻止這種現(xiàn)象,我們要更新changeMap函數(shù)。
添加下面的代碼到changeMap函數(shù)的開始:
var tempitems=[]; for (var i = 0; i<game.items.length; ++i) { if(game.items[i]) { var name = "item"+game.items[i][2]+"_"+game.items[i][1]; delete game[name]; tempitems.push(game.items[i]); } } myItems[game.currentMap]=tempitems;
這里我們用到了一個(gè)臨時(shí)的數(shù)組:tempitem,用來復(fù)制未被拾取的物品,即myItems數(shù)組中的非零元素。刪除game[name]對象是我們上面提到的三個(gè)刪除任務(wù)中的一個(gè)。
點(diǎn)擊這里下載本例的源文件
這里我做了側(cè)視圖例子:
點(diǎn)擊這里下載源文件
出處:藍(lán)色理想
責(zé)任編輯:qhwa
上一頁 射擊 下一頁 浮動(dòng)區(qū)塊
◎進(jìn)入論壇Flash專欄 版塊參加討論