案例名稱:空中格鬥(飛機大戰)
一、案例介紹
小朋友們在書上或者電視或者電影裡面經常可以看到,為了維護國家和地區安全,為了抵擋外來入侵等等。戰鬥機與戰鬥機互相在空中格鬥的這麼一個場景。我們今天就是來模擬一個空中格鬥的遊戲。在本案例彙總,敵機會源源不斷的從上方飛來,不同的敵機堅硬程度不一樣,我們通過滑鼠來控制我們戰鬥機的移動,瞄準敵機將其擊毀,每擊毀一架敵機,就可以獲得相應的積分,越是堅硬的敵機得分就越高。千萬不要讓敵機撞到我們的戰鬥機,否則我們的戰鬥機就會被撞毀,遊戲結束。
二、案例演示
我們先通過一段視訊來看一下我們最終實現的一個遊戲效果
【Scratch案例演示】Scratch空中格鬥 Scratch星際大戰
三、案例分析
3.1、角色分析
- 我方戰鬥機:通過滑鼠控制移動(只能左右移動),不斷髮射子彈
- 敵機1:移動速度3,血量1,產生時間2秒,1發子彈就可擊毀,擊毀後得分加1分
- 敵機2:移動速度2.5,血量2,產生時間3秒,2發子彈就可擊毀,擊毀後得分加2分
- 敵機3:移動速度1.8,血量3,產生時間4秒,3發子彈就可擊毀,擊毀後得分加3分
- 敵機4:移動速度1,血量4,產生時間5秒,4發子彈就可擊毀,擊毀後得分加4分
- 子彈:我方戰鬥機的彈藥,通過發射子彈消滅入侵的敵機,子彈數量源源不斷
- 炸彈:這個是我們的超級武器,只要發射,螢幕上所有的敵機全部銷燬,但這個炸彈是每間隔一段時間才會在舞臺上出現,我方戰鬥機碰到之後才能擁有。
- 遊戲結束:當我方戰鬥機被撞毀之後,遊戲結束。
3.2、背景分析
四、角色和背景設定
4.1、角色設定
1、刪除預設的小貓角色,然後從電腦上匯入我們的戰鬥機角色,如下圖所示:
2、採用同樣的方式,將敵機角色、子彈和炸彈以及遊戲結束角色依次匯入進來,完成如下圖所示:
4.2、背景設定
1、從電腦上匯入我們藍天背景,並刪除預設的空白背景,如下圖所示:
2、最後調整好每個角色的大小和位置,完成如下圖所示:(除了我方戰鬥機,其它角色開是都是隱藏的)
五、流程分析
5.1、我方戰鬥機
我放戰鬥機將會有2條積木指令並行執行,具體分析如下:
1、程式啟動的時候跟隨滑鼠來回移動,移動過程中是否碰到敵機;
2、當接收到遊戲結束的時候,停止遊戲
當接收到遊戲結束→停止該角色的其它指令碼→說我還會再來的
PS:【】代表迴圈結構,重複執行
<>代表條件判斷結構,是否滿足條件(下同)
5.2、敵機1
每種敵機將會有4條積木指令並行執行,具體分析如下:
1 程式啟動的時候初始化,並實現自我克隆(不斷產生新的敵機)
程式啟動→隱藏→初始方向→初始大小→重複克隆自己【克隆自己→時間間隔】
2 作為克隆體啟動的時候,實現從上往下飛,飛行途中碰到子彈會消失,碰到最底部邊緣也會消失
3 當收到發射炸彈時,會消失
當收到發射炸彈→將得分增加1→刪除克隆體
4 當收到遊戲結束時,停止遊戲
當接收到遊戲結束→停止該角色的其它指令碼
5.3、敵機2
敵機2同樣有4條積木指令並行執行,具體分析如下:
1 程式啟動的時候初始化,並實現自我克隆(不斷產生新的敵機);跟敵機1不同的是,在初始化之後克隆之前會有一個等待時間,也就是出來的時間等待,比敵機1晚一點。
程式啟動→隱藏→初始方向→初始大小→等待時間→重複克隆自己【克隆自己→時間間隔】
2 作為克隆體啟動的時候,實現從上往下飛,飛行途中碰到子彈會消失,碰到最底部邊緣也會消失
3 當收到發射炸彈時,會消失
當收到發射炸彈→將得分增加1→刪除克隆體
4 當收到遊戲結束時,停止遊戲
當接收到遊戲結束→停止該角色的其它指令碼
5.4、其它敵機
其它敵機的程式流程可以參考敵機2 的流程,出來的時間比敵機2晚點,血量、移動速度、得分請參考前面的角色分析。
5.5、子彈
子彈將會有兩條積木指令並行執行,具體分析如下:
1 程式啟動時候,實現自我克隆(不斷髮射子彈)
程式啟動→隱藏→初始方向→初始大小→重複克隆自己【克隆自己→時間間隔】
2 當作為克隆體啟動時,實現子彈的發射
5.6、炸彈
炸彈我們這邊設定了5條積木指令並行執行,具體分析如下:
1 自定義積木,由於多處用到炸彈的初始位置和出現時間間隔,所以設定成自定積木,簡化積木的冗餘
定義初始炸彈→隱藏→時間間隔(炸彈多久出現一次)→初始位置→顯示
2 程式啟動時,炸彈初始化以及下落的過程
3 程式啟動時,實現我們炸彈一閃一閃若隱若現的效果
程式啟動時→不斷若隱若現【將虛像特效設為0→時間間隔→虛像特效設為100→時間間隔】
4 當按下空格鍵,發射炸彈
5 當接收到遊戲結束,停止角色的指令碼
當接收到遊戲結束→停止改角色的其它指令碼
5.7、遊戲結束
遊戲結束設定了2條積木指令並行執行,具體分析如下:
1 程式啟動時,隱藏(開始的時候不顯示)
程式啟動→隱藏
2 接收到遊戲結束時,顯示
當接收到遊戲結束→移到舞臺中央→顯示
5.8、背景
背景同樣設定了2條積木指令並行執行,具體分析如下:
1 程式啟動時,重複播放背景音樂
程式啟動→【播放背景音樂】
2 接收到遊戲結束時,停止其他指令碼
當接收到遊戲結束→停止該角色的其它積木指令
六、用到指令
6.1、運動模組
- :角色移動指定的步數,正數就是向前,負數就是向後
- :將角色移動到舞臺中央指定的X/Y座標位置,預設座標(x:0,y:0)
- :將角色朝向指定的角度
- :將角色的Y座標也就是縱向增加指定的值,正數朝上,負數朝下
- :角色碰到邊緣後就會以垂直邊緣為中線的對稱角度進行反彈
- :旋轉方式有三種模式,分別是:左右翻轉(正常向左向右)、不可旋轉(不能旋轉)、任意旋轉(朝任何角度旋轉也是預設旋轉方式)
- :獲取當前角色X的座標值
- :獲取當前角色Y的座標值
6.2 外觀模組
- :說一句話,並在舞臺上顯示一定的時間
- :將角色的大小設定為指定的值,這裡面的大小指的是百分比
- :這是設定角色的特效值,特效分別有顏色、魚眼、旋渦、畫素化、馬賽克、亮度和虛像。我們這個案例中要用到的是虛像。
- :將角色顯示在舞臺上
- :將角色不顯示在舞臺上
6.3 聲音模組
- :播放某個聲音並等聲音播放完成在執行後面的積木指令
6.4 事件模組
- :程式啟動之後,點選小綠旗,執行後續的程式指令碼
- :獲取到鍵盤上指定的按鍵被按下的訊息,預設的是空格鍵,下拉三角可選擇字母a-z的26個鍵、數位0-9的10個鍵、上下左右方向鍵以及任意按鍵。
- :當接收到某個訊息的時候,執行後續的積木指令
- :向所有的角色傳送一個訊息,同時執行後面的積木指令
6.5 控制模組
- :時間間隔,等待指定的時間後執行後面的指令
- :一直重複執行積木框裡面的積木
- :條件判斷,如果條件為真,那麼執行積木框裡面的積木,在執行後面的積木;條件為假,框裡面的積木不執行,執行後面的積木
- :停止指令碼執行,下拉可選項有停止全部指令碼、這個指令碼和該角色的其他指令碼
6.6 偵測模組
- :是否碰到滑鼠指標,下拉可選項還有舞臺邊緣和其它角色
- :獲取滑鼠的X座標值
- :獲取滑鼠的Y座標值
- :獲取舞臺的背景編號、背景名稱、音量、變數名稱;或者是角色的X座標、Y座標、方向、造型編號、造型名稱、大小、音量和變數名稱
6.7 運算模組
- :加法運算,兩個參賽相加;參賽可以是具體的數值,也可以是其它變數或者系統變數,或者其它參數列達式
- :在某個區間中隨機產生數值,可以是整數也可以是小數
- :邏輯判斷模組,判斷前面的值是否大於後面的值,大於返回邏輯值真,否則返回假
- :邏輯判斷模組,判斷前面的值是否等於後面的值,等於返回邏輯值真,否則返回假
6.8 變數模組
- :新建變數,彈出框中輸入變數名稱,可以選擇適用所有角色和僅適用當前角色
- :將指定的變數設為指定的值
- :將制定的變數增加制定的值
- :獲取變數的值,前面方框有打鉤就會在舞臺上顯示,沒有選中就不會顯示在舞臺上
6.9 自制積木模組
- :定義一個新的積木,彈出框中輸入積木名稱,還可以設定自定的積木是否需要帶有輸入項
- :自己定義的某個積木
七、程式指令編寫
7.1、戰鬥機
- 點選小綠旗,程式啟動執行後面的積木指令
- 戰鬥機的初始大小
- 設定戰鬥機的初始朝向
- 將旋轉方式設定為左右翻轉
- 初始化得分變數(得分是一個全域性變數,所有角色都可用)
- 戰鬥機一直左右移動,重複執行第7-10個積木指令
- 將戰鬥機跟隨滑鼠移動,由於只能左右移動,所以只要設定X座標跟隨滑鼠的X座標即可
- 設定戰鬥機碰到邊緣後反彈
- 判斷戰鬥機是否碰到敵機,由於敵機有多種型號,所以需要通過邏輯或運算將每種敵機都列出來,如果碰到了則執行第10個積木指令
- 向所有角色廣播一個遊戲結束的訊息。
- 當接收到遊戲結束的訊息,執行後續積木指令
- 停止改角色的其它指令碼
- 說:我還會在回來的一句話,並顯示3秒鐘
- 停止案例的所有指令碼
7.2、敵機1
- 程式啟動後,執行後面的積木指令
- 將敵機本體隱藏
- 初始朝向
- 初始大小
- 不斷克隆自己,產生新的敵機1(重複執行第6-7個積木指令)
- 克隆自己
- 時間間隔2秒鐘後在克隆
- 當接收到遊戲結束時,執行後面的積木指令
- 停止該角色的其它指令碼
- 當接收到發射炸彈時,執行後面的積木指令
- 將得分變數增加1
- 刪除當前克隆體
- 當作為克隆體啟動時,執行後面的積木指令
- 初始化敵機的位置,在舞臺的上方Y=150,橫座標採用亂數的方式
- 將敵機顯示在舞臺上
- 將敵機1的血量設為1
- 敵機朝戰鬥機飛來,重複執行第18-25個積木指令
- 敵機1飛行的速度,每次向下飛行3畫素
- 判斷飛行途中是否碰到舞臺邊緣,如果是執行第20個積木指令
- 刪除當前克隆體
- 判斷飛行途中是否碰到子彈,如果是執行第22個積木指令
- 將敵機的血量減少1
- 判斷敵機的血量是否等於1,如果是執行第24-25個積木指令
- 將得分變數增加1
- 刪除當前克隆體
7.3、其它敵機
- 其它敵機和敵機1的程式差不多,不同的地方在於上圖示注的1-6
- 1是敵機1不存在的,後面的敵機都有一個出場的時間,敵機越厲害的會越晚出場,時間間隔相差一點
- 2是敵機每次出現的頻率,同樣越厲害的頻率就會越小
- 3是擊毀敵機得到的分數,越厲害的敵機擊毀後得分越多
- 4是敵機的血量,越厲害的敵機血量越多
- 5是敵機飛行的速度,血量越多的敵機飛行的越慢
- 6和3是一樣的
7.4、子彈
- 程式啟動後,執行後面的積木指令
- 將子彈本體隱藏
- 初始朝向
- 初始大小
- 不斷克隆自己,產生新的敵機1(重複執行第6-7個積木指令)
- 克隆自己
- 每間隔0.3秒鐘就克隆一次
- 當作為克隆體啟動時,執行後面的積木指令
- 由於子彈石油我們戰鬥機發射出去的,所以我們將子彈的X座標設定為戰鬥機的X座標,子彈的Y座標設定為戰鬥機的Y座標加上一個數值33,這樣子彈出現的位置就在戰鬥機機頭的位置,這樣比較符合我們的案例
- 將子彈顯示在舞臺上
- 子彈向敵機飛去,重複執行第12-17個積木指令
- 子彈飛行的速度,每次向上飛行3畫素
- 判斷子彈飛行途中是否擊中敵機,如果是執行第14-15個積木指令;由於敵機有多種型號,所以每個型號的敵機都通過邏輯或將他們列出來
- 非常短暫的間隔(刪除之前,沒有這個間隔,有可能在敵機的程式模組裡面碰到子彈要扣血量時候有可能沒有扣,因為如果角色刪除了,與刪除的角色有關的指令是不會執行的)
- 刪除當前克隆體
- 判斷子彈是否碰到舞臺邊緣,如果是執行第17個積木指令
- 刪除當前克隆體
7.5、炸彈
- 程式啟動後,執行後面的積木指令
- 炸彈掉落的同時若隱若現一閃一閃的效果實現,重複執行第3-6個積木指令
- 將虛像特效設為0
- 時間間隔0.1秒
- 將虛像特效設為100
- 時間間隔0.1秒
- 當按下空格鍵的時候,執行後續的積木指令
- 如果炸彈的數量大於0,執行第9-10個積木指令
- 將炸彈數量減少1
- 向所有的角色傳送廣播訊息「發射炸彈」
- 自定義積木模組「初始炸彈」
- 將炸彈隱藏
- 炸彈出現的頻率,每隔15秒出現一次
- 炸彈出現的初始位置,在舞臺上方Y=160,橫座標隨機
- 將炸彈顯示在舞臺上
- 程式啟動後,執行後面的積木指令
- 初始炸彈(參照自定義積木,設定炸彈的初始資訊)
- 炸彈的初始大小(當然我們也可以把這個初始大小寫到自定義積木初始炸彈裡面,只是我們炸彈的初始大小不需要每次都進行設定,後面還會多次用到初始炸彈這個自定義積木)
- 設定炸彈的初始數量0
- 炸彈從舞臺上方往下落,重複執行第21-28個積木指令
- 炸彈下落的速度2畫素
- 判斷炸彈下落途中是否碰到舞臺邊緣,如果是執行第23個積木指令
- 初始炸彈(參照自定義積木,設定炸彈的初始資訊)
- 判斷炸彈下落途中是否碰到子彈,如果是執行第25-26個積木指令
- 將炸彈數量加1
- 初始炸彈(參照自定義積木,設定炸彈的初始資訊)
- 當接收到遊戲結束時候,執行後續的積木指令
- 停止當前角色的其它積木指令
7.6、遊戲結束
- 程式啟動後,執行後面的積木指令
- 將Game Over隱藏起來
- 當接收到遊戲結束時,執行後續積木指令
- 將Game Over移到舞臺中央
- 將Game Over顯示在舞臺上
7.7、背景
- 程式啟動後,執行後面的積木指令
- 重複播放背景音樂,重複執行第3個積木指令
- 播放背景音樂,並等待音樂播完在執行後續積木指令
- 當接收到遊戲結束時,執行後續積木指令
- 停止該角色的其它積木指令
八、知識點回顧
- 掌握座標軸和座標值的概念及使用
- 掌握條件判斷語句的使用
- 掌握訊息傳送和訊息處理機制
- 熟練掌握變數的定義和使用
- 學會使用自定義積木,實現減少程式碼冗餘
- 熟練掌握碰撞檢測機制,理解多角色之間是如何進行碰撞的
- 充分理解並掌握運算模組中亂數、邏輯判斷及邏輯或的使用
- 學會將複雜的程式流程簡單化,學會分析問題和解決問題
九、拓展思維
- 優化我們的遊戲案例
- 新增子彈擊中敵機音效
- 新增戰鬥機被撞毀的音效和視覺效果
- 新增炸彈爆炸的音效和視覺效果
- 新增遊戲結束時的音效
- 思考如何實現敵機發射子彈
- 思考如何實現敵機左右隨機移動
- 新增更厲害的敵機
- 達到一定分數得時候新增敵機BOSS,讓遊戲更加豐富
- 新增不同的子彈效果,實現更豐富的遊戲體驗