平臺上的敵人
如果你需要在平臺上面放一個巡邏的敵人,就像這樣:
只需要寫幾行就行了。敵人可以來回巡邏,碰到邊緣的時候會自動折回。這個需要敵人檢測下一個落腳點(diǎn)方塊的通行性:
getMyCorners (ob.x+ob.speed*ob.xMove, ob.y+ob.speed*ob.yMove+1, ob); if (!ob.downleft and !ob.downright) {
注意一下這里的一個很重要的數(shù)字:1。 (ob.y+ob.speed*ob.yMove+1)加1是為了檢查英雄腳下面的方塊。還有要注意的是只有當(dāng)downleft和downright都是true的時候,才能繼續(xù)向前走,否則就掉頭走。
下載本例的源文件
教給敵人一些竅門
碰到障礙物可以改變方向,而不是簡單的回頭走。
讓我們修改一下enemyBrain函數(shù)。以前是簡單的將ob.xMove和ob.yMove取相反數(shù),現(xiàn)在我們給他一個隨機(jī)的新方向:
ob.xMove = random(3)-1; if (ob.xMove) { ob.yMove = 0; } else { ob.yMove = random(2)*2-1; }
一旦敵人接觸障礙物,xMove就會得到一個隨機(jī)的數(shù)值(-1,0或1,random(3)會返回0,1或2)。如果生成的xMove值是0,我們就設(shè)置yMove為1或-1。 random(2) : 0 或 1 random(2)*2 : 0 或 2 random(2)*2-1 : -1 或 1 如果生成的xMove值是1,那么就把yMove值設(shè)置成0,然后重新生成xMove值。
下載本例的源文件
這樣就好多了,但是如果我們還可以優(yōu)化一下,我們應(yīng)該避免與原來相同或相反的方向。
代碼:
} else { if (ob.xMove == 0) { ob.xMove = random(2)*2-1; ob.yMove = 0; getMyCorners (ob.x+ob.speed*ob.xMove, ob.y+ob.speed*ob.yMove, ob); if (!ob.downleft or !ob.upleft or !ob.downright or !ob.upright) { ob.xMove = -ob.xMove; } } else { ob.xMove = 0; ob.yMove = random(2)*2-1; getMyCorners (ob.x+ob.speed*ob.xMove, ob.y+ob.speed*ob.yMove, ob); if (!ob.downleft or !ob.upleft or !ob.downright or !ob.upright) { ob.yMove = -ob.yMove; } } }
這回我們先檢查當(dāng)前的方向。例如,如果原先是垂直移動(xMove==0)那么我們讓xMove為1或-1,然后讓yMove為0。但是如果敵人在地圖的拐角處,他的新方向可能會讓他再一次撞上墻。這就是為什么我們要調(diào)用getCorners函數(shù)來檢測障礙物,如果有障礙物,掉頭走。
下載本例的源文件
Ok,這回敵人更加聰明了一些,因為玩家不能預(yù)知他遇到障礙物后的行走方向。但是你也注意到了,這個傻小子只會去撞墻然后改變方向。如果你的地圖中有大范圍的空白區(qū)域,玩家很難保證敵人能經(jīng)過那里。最好的例子是一個大房子,英雄站在中間,那么敵人永遠(yuǎn)也抓不到他。
我們賦予敵人自動轉(zhuǎn)向的能力,即便他沒有遇到障礙物。
我們在他的原型中添加一個turning屬性來表征轉(zhuǎn)向的能力。
turning表示的是敵人每行走一步時轉(zhuǎn)向的可能性。0代表永遠(yuǎn)不會轉(zhuǎn)向,100表示每步都要轉(zhuǎn)向(你可別千萬這么做)。
更改一下if判斷
if (ob.downleft and ob.upleft and ob.downright and ob.upright and random(100)>ob.turning) {
如果random(100)的值小于ob.turning,就換一個新的方向,就算本來能夠繼續(xù)往前走。
下載本例的源文件
出處:藍(lán)色理想
責(zé)任編輯:qhwa
上一頁 愚蠢的敵人 下一頁 射擊
◎進(jìn)入論壇Flash專欄版塊參加討論
|