愚蠢的敵人
我們的英雄已經(jīng)很完美了,但是他很無聊,唯一能做的只是來回走。我們需要?jiǎng)e的東西。不是食物,不是飲料,也不是美女,我們需要的是——一些敵人。敵人就像加在湯里的鹽,缺了它,一切都索然無味。好的游戲中會(huì)有聰明的敵人,但是我們從一些最笨的敵人開始做起。他們所做的僅僅是來回走,順便檢測(cè)是不是碰上英雄了。
到目前為止,我們已經(jīng)有了兩類對(duì)象:英雄和方塊。英雄由玩家操縱,方塊不會(huì)運(yùn)動(dòng)。敵人應(yīng)該類似英雄,唯一不同的是,我們不能操作他們移動(dòng),我們將會(huì)賦予他們一定的智能。我們將要做兩種不同的敵人,第一種上下走,第二種會(huì)左右走。他們都會(huì)在撞到墻上后回頭繼續(xù)走。(真夠笨的:)
在你開始構(gòu)造你的超級(jí)復(fù)雜的敵人之前,再想想一些東西。許多游戲?qū)嶋H上沒有用到敵人,有的雖然用到了,也不是很聰明。Flash并不是非常強(qiáng)大,如果你的游戲中有100個(gè)敵人,他們都聰明地使用A*算法跟蹤英雄,我真的懷疑是否有這么強(qiáng)大的機(jī)器能運(yùn)行。如果可以的話,最好讓一些敵人愚蠢些,一些聰明些,結(jié)果玩家可能就會(huì)忽略了他們的差別。另外,我們都想要比別人聰明,所以就讓玩家感覺這種樂趣好了 :)
準(zhǔn)備敵人
同創(chuàng)建英雄一樣,創(chuàng)建一個(gè)剪輯放置敵人(如果忘了怎么做,在回頭看看)。他們也有4幀,分別是左、上、下、右的動(dòng)畫。同樣的,他們也要導(dǎo)出為“enemy1”和“enemy2”(在庫面板中設(shè)置linkage)。現(xiàn)在我們添加一個(gè)enemies數(shù)組:
myEnemies = [ [0], [[1, 6, 1]], [[2, 1, 3]] ];
看得出來,我們?cè)趍ap1放了1個(gè)敵人。 [1,6,1]:第一個(gè)1代表敵人的類型(hoho~我們有好多中敵人得) 6,1是他開始的位置。創(chuàng)建地圖的時(shí)候,我們會(huì)把他放到x=6,y=1的方塊上。同理在map2中也有一個(gè)敵人,但是類型是2,位置是1,3。你可在一個(gè)地圖中放置多個(gè)敵人,但是千萬記住,不要把他們嵌到墻里面!記得要放在一個(gè)可通行的方塊上面。
讓我們聲明一些敵人的模板:
game.Enemyp1= function () {}; game.Enemyp1.prototype.xMove=0; game.Enemyp1.prototype.yMove=1; game.Enemyp1.prototype.speed=2;
game.Enemyp2= function () {}; game.Enemyp2.prototype.xMove=1; game.Enemyp2.prototype.yMove=0; game.Enemyp2.prototype.speed=2;
他們的代碼看起來很相似,但是他們動(dòng)作就不一樣了。Enemyp1會(huì)上下走,因?yàn)樗膟Move屬性是1;但是Enemyp2只會(huì)水平移動(dòng)。你可以設(shè)置xMove/yMove屬性為1或-1或0。不過請(qǐng)不要同時(shí)把這兩個(gè)屬性都設(shè)置成非零值,除非你希望敵人能走對(duì)角線。
你也可以把xMove和yMove都設(shè)置成0,這樣的敵人沒有移動(dòng)的能力,也許你會(huì)用到。
speed屬性聲明了敵人移動(dòng)的速度。不同的敵人可以有不同的速度。
擺放敵人
在buildMap函數(shù)中,介于創(chuàng)建門和創(chuàng)建英雄的代碼之間,加入如下代碼:
var enemies = myEnemies[game.currentMap]; game.currentEnemies = enemies.length; for (var i = 0; i<game.currentEnemies; ++i) { var name = "enemy"+i; game[name]= new game["Enemyp"+enemies[i][0]]; game.clip.attachMovie("enemy"+enemies[i][0], name, 10001+i); game[name].clip=game.clip[name]; game[name].xtile = enemies[i][1]; game[name].ytile = enemies[i][2]; game[name].width = game.clip[name]._width/2; game[name].height = game.clip[name]._height/2; game[name].x = (game[name].xtile *game.tileW)+game.tileW/2; game[name].y = (game[name].ytile *game.tileH)+game.tileH/2; game[name].clip._x = game[name].x; game[name].clip._y = game[name].y; }
這段代碼什么意思?首先我們得到當(dāng)前地圖的敵人數(shù)組,轉(zhuǎn)存為enemies數(shù)組,然后把敵人的個(gè)數(shù)傳給currentEnemies,接著遍歷敵人數(shù)組,把他們都安置好。 (記住,雖然這里只用到了一個(gè)敵人,但是可以有更多的)
變量name的值是新創(chuàng)建的敵人的名字,“enemy0”,“enemy1”,“enemy2”……依次類推。然后我們從相應(yīng)的模板(剛剛聲明過)創(chuàng)建新的對(duì)象:
game[name]= new game["Enemy"+enemies[i][0]]; 從敵人數(shù)組(enemies[i])的第一個(gè)元素(enemies[i][0])得到敵人的類型,比如是1,然后通過enemyp1模板創(chuàng)建一個(gè)敵人。
下面的幾行是取得坐標(biāo),然后把敵人放置到該處。ok,這就是buildMap函數(shù)該變動(dòng)的地方。
但是,你也許會(huì)大聲喊出來,但是他還不會(huì)動(dòng)!好吧,我們就讓他動(dòng)起來
移動(dòng)敵人
同人一樣,敵人也需要腦子,我們就寫個(gè)enemyBrain函數(shù)好了:
function enemyBrain () { for (var i = 0; i<game.currentEnemies; ++i) { var name = "enemy"+i; var ob = game[name]; getMyCorners (ob.x+ob.speed*ob.xMove, ob.y+ob.speed*ob.yMove, ob); if (ob.downleft and ob.upleft and ob.downright and ob.upright) { moveChar(ob, ob.xMove, ob.yMove); } else { ob.xMove = -ob.xMove; ob.yMove = -ob.yMove; } var xdist = ob.x - char.x; var ydist = ob.y - char.y; if (Math.sqrt(xdist*xdist+ydist*ydist) < ob.width+char.width) { removeMovieClip(_root.tiles); _root.gotoAndPlay(1); } }
}
正如你所看到的,我們又要遍歷數(shù)組了。我們把enemies數(shù)組的每個(gè)元素存到ob,當(dāng)i等于0的時(shí)候,ob就是enemy0。
然后我們調(diào)用getCorners函數(shù),檢查敵人是不是碰到了障礙物,如果upleft、downleft、upright、downright都是true,則說明可以行走。我們就可以放心的調(diào)用moveChar函數(shù),同時(shí)傳遞xMove、yMove給moveChar函數(shù)。我們以前用moveChar都是移動(dòng)英雄的,現(xiàn)在移動(dòng)敵人也沒有任何區(qū)別,我說過,我們可以重復(fù)使用許多函數(shù)的。
如果英雄碰到了障礙物,我們就讓xMove和yMove都取相反數(shù),比如原來xMove是1,就取-1,這樣敵人就會(huì)掉頭移動(dòng)。如果yMove原來是0,那么相反數(shù)還是0,沒有影響。
最后一部分檢測(cè)英雄和敵人的距離,看是不是碰到了一起,如果是,oh,game over。當(dāng)然,游戲不可能這么簡(jiǎn)單的結(jié)束掉,你可以減少英雄的生命值或者做別的處理,這些都由你自己完成。我們使用的計(jì)算距離的公式用的是“勾股定理”,如果你需要精確到象素級(jí)別的接觸,你應(yīng)該用hitTest,但是這里沒有必要這么精確。別離敵人太近,否則你會(huì)死掉的。:-)
我們需要不停的調(diào)用這個(gè)函數(shù),所以在detectKeys函數(shù)中加入:
_root.enemyBrain();
這就是一個(gè)敵人,很愚蠢的敵人。接下來我們要做更聰明的敵人,他們象人一樣四處巡邏,碰到障礙物后會(huì)改變方向繼續(xù)巡邏。hoho,繼續(xù)吧~
下載本例的源文件
出處:藍(lán)色理想
責(zé)任編輯:qhwa
上一頁 梯子 下一頁 更多關(guān)于敵人的東西
◎進(jìn)入論壇Flash專欄 版塊參加討論