添加敵人
希望現在你已經對添加Sprite和動畫很熟悉了。所以為了簡明,步驟不再完整重複。讓我們添加敵人Sprite。
1. 在圖層中添加新Sprite
2. 導入Sprite帶圖Enemies\Snail
3. 刪除動畫的第一幀
4. 設置動畫迴圈,速度15
5. 設置敵人圖像原點,應用在全部動畫
6. 裁剪多餘的空白((shift + crop)
7. 關閉動畫編輯器兵重名物件為SnailEnemy'
8. 在地面上放置Snail
現在我們想應用以下邏輯:
- 如果玩家撞上了snail,玩家角色閃爍且受傷。
- 如果玩家跳到了snail的上方,snail被殺死。
為了使玩家角色閃爍,選擇玩家並且添加add the Flash behavior。記住選擇正確的玩家角色,而不是玩家角色盒子。我們要使用Flash行為。
轉回到事件表單,添加新事件。
PlayerBox -> On collision with another object -> SnailEnemy
當我們和敵人在任何角度碰撞時,事件就會觸發。我們可以用二級事件去檢測玩家是跳躍到了敵人頭上還是撞到了邊上。
給碰撞添加一個二級事件:
PlayerBox -> Is falling
我們應該檢測玩家是否在敵人正上方。這能避免敵人被意外殺死,例如我們只是碰撞到了邊緣。右擊條件 the 'Is falling然後選擇'Add another condition。記住,所有條件都得被滿足才能運行。添加條件:
PlayerBox -> Compare Y -> Less than, SnailEnemy.Y
Y值向下增加,所以如果玩家的Y值比snail的更小,玩家就是在snail上方。
在此事件裡添加條件:
SnailEnemy -> Destroy
我們也能添加其他行動來使玩家角色彈起來:
PlayerBox -> Set vector Y -> -700
設置向量Y基本意味著設置平台運動的垂直速度。設為負值意味著向上(Y向下增加),700是一個比跳躍強度1100小的值。因此這會讓玩家角色彈起好像在做一個小跳。
我們還沒完全幹完—右擊事件'Is falling的空白處,然後選擇Add -> Else。否則是一個特殊的條件,如果事件沒運行,它就會運行。所以當我們和snail碰撞但是沒有跳到它頭上時就會運行,比方說我們從邊上上去。在這裡我們希望玩家角色受傷。添加行動。
Player -> Flash -> (leave default values and click Done)
記住玩家角色對象要閃爍,不是玩家角色盒子。
現在玩家角色永遠不會死,他們只是閃爍而已。但是我們已經能判斷出他們是否跳在了正上方。教程不會覆蓋全部,但是希望你能增加殺死效果(嘗試在敵人死後創建poofSprite,使用Spawn object'行動),讓玩家減血(在使玩家角色閃爍的事件裡,你可以用增加變數的方法見例子top-down shooter tutorial )。
現在讓敵人snail在平台上來回移動。
移動敵人
移動snail的主要問題是怎麼判定到達了平台邊緣。最簡單的方法是添加一個不可見的邊緣標誌。可以在平台的邊緣設置不可見的物件作為邊緣,觸碰它們就會返回。
我們也可以為snail設置平台行為。這有以下便利:
- 它能從左到右移動。
- 它能像玩家一樣上下。
- 如果你想的話,它也能從邊緣掉下去。
- 如果你想要一個跳躍的敵人,可以用simulate control使它自動跳躍
給snail敵人Sprite添加平台行為。因為我們在這個物件上不會用太複雜的動畫,我們可以直接用本身,不需要添加盒子。注意如果你製作了一個不同的平台遊戲,敵人有複雜動畫的話,你要把它當玩家角色處理。
我們不想讓玩家角色控制snail敵人。我們想讓它自動控制。我們可以設置Default controls屬性為No,然後用行動Simulate control。因為snail的動作很慢,所以把最大速度設為50,把加速度和減速度設為100.
我們也需要邊緣標籤。添加一個新的Sprite物件載入不透明的長方形,命名為EdgeMarker。把大小改為40 x 40,把Initial visibility設為Invisible。這樣就看不見。把它放在每個snail平台的邊緣處(別忘了拖動批量複製)。
snail也需要知道它現在移動的路線-朝左或朝右,我們要設置instance variables。每個物件的實例都有簡單的數位或文字。如果我們有多個snail,它們每一個都單獨儲存了變數。這使每個snail都有不同的血量、方向等等。一個簡單的自動控制敵人的方法是創建行動執行個體變數去儲存當前的情況。比如,它可以跑開,追蹤玩家角色或者休閒。我們現在只需要設置朝左或朝右。
選擇snail敵人物件,在屬性面板裡,在Instance variables裡點擊Add / Edit。
所有物件的執行個體變數會在一個對話清單裡顯示。點擊添加按鈕加一個。把名字設為action,類型為文本,初始值為右(往右移動)。
點擊OK,關閉執行個體變數對話窗。回到事件表單。
我們想實現以下邏輯:
- 如果行動是向右,模擬平台移動使snail向右移動。
- 如果行動是向左,模擬平台移動使snail向左移動。
而且:
- 如果snail達到了邊緣標誌,反轉它的行動方向(左變右,右變左)。
我們可以用以下兩個事件來達成這個行動:
Event SnailEnemy -> Compare instance variable -> action equal to "right" (按兩下顯示文本)
Action SnailEnemy -> Simulate control -> Right
向左也是一樣。我們也想讓它鏡像,就像我們對玩家角色做的。所以在left事件裡添加*SnailEnemy -> Set mirrored,在right事件裡添加SnailEnemy -> Set not mirrored。看起來會是這樣:
現在在邊緣處反轉snail的方向:
Event: SnailEnemy -> On collision with another object -> EdgeMarker
Subevent: SnailEnemy -> Compare instance variable -> action equal to "right"
Action: SnailEnemy -> Set value -> action to "left"
Subevent: Else
Action: SnailEnemy -> Set value -> action to "right"
在這裡用else很重要,因為事件都是從頭到底運行的。如果不用else,行動就等同於left,注意以前的事件已經這麼設置。所以它會重設,整體沒有效果變化。使用了else,我們就阻止了第二個事件的運行。
運行工程。注意snail在平台上來回移動。這讓跳躍變得難了!這是個非常初步的AI系統,所以希望你能創建出更智慧的AI來,你可以用更多的事件去控制行動,比方說允許它們從邊緣上落下,或者用跳躍扳機使它們知道什麼時候該跳上一個平台。
試著在平台上創建兩個snail。注意到它們是如何自我控制的,因為有不同的執行個體變數。希望你能明白執行個體變數對於控制實例獨立是多麼重要—你可不想讓它們都看起來一模一樣!