Code.Gamelet Doc
Code.Gamelet Doc

發射飛彈

這一節,我們將會新增四個新的事件:

  1. 發射子彈: 每按滑鼠左鍵一次就放出一枚飛彈。
  2. 子彈飛行: 讓飛彈朝固定方向持續飛行。
  3. 子彈撞怪物: 檢查所有飛彈與所有怪獸的碰撞,讓飛彈能夠炸死怪獸。
  4. 怪物全死光: 檢查所有怪獸是否全部被消滅,並在怪獸全滅時彈出結束視窗。

發射子彈

新增一個事件ID為 發射子彈 的事件,並設定為 無限重覆 ,並將 重覆間隔 設定為 150 毫秒。

info 什麼是 重覆間隔

當一個事件被設定可以重覆執行時,我們可以設定事件的 重覆間隔 ,代表事件觸發並通過檢查後,下一次事件還能再次被觸發的最快時間間隔。

在這個範例中,我們設定 重覆間隔 為 150 毫秒(0.15秒),代表玩家最快每 150 毫秒可以發射一枚飛彈。

我們將在這個事件中加入一個觸發(監聽滑鼠左鍵在被點擊時醒來檢查),加入一個檢查(+檢查戰機是否還活著),以及三個動作: 將飛彈圖放上舞台、設定飛彈在飛出畫面外自動消失、設定飛彈的初始位置及角度。

(+觸發) 滑鼠點擊

在 發射子彈 事件中按下 觸發 add 開啟新增觸發的視窗,並從目錄中選擇 輸入 chevron_right 滑鼠點擊

  • 觸發時機: 點擊滑鼠按鍵(click)
  • 檢查按鈕: 左鍵

(+檢查) 變數是否存在

在 發射子彈 事件中按下 檢查 add 開啟新增檢查的視窗,並從目錄中選擇 變數 chevron_right 變數是否存在

  • 用來尋找變數的鍵名(Key): fighter0
  • 檢查: 存在

info 什麼是 變數

變數 是程式語言中的專有名詞,英文叫 variable,可以把它想像成一個箱子,裏面可以放一個物件,也可以把裏面的東西拿出來改放另一個物件,箱子的上面有貼死一個名條, 當電腦呼叫名條上的名字時,就等於在呼叫箱子裏存放的物件一樣。

在這個範例中, fighter0 就是一個箱子的名字,裏面放的東西是玩家的戰機,這個變數原本是在第一個事件(初始化)中的動作 建立圖層佈局 裏建立的 (在同一個動作裏還建立了 background0, monster0, monster1, monster2, monster3), 在 怪物撞戰機 事件中,有一個 移除物件 的動作裏,我們將 fighter0 的箱子清空。

因此在 怪物撞戰機 事件發生過後,檢查 變數是否存在 時,我們打開箱子就會發現裏面原本存放的戰機已經不存在了。

(+動作) 建立圖層佈局

當滑鼠點擊觸發後,檢查 fighter0 變數內容仍存在的情況下,發射子彈事件的動作就會被執行。第一件要做的動作是把飛彈的圖片放到舞台上。

在 發射子彈 事件中按下 動作 add 開啟新增動作的視窗,並從目錄中選擇 新增 chevron_right 顯示 chevron_right 建立圖層佈局 , 父節點的物件ID填入 gameroot ,並將飛彈圖片(bullet)拉到舞台上,然後按下左上角的綠色勾勾完成。

(+動作) 自動移除圖片

在遊戲中,玩家肯定為了擊敗怪獸會不斷發射飛彈,若舞台上的飛彈越積越多,電腦最後一定會吃不消,畫面會越變越慢,最終可能導至我們的遊戲網頁當掉或被瀏覽器強制關閉之類不好的遊戲體驗。 自動移除圖片 的功能就是為了防止這種事情發生的便利工具,這個動作可以讓圖片在離開畫面後自動消失,保持電腦的效能。

在 發射子彈 事件中按下 動作 add 開啟新增動作的視窗,並從目錄中選擇 移除 chevron_right 顯示 chevron_right 自動移除圖片

  • 物件的ID: bullet0
  • 可視範圍: 全螢幕
  • 延遲啟動: 100 毫秒

(+動作) 更新顯示物件

最後要把飛彈的位置放在戰機的位置上,並把角度調整至鼠標所在的方向。

在 發射子彈 事件中按下 動作 add 開啟新增動作的視窗,並從目錄中選擇 更新 chevron_right 顯示 chevron_right 更新顯示物件

  • 物件的ID: bullet0
  • 勾選 設定位置 ,設定方式選擇 設定在一個顯示物件上 ,目標物件 fighter0
  • 勾選 設定旋轉角度 ,設定方式選擇 轉向鼠標 ,旋轉率 1

子彈飛行

飛彈被創造出來後,接著就是要讓飛彈朝它面對的方向持特飛行,直到飛出畫面外,讓 自動移除圖片 的動作幫我們自動移除飛彈。

新增一個事件ID為 子彈飛行 的事件,並設定為 無限重覆 。我們將在這個事件中加入一個檢查以及一個動作,用來控制所有飛彈們的飛行。

(+檢查) For Each

在 子彈飛行 事件中按下 檢查 add 開啟新增檢查的視窗,並從目錄中選擇 迴圈 chevron_right For Each 。 我們要在這個For Each中找到所有名字(ID)以 bullet 作為開頭的物件,並對這些物件都執行一個 更新顯示物件 的動作,讓所有的飛彈都持續朝一個方向前進。

  • 區域變數名稱: instance
  • 用來搜尋物件的ID: bullet*

(+動作) 更新顯示物件

在 子彈飛行 事件中按下 動作 add 開啟新增動作的視窗,並從目錄中選擇 更新 chevron_right 顯示 chevron_right 更新顯示物件

  • 物件的ID: instance
  • 勾選 設定位置 ,設定方式選擇 朝一個方向移動 ,距離填入 10

完成這個事件後,可以試玩一下,遊戲在這個階段就可以爽快的連續發射飛彈了。

子彈撞怪物

在這裏,我們要做一個和 怪物撞戰機 非常類似的事件,檢查是否有其中一顆飛彈擊中其中一隻怪獸,但在這個事件中的迴圈檢查,我們將用到 雙層迴圈

新增一個事件ID為 子彈撞怪物 的事件,並設定為 無限重覆

(+檢查) For Each

首先是第一層迴圈,用來找出所有飛彈放入迴圈中。

在 子彈撞怪物 事件中按下 檢查 add 開啟新增檢查的視窗,並從目錄中選擇 迴圈 chevron_right For Each

  • 區域變數名稱: bullet
  • 用來搜尋物件的ID: bullet*

(+檢查) For Each

接著是第二層迴圈,用來找出所有怪獸放入第二層迴圈中。

在 子彈撞怪物 事件中按下 檢查 add 開啟新增檢查的視窗,並從目錄中選擇 迴圈 chevron_right For Each

  • 區域變數名稱: monster
  • 用來搜尋物件的ID: monster*

在雙層迴圈中,每一次的迴圈都會將找到的其中一個飛彈取名為 bullet, 還有其中一隻怪獸取名為 monster ,提供事件中的動作的目標物件。

(+檢查) 物件重疊

在 子彈撞怪物 事件中按下 檢查 add 開啟新增檢查的視窗,並從目錄中選擇 顯示 chevron_right 物件重疊

  • 顯示物件的ID: bullet
  • 顯示物件的ID: monster
  • 檢查方式: 距離
  • 距離: 30
../../_images/check_foreach_bullets_monsters.zh.png

參考上圖可以發現,物件重疊是在雙層迴圈之內,所以可以調用迴圈給飛彈和怪物暫時取的小名 bullet 和 monster 。

(+動作) 建立圖層佈局

在 子彈撞怪物 事件中按下 動作 add 開啟新增動作的視窗,並從目錄中選擇 新增 chevron_right 顯示 chevron_right 建立圖層佈局 , 用來加入爆炸的特效。

  • 父節點的物件ID: gameroot
  • 圖片佈局
    1. 將 explosion 這個資源拉進舞台
    2. 將explosion的轉軸設到中心位置 x: -35 , y: -27
    3. 勾選動畫的 播放自動移除

(+動作) 更新顯示物件

剛剛加入的爆炸特效要移動到怪獸的位置。 在 子彈撞怪物 事件中按下 動作 add 開啟新增動作的視窗,並從目錄中選擇 更新 chevron_right 顯示 chevron_right 更新顯示物件

  • 物件的ID: explosion0
  • 勾選 設定位置 ,設定方式選擇 設定在一個顯示物件上 ,目標物件 monster

(+動作) 移除物件

將飛彈從舞台上移除。 在 子彈撞怪物 事件中按下 動作 add 開啟新增動作的視窗,並從目錄中選擇 移除 chevron_right 移除物件

  • 物件ID: bullet

(+動作) 移除物件

將怪獸從舞台上移除。 在 子彈撞怪物 事件中按下 動作 add 開啟新增動作的視窗,並從目錄中選擇 移除 chevron_right 移除物件

  • 物件ID: monster

完成這個事件後,可以再試玩一下,現在可以發射飛彈,並讓被擊中的怪獸炸開消失了。 接下來剩最後一個事件: 怪物全死光。

怪物全死光

在這個事件中,我們會在每次 子彈撞怪物 事件發生後(代表有怪獸被消滅的時候),檢查如果全部的怪獸都消失後,要彈出一個任務完成的視窗。

新增一個事件ID為 怪物全死光 的事件,這個事件不需要重覆(重覆次數0)。

(+觸發) 事件觸發後

在 怪物全死光 事件中按下 觸發 add 開啟新增觸發的視窗,並從目錄中選擇 事件 chevron_right 事件觸發後

  • 事件的ID: 子彈撞怪物
  • 觸發時機: 在事件中的所有動作全部執行完畢後

(+檢查) 變數是否存在

在 發射子彈 事件中按下 檢查 add 開啟新增檢查的視窗,並從目錄中選擇 變數 chevron_right 變數是否存在

  • 用來尋找變數的鍵名(Key): monster*
  • 檢查: 不存在

info 星號搜尋

這裏我們再次使用 * (星號)來搜尋怪獸,只要找到一隻名字以 monster 開頭的怪獸,這個檢查就不會通過。

(+動作) 彈出確認視窗

彈出顯示任務完成遊戲結束的視窗。 在 怪物撞戰機 事件中按下 動作 add 開啟新增動作的視窗,並從目錄中選擇 彈出視窗 chevron_right 彈出確認視窗

  • 彈出視窗的ID: gameclear
  • 標題: Level Complete
  • 勾選 隱藏取消按鈕
  • 確認按鈕文字: 再一次

當玩家按下這個視窗(gameclear)的「再一次」按鈕後,上上節製作的 重新一次 事件就會被觸發,這個事件表重新再跑一次。

製作完成

恭喜完成了你在CG的第一個遊戲! 你可以試玩看看,改改事件中的參數,或試試在製作過程中偷瞄到的各種功能。

camera_alt 完整事件表參考截圖

../../_images/events_full_done.zh.png

下一步

接下來,我們要做一些和遊戲內容比較不相干的事: 發佈遊戲成品