梯子
在區(qū)塊游戲中梯子是很常見的一種東西。英雄可以在梯子上爬上爬下(我打賭你不知道:)。當(dāng)在梯子上按上下方向鍵的時(shí)候,我們會(huì)讓英雄上下攀爬。
看起來梯子很簡單,實(shí)際上又很多東西需要考慮。首先,有多少種梯子?
在圖中,有4種不同種類的梯子。 梯子A處于一個(gè)不可通行的障礙物中。英雄在上面能做什么呢?他可以上下爬,但是不能左右運(yùn)動(dòng),否則就會(huì)卡在墻里,那可不好受。
qhwa注: 有些游戲中在這種梯子上是可以左右移下來的,這個(gè)功能可以由你自己添加。
梯子B所在的方塊是可通行的,而且它的上面還有梯子,所以英雄可以上下爬,也可以左右移動(dòng)。但是當(dāng)他左右移動(dòng)的時(shí)候,就該掉下來了。
梯子C下面沒有梯子了,英雄只能在它上面向上爬,或者左右移動(dòng)。
梯子D并不是在所有的游戲中都會(huì)出現(xiàn)。有些人認(rèn)為這種梯子是設(shè)計(jì)的失誤,因?yàn)樗麄儾粚?dǎo)向任何地方,在空中就斷掉了。英雄可以爬上去然后站到梯子上面嗎?如果梯子頂部的左右有方塊,英雄可以走過去嗎?這些都是容易出現(xiàn)分歧的。
這些都是梯子的一些例子,當(dāng)然還有其他形式的梯子,但是我希望你能看到在開始寫代碼之前理一下思緒是多么重要。游戲各不相同,可能這里的東西在有的時(shí)候很適用,但是可能在別的地方就未必了,只要你每次寫代碼之前思考一下,不要硬套,就會(huì)事半功倍。
規(guī)則
讓我們列一下關(guān)于梯子的規(guī)則:
1. 通過上下方向鍵,英雄可以在梯子上上下移動(dòng) 2. 當(dāng)英雄和梯子接觸時(shí),他可以爬上去 3. 當(dāng)英雄和梯子接觸,且下方也有梯子時(shí),他可以爬下來 4. 當(dāng)英雄在梯子上,且左右沒有墻時(shí),他可以左右移動(dòng) 5. 英雄不能在梯子上跳躍
這些應(yīng)該夠了。
請給我一把梯子
梯子是顯示在方塊的上面的,所以我們要給他做一個(gè)獨(dú)立的影片夾子。這樣我們就不用為上面說的不同類型的梯子創(chuàng)建不同的圖像了。確定你的梯子mc被導(dǎo)出到as("Export for as"),并且檢查鏈接名是否為"ladder"。
在ladder影片夾子中,畫出如上形狀的梯子,梯子水平方向在方塊的中間。
和其他方塊一樣,我們也要定義梯子的原型:
game.Tile4 = function () {}; game.Tile4.prototype.walkable = false; game.Tile4.prototype.frame = 2; game.Tile4.prototype.ladder = true; game.Tile4.prototype.item = "ladder";
game.Tile5 = function () {}; game.Tile5.prototype.walkable = true; game.Tile5.prototype.frame = 1; game.Tile5.prototype.ladder = true; game.Tile5.prototype.item = "ladder";
這兩個(gè)不同的方塊(Tile4和Tile5)都具有frame屬性,這是用來表示梯子后面(在屏幕上是下面層)的方塊類型。他們還有值為true的ladder屬性(用來表示這里有把梯子),值為"ladder"的item屬性(用來attachMovie用的,復(fù)制ladder影片夾子)
在buildMap函數(shù)中復(fù)制ladder影片夾到方塊中:
game.clip[name].gotoAndStop(game[name].frame); if (game[name].item != undefined) { game.clip[name].attachMovie(game[name].item, "item", 1); }
這段代碼首先讓方塊顯示正常的幀(由frame屬性決定),然后判斷item屬性是否為空,如果不是(有值)就復(fù)制item表示的mc。你可以把item屬性設(shè)定成別的值,這樣就可以復(fù)制別的mc,在別的地方也可以用到,只是要注意別在一個(gè)方塊中復(fù)制太多不同的mc。
為了不重復(fù)輸入代碼,我們把moveChar函數(shù)的結(jié)束部分修改一下,調(diào)用一個(gè)新函數(shù)updateChar:
updateChar (ob, dirx, diry); return (true);
這是updateChar函數(shù):
function updateChar (ob, dirx, diry) { ob.clip._x = ob.x; ob.clip._y = ob.y; ob.clip.gotoAndStop(dirx + diry * 2 + 3); ob.xtile = Math.floor(ob.clip._x / game.tileW); ob.ytile = Math.floor(ob.clip._y / game.tileH); if (game["t_" + ob.ytile + "_" + ob.xtile].door and ob == _root.char) { changeMap (ob); } }
在fall函數(shù)中添加:
ob.climb = false;
修改detectKeys函數(shù),添加上下鍵的監(jiān)測:
if (Key.isDown(Key.RIGHT)) { getMyCorners (ob.x - ob.speed, ob.y, ob); if (!ob.climb or ob.downleft and ob.upleft and ob.upright and ob.downright) { keyPressed = _root.moveChar(ob, 1, 0); } } else if (Key.isDown(Key.LEFT)) { getMyCorners (ob.x - ob.speed, ob.y, ob); if (!ob.climb or ob.downleft and ob.upleft and ob.upright and ob.downright) { keyPressed = _root.moveChar(ob, -1, 0); } } else if (Key.isDown(Key.UP)) { if (!ob.jump and checkUpLadder (ob)) { keyPressed = _root.climb(ob, -1); } } else if (Key.isDown(Key.DOWN)) { if (!ob.jump and checkDownLadder (ob)) { keyPressed = _root.climb(ob, 1); } }
當(dāng)我們檢測了左右鍵之后,我們判斷英雄是不是不在跳躍過程中(!ob.jump),而且利用checkUpLadder函數(shù)和checkDownLadder函數(shù)判斷附近是不是有梯子, 如果一切正常,調(diào)用climb函數(shù)來移動(dòng)英雄。
攀爬動(dòng)作的函數(shù)
我們將要?jiǎng)?chuàng)建3個(gè)新的函數(shù),1個(gè)為了檢測是否能往上爬, 1個(gè)為了檢測是否能往下爬,還有一個(gè)是實(shí)現(xiàn)攀爬動(dòng)作的函數(shù)。
function checkUpLadder (ob) { var downY = Math.floor((ob.y + ob.height - 1) / game.tileH); var upY = Math.floor((ob.y - ob.height) / game.tileH); var upLadder = game["t_" + upY + "_" + ob.xtile].ladder; var downLadder = game["t_" + downY + "_" + ob.xtile].ladder; if (upLadder or downLadder) { return (true); } else { fall (ob); } }
這段代碼首先計(jì)算英雄的上下兩個(gè)y坐標(biāo)(頭和腳),根據(jù)所在的區(qū)塊的ladder屬性就可以判斷是否可以往上爬。如果上下都沒有梯子,我們檢測英雄是否應(yīng)該掉下來。
function checkDownLadder (ob) { var downY = Math.floor((ob.speed + ob.y + ob.height) / game.tileH); var downLadder = game["t_" + downY + "_" + ob.xtile].ladder; if (downLadder) { return (true); } else { fall (ob); } }
為了檢測往下的攀爬動(dòng)作,我們需要英雄腳底下方塊的ladder屬性。 和往上爬不同,我們還要考慮到英雄接下來(移動(dòng)結(jié)束)所在的方塊的ladder屬性(ob.speed+ob.y+ob.height)。
function climb (ob, diry) { ob.climb = true; ob.jump = false; ob.y += ob.speed * diry; ob.x = (ob.xtile * game.tileW) + game.tileW / 2; updateChar (ob, 0, diry); return (true); }
在climb函數(shù)中,我們首先設(shè)置climb標(biāo)記為true,jump標(biāo)記為false。然后計(jì)算新的y坐標(biāo),把英雄放在梯子方塊的中間,ob.x = (ob.xtile * game.tileW) + game.tileW / 2;
英雄可以在梯子左側(cè)或右側(cè)抓著梯子爬,但是這樣不太雅觀:)
最后我們利用updateChar函數(shù)移動(dòng)英雄到正確的位置。
下載源文件
出處:藍(lán)色理想
責(zé)任編輯:qhwa
上一頁 騰云駕霧 下一頁 愚蠢的敵人
◎進(jìn)入論壇Flash專欄 版塊參加討論