程式設計與實體運算
課程總覽
教學軟體:Scratch、code.org
課程規劃:
聲控遊戲/5
樂透抽籤機/5
空戰 1942/8
單元ㄧ:魔幻水族箱
單元二:聲控遊戲
利用音量變化來控制遊戲中的主角作出相應動作,稱為「聲控遊戲」,與鍵盤滑鼠的控制不同,音量的控制需要天份,一般人很難達到純熟,也因此聲控遊戲玩起來特別有趣和刺激。
在電腦開發聲控遊戲必須先設置好麥克風,或者是其它能夠收集聲音的裝置,例如:視訊鏡頭。
在製作遊戲之前,請點擊連結試玩遊戲:https://e.meps.tp.edu.tw/scratch/sound%20fly .html
收集聲波資料
在 Scratch 中可以透過「偵測」類積木中的「聲音響度」取得目前的環境音量。如果要在「舞台」上繪製聲波圖,我們必須要收集「聲音響度」儲存到「清單」中,然後再用「畫筆」積木繪製出來。
「清單」也是「變數」的一種,是用來記錄一群資料所使用的結構,所有的資料都被以相同的變數名稱存取,但是大家依照順序排序,所以每一個資料項目都有一個索引值,只要指定要存取的索引值就可以從清單中取出或存入資料項目。
當我們將「聲音響度」儲存進清單時,越早存入的資料其索引值就越小,所以當要刪除過時的資料時,必須從第一筆開始刪除,而第二筆資料就會自動遞補為第一筆。這種先儲存的資料先刪除的做法稱為「先進先出法」(FIFO,First In First Out)。
步驟一:
建立一個空白的角色,命名為「聲波圖」,這個角色只用於繪製聲波圖,所以不需要造型。
建立一個清單,命名為「聲波」。
首先將清單內的所有資料清空,以避免反覆執行時,上ㄧ次的資料會遺留在裡面。
接著使用一個「重複無限次」迴圈開始收集資料,檢查資料項目是否超過 480 筆,如果是則將超過的舊紀錄刪除。
之所以只保留 480 筆資料,是因為「舞台」的寬度是 -240 ~ 240,只有 480 個點。
擴展積木與函式積木
在 Scratch 中有三種程式積木可以使用,分別是:預設積木、擴展積木、函式積木。
預設積木:也就是 Scratch 所提供的基本積木,依照功能分為:動作、外觀、音效、事件、控制、偵測、運算、變數等 8 類,並以不同顏色區分以方便閱讀和尋找。
擴展積木:Scratch 可以透過擴展套件來取得新積木,這些擴展套件是開發者或廠商為了讓 Scratch 可以獲得額外功能、連接外部網路、單晶片或物聯網裝置而設計的,在本單元中所使用的「畫筆」積木就是屬於擴展積木。
函式積木:Scratch 允許設計者可以自行創建函式積木,五年級學過了。
「畫筆」積木是 Scratch 的擴展積木,可以從右下角的「添加擴展」。
繪製聲波圖
步驟二:
建立一個變數「掃描線」,用來記錄清單「聲波」目前的索引值。這個變數請設定成「僅適用當前角色」。
建立一個函式積木,命名為「畫聲波」,記得將「執行完畢再更新畫面」勾選起來。
首先將「筆跡全部清除」,將畫筆(即目前的角色)定位到螢幕的左側邊緣,將變數「掃描線」歸零。然後再下筆。
請使用一個「重複 480 次」的迴圈,將掃描線加ㄧ,並從清單「聲波」讀取相對應的資料,也就是從第一筆開始讀,直到第 480 筆。
由於「聲音響度」數值範圍是從 0 ~ 100,沒有負數。所以繪製出來圖形不像聲波圖,可以把「聲音響度」數值乘以 -1 來模擬。
迴圈執行完畢後,使用「停筆」積木停止繪圖功能。
這裡我們繪製的聲波圖,其實不是真正的聲波圖。真正的聲波圖除了聲音響度(聲音震動的幅度)以外,也會收集聲音振動的頻率,而形成複雜的波形。
步驟三:
將剛剛定義好的「畫聲波」積木,插入到主程式中,一邊繪製聲波圖,一邊收集聲音響度,如右圖。
請測試執行結果是否與預期相同。
用音量控制飛行貓
步驟四:
切換到小貓角色的造型分頁,新增 Scratch 內建的「Cat Flying」造型,並將原有的兩個造型刪除。將角色名稱修改為「飛行貓」。
設定飛行貓的迴轉方式、起始位置和角度,然後進入遊戲迴圈。
我們需要一個變數「高度」,用來計算和儲存飛行貓上升或下降的幅度,請勾選「僅適用於當前角色」。
以 20 分貝為基準,當音量大於 20 分貝就增加高度,小於 20 分貝就降低高度。將聲音響度減掉 20 以後,還必須除以 3,讓高度變化不要太劇烈,你可以試試看除以 1 或 2 的效果,這個數字是可以依照個人喜好自由調整的。
將飛行貓的 Y 座標,依照計算出來的高度增減(高度為負數時,就是減少),注意不要讓飛行貓飛出舞台的範圍,也就是說,Y 座標要介於 -160 ~ 160 之間,考慮到舞台上方要顯示目前的生命值和飛行距離,所以略為下降到 125 左右。以上數據僅供參考,你必須根據自己飛行貓的大小和變數顯示的方式來調整這些數字。
為了讓飛行貓表現出往上飛和往下飛的動態,我們也可以修改飛行貓的旋轉角度,朝右平飛是 90 度,而當變數「高度」為正數時,角度必須往上傾斜,也就是角度必須小於 90 度,「高度」為負數時,必須往下傾斜,也就是角度必須大於 90 度,因此是用 90 度減去高度變化。為了讓角度變化看起來比較明顯,會先把「高度」乘以 3,然後再用 90 去減。與前面相同,要不要乘以 3,還是要乘多少,可以自由調整。
請測試執行結果是否滿意,如果不滿意請調整以上數學算式裡的相關數據。
捲軸動畫-背景水平捲動
我們的飛行貓雖然 Y 座標會變化,但 X 座標始終固定在舞台上同一個位置。如果要表現出往前飛行的動畫效果,我們就必須移動背景才行。你可以想像背景圖是一張很長的圖片超過舞台的寬度,而我們只能看到出現在舞台的部分。
由於 Scratch 並不允許造型的寬度超過舞台太多,因此只能使用多個角色,或多個分身來接圖。底下的範例將使用分身來接圖。
步驟五:
首先,繪製舞台背景,只需要單純的天空色和太陽。太陽使用內外漸層,內部為橘黃色,外部為透明。
建立一個新的空白角色,命名為「背景」。切換到造型分頁,先畫出矩形,然後使用「塑形」工具拉出山脈的形狀。這樣的造型需要兩個以上,請注意靠近舞台邊緣的地方,必須調整山脈的高度讓它可以跟下一個造型的山脈銜接在一起。
注意到舞台左下和右下各加一個點,以保證造型移動到舞台邊緣時可以無縫接圖。
Scratch 為了防止角色不小心移出畫面,所以當角色邊緣靠近舞台邊緣時,座標會被凍結。加兩個點讓角色邊緣變大,就可以讓這個機制延後發生作用。
本體與分身
分身是本體的複製版本,跟直接複製角色不一樣的地方有三個:
分身可以跟本體共用造型和音效,而不需要反覆載入相同的造型和音效檔,所以可以節省記憶體使用量。如果直接複製角色,則複製的越多越浪費記憶體。
分身可以跟本體執行不一樣的程式,也就是設計程式時,可以同時寫兩份程式碼,一份給本體執行,一份給所有的分身執行。如果是直接複製角色,則必須針對不同角色編寫不同程式。
分身只在程式執行期間存在,當結束所有程式時,會自動被註銷。複製的角色則會永遠存在,除非手動刪除。
為了在分身與本體之間分配程式碼,請使用「當分身產生時」積木,把程式碼指派給分身執行(本體不會執行這一段程式)。要給本體執行的程式,請使用「當綠旗子被點擊」積木(分身將不會執行這一段程式)。如果使用「當收到訊息...」積木,則無論本體或分身都會執行該程式。
「分身刪除」積木的作用是將自已刪除,所以必須分配給分身執行才會有效果。如果以後還會用到這個分身,可以直接使用「隱藏」積木,而不需要刪除,等到要用到時再「顯示」就可以了。如果確定不會再用到它,則可以在遊戲結束之前直接刪除,以便進一步減少記憶體的使用量。
步驟六:
建立變數「背景圖位置」和「顯示位置」,請設定為「僅適用當前角色」,這樣可以讓每個分身都擁有自己的同名變數。
建立變數「主角位置」和「速度」,都是「適用所有角色」。前者用來設定主角飛行貓目前在整張拼合的背景圖中的位置,後者則是飛行貓的飛行速度,其實也就是背景捲動的速度。
角色「背景」(不是舞台背景)本體是不需要顯示的,因此先隱藏起來。設定第一個分身的造型和位置,然後「建立自己的分身」。如果要往左捲動,那麼下一張圖片應該接在第一張圖片右邊 480 的位置。
反過來說,如果是要向右捲動,那麼下一張圖片位置就是 -480。
捲動背景圖
介紹捲動最簡單的方法,將所有圖片(所有的分身)同時一起向左移動「速度」點,當圖片往左移出舞台外面時( X 座標為 -480),將圖片接回到舞台的右側( X 座標為 480)。
這個方法雖然簡單,但是有底下三個缺點:
由於程式並未計算「主角位置」與「背景圖位置」的距離,因此當主角在舞台上的位置移動時,背景圖不會自動移到相對應的位置。(好險,在本作中雖然我們的背景圖沿著 X 座標移動,但並不會改變主角 的 X 座標,所以這個缺點不起作用!)
如果將「速度」設定為負數(往右捲動時),背景圖不會自動接圖,因為沒有判斷背景圖移出舞台右側( X 座標為 480)的情形。(在本作中,由於背景都是從右向左移動,並不會改變方向,所以沒有問題。)
程式並未考慮背景圖片超過兩個舞台寬度的情形。
補充教材
加入敵人
只有飛行貓自己一個人太寂寞了,我們來增加一些敵人。首先,建立兩個「適用所有角色」的全域變數,分別是「生命」和「距離」,用來儲存玩家的剩餘生命和累計飛行距離。記得在飛行貓的程式裡,設定「生命」的起始值,例如:「變數生命設為 5」。
我們將利用「生命 < 1」當作遊戲迴圈的結束條件,請將上面的所有程式中有使用「重複無限次」的迴圈,通通改成「重複直到 生命 < 1」。
在飛行貓的程式中,請在「重複直到 生命 < 1」迴圈中將「距離改變 1」,用來統計目前的飛行距離。
建立新角色「敵人」,找一些適合的造型當作敵人,如下圖。在敵人角色中,建立新的變數「敵人速度」,並設定成「僅適用目前角色」,這樣可以讓所有的敵人分身都擁有「敵人速度」這個變數。
敵人在飛行距離到達 500 以後才會出現,出現的敵人數量為飛行距離 500的倍數,例如:當距離為 1000 以上會同時出現兩個敵人。
敵人向右飛行,碰到邊緣時就刪除,碰到玩家時,將玩家生命減 1,並且刪除分身。
加入輔助道具
有了敵人之後,我們也加入可以補命的輔助道具。
建立新角色「生命」,使用 Scratch 內建的「heart red」愛心造型,如右圖。
愛心出現的間隔時間為 8 秒,這個可以自由修改。
愛心的飛行速度是飛行貓的 3 倍,這個數字也可以自由修改。
進階捲動程式
計算背景圖與主角的距離,並儲存到變數「顯示位置」中,「顯示位置」就是背景與主角此刻的相對位置。
計算「顯示位置」除以背景圖總寬度的餘數。如果角色「背景」有兩個造型,則總寬度為 480 x 2 = 960。假設「顯示位置」為 1200,因為 1200 已經超出背景圖總寬度 960,而超出部分是 240(餘數為 240)。也就是說主角已經位於循環一次的背景圖中 X 座標為 240 的位置。
如果要讓背景圖向左或向右捲動都能正常執行,那麼一開始就必須在第一個造型的左右兩側各準備一個分身,如果有兩個造型就需要三個分身。
或者我們可以這樣想,一開始主角就是在第二個造型中,這樣主角就可以向左回到第一個造型,或向右走到下一個造型。因此,把整張背景圖往左邊一個舞台寬度擺放就可以了,這就是餘數還要 - 480 的原因。好處是我們不用多準備一個分身。
當主角移動時,無論是往左或往右,都能正確匹配主角與背景圖。
請將右側的程式,加到飛行貓「重複無限次」迴圈中。
為了向左、向右都可以捲動,需要準備三個分身,或者是把整張背景圖向左移動一個畫面。
加入前景捲動動畫
如果要讓背景更有立體感,我們可以加入前景,前景捲動速度應該比背景更快,這樣整個舞台空間會更有層次。前景的做法與背景差不多,我們將準備背景兩倍數量的造型,這是因為我們希望前景捲動速度快兩倍,因此造型的消耗速度也就會快兩倍,一開始就準備足夠的造型才能應付需求。
這次要產生四個分身,可以考慮用「重複 4 次」的迴圈來處理。
另外顯示位置是「背景圖位置」減去「主角位置」的兩倍距離。這樣捲動速度就會變成兩倍。
單元三:樂透抽籤機
共同討論:
小朋友你們有參加過大賣場舉辦的摸彩活動嗎?大家都是如何提高得獎機會?
如何保證摸彩的公平性呢?
參考答案
1.每人限投一張。
2.規定折疊方式。
3.抽獎前必須攪拌10秒。
4.彩劵應該裝在圓形容器裡抽出。
基本款抽籤機
電腦抽籤比較公平:避免人為操控、抽中機率接近公平(隨機數的特性:抽籤次數越多越公平)
製作抽籤機程式時,為了適應各班人數不同,抽籤範圍應該由使用者自行輸入
此程式共需要三個角色,佈置如右。
步驟一:
新增一個角色到舞台上負責與使用者互動,範例使用機器人角色
機器人提問:全班有幾人?
建立變數「抽中」用來儲存抽籤結果
把使用者輸入的答案作為隨機數的上限
步驟二:
建立動畫角色【十位數】,造型為數字 1~9、0(0 排在第10個),把造型命名為所代表的數字。
將動畫角色【十位數】複製一份作為【個位數】
隨機顯示數字,重複20次
最後一次需顯示成變數「抽中」所代表的數字
十位數:抽中除以10取整數
個位數:抽中除以10的餘數
十位數
個位數
步驟三:
修改【機器人】角色的程式,
當點機器人一下就可以重新抽籤
(跳過提問和回答的程序)
實體運算
如果不使用電腦,也能公平地抽籤嗎?
分組討論:
只有一顆骰子要如何隨機抽出班上任一位同學?
當問題很複雜時,我們可以嘗試簡化問題降低難度,例如:
從 2 個人中抽 1 個,怎麼辦?
如果是從 3 個人中抽出其中 1 個,又有甚麼方法呢?
老師歸納解法,關鍵在於將骰子點數分組以便匹配人數。
參考答案
人數比骰子點數少時,可以將骰子點數分組,例如:1、2、3 一組,4、5、6 一組,抽到第一組就是第一個人,抽到第二組是第二個人。
3 個人時,骰子分三組,例如:1、2 第一組,3、4 第二組,5、6 第三組。
分組討論:
如果是從 12 個人中抽出其中1個,又有甚麼方法呢?
參考答案
人數比骰子點數多時,可以將人員分組,例如:1~6 號一組,7~12 號一組。
骰子丟兩次,第一次若為奇數抽中第一組,若為偶數抽中第二組。第二次抽人,為該組裡第幾個人。
回到原來的問題:
只有一顆骰子要如何隨機抽出班上任一位同學?
由於班上同學人數無法剛好分成六個人一組,所以需要例外處理,如果抽中不存在的人,就必須重抽。
若第一次抽中 4,第二次抽中 3,如何知道實際上抽中的同學是誰呢?
參考答案
如果是 1,1,是第一組第一個人,也就是抽中 1 號
如果是 2,1,是第二組第一個人,也就是抽中 1+6=7 號(因為一組有 6 人)
如果是 3,1,是第三組第一個人,也就是抽中 7+6=13 號
如果是 4,1,是第四組第一個人,也就是抽中 13+6=19 號
所以 4,3,就是抽中 21 號,全班的第 21 位同學。
假設第一次抽中的是 X,第二次抽中的是 Y,如何把剛剛的討論結果轉換成演算式?
參考答案
(X-1) * 6 + Y
如何將序號轉換成座號呢(假設男生從 1 號開始,女生從 21 號開始)?
參考答案
方法ㄧ:
假設男生人數為 14,抽中號碼小於或等於 14 則不需要換算,抽中等於座號;如果抽中是 15,轉換成座號就是 21 號。
抽中之序號若為 X,則座號就是 (X - 14) + 20
如果把男生人數改為 A,女生的座號從 B 開始,則
座號 = (X-A) + (B-1)
如果把變數改成中文,也就是
座號 = (抽中 - 男生人數) + (女生起始座號 - 1)
方法二:
計算中間沒有人的空號 21-1-14 = 6(從 15 號到 20 號有 6 個號碼是空號)
如果抽中為 X 而且「抽中>男生人數」,則座號就是 X + 6
如果把男生人數改為 A,女生的座號從 B 開始,則
座號 = X + (B-1-A)
如果把變數改成中文,也就是
空號 = 女生起始座號 - 1 - 男生人數
座號 = 抽中 + 空號
方法三:
如果想要節省計算的時間,也可以事先製作「序號與座號對照表」,利用「查表法」來求得答案。
跳號抽籤機
任務:將上上一節課完成的基本款抽籤機,該成通用型抽籤機
(本校任何一個班級都能使用,女生座號都是從 21 號開始)
步驟一:
將提問從「全班有幾人?」,改成「全班有幾個男生?」和「全班有幾個女生?」
新增變數「男生」、「女生」、「總人數」
計算全班總人數,並以總人數做為隨機取數的上限
步驟二:
取得隨機數後,先檢查抽中是否大於男生人數
若是,則按照前一節課的討論換算成座號
補充教材:查表法
假設總人數為 29 人,我們需要 29 個抽屜,依序將全班同學的座號寫在紙上放進抽屜裡
當抽中 22 號時,把第 22 個抽屜打開,看看座號是幾號就可以了
在 Scratch 裡面,剛剛講的抽屜也就是前面介紹過的「清單」。
程式設計步驟:
使用清單時,必須先「初始化」,也就是將所有項目清空
把變數「流水號」設定成男生與女生的起始座號
依序把流水號放入清單「座號表」中
每放入一個座號就必須把「流水號」加 1,讓流水號變成下一個座號
抽籤時上限改為清單的長度,因為清單長度就是所有座號的總數量
將座號表中抽中的項目取出來,儲存到變數「座號」中,注意:「十位數」和「個位數」兩個角色中的變數「抽中」(序號)必須改成變數「座號」。
單元四:空戰 1942
「1942」是卡普空(Capcom Co.)在1984年推出的大型電玩平台縱向捲軸射擊遊戲,隨後也被移植到任天堂紅白機、PC-8801等平台。2008年在 Xbox Live Arcade 與 PlayStation Network 發售重製版《1942:聯合打擊》(1942: Joint Strike)。
遊戲是使用八方向控制美式戰鬥機,有兩顆按鈕分別控制「射擊」和「空中迴旋」,為了降低製作難度,此單元將改成四方向鍵盤操作,保留「射擊」功能,忽略「空中迴旋」機制,並將敵機縮減為兩種,同時取消 Boss 敵人、海上船艦、地面坦克、強化武器包、能量補充包......等遊戲內容。
請連結到遊戲素材包,使用「改編」功能建立自己的遊戲副本。
縱向捲軸動畫-背景垂直捲動
「縱向捲軸動畫」與前面單元「聲控遊戲」學過的橫向捲軸動畫差不多,這一次有比較多的背景圖片,所以需要額外的程式碼進行以下控制:
背景一「航空母艦」只在遊戲開始時出現一次。
所有背景使用隨機數決定顯示順序。
與前面單元不同的地方是在製作完背景分身後,才使用廣播訊息「遊戲開始」進入遊戲,這樣可以精確控制程式的執行順序,以避免「當綠旗子被點擊」同時執行多個程式時,容易產生無法預期的結果。
分身程式與前面單元相比,多了紅色框框中的積木,這一段程式碼會隨機選取背景圖片,作為下一個遊戲畫面,並且將第一張背景圖忽略掉。
玩家角色
玩家駕駛的美式雙螺旋槳戰鬥機,必須生命值和得分。請先建立兩個變數:「生命」和「分數」,設定為「適用於所有角色」,並顯示在舞台上。
遊戲開始時,將玩家角色顯示於舞台中央偏下的位置。
方向與射擊控制
在 Scratch 的「事件」積木中已經提供鍵盤按鍵的偵測功能,你可以直接使用這些積木進行鍵盤操作控制,缺點是切換按鍵時會有約「0.02」秒的延遲,例如:從向上移動切換為向右移動時,角色會稍微停頓。按下空白鍵時,則透過「等待 0.1 秒」來控制飛彈發射的間隔時間,才不會因為連續發射飛彈導致遊戲太過簡單。
如果想要改善鍵盤控制的流暢度,就需要額外的變數來記錄鍵盤按鍵狀態,請建立三個變數:「搖桿X」、「搖桿Y」、「射擊」,都設定為「僅適用當前角色」,並且將變數隱藏起來,不要顯示於舞台上。
在玩家的主迴圈中,先將變數「射擊」設為 0。
將「搖桿X」設為「向右鍵被按下」減去「向左鍵被按下」,當按下「向右鍵」時,為1 - 0 = 1,按下「向左鍵」時,為0 - 1 = -1,其他狀況為 0 - 0 = 0 或 1 - 1 = 0,也就是說變數「搖桿X」有 1、0、-1 三種狀態。
「搖桿Y」設為「向上鍵被按下」減去「向下鍵被按下」,三種狀態 1、0、-1 分別代表「向上鍵」、沒有按或抵銷以及「向下鍵」。
根據「搖桿X」和「搖桿Y」移動玩家角色,每次移動 4 點距離,這個數字可以自行調整。
當「空白鍵被按下」而且變數「射擊」等於 0 時發射飛彈。當變數「射擊」大於 5 時,將變數「射擊」歸零,以便重新累計發射時間。
「飛彈」是另外一個角色,我們可以透過建立分身的方式,製作出多個飛彈。當持續按下空白鍵的時候,會看到ㄧ整排飛彈往前飛行,爽快感破錶。
當「生命」小於 1 (玩家被摧毀)時,先隱藏角色,在遊戲結束前,顯示一段「玩家爆炸」的動畫效果。製作方式請參考附錄中的「爆炸特效」。
飛彈發射
如果持續進行射擊,就會同時有很多飛彈出現在舞台上,因此飛彈必須使用分身來製作。
請點選「飛彈」角色,當綠旗子被點擊」先將本體隱藏起來。
當分身建立時,將分身移動到玩家的位置,然後再顯示出來,飛彈速度可以自行調整,當飛彈碰到敵人或舞台邊緣,則將分身刪除。
「等候 0 秒」積木的作用是讓飛彈等到下次畫面更新時再刪除。在等待過程中,其它角色,例如:「敵人」和「大敵人」,可以同時偵測是否被飛彈擊中。
飛行音效
請點擊「玩家」角色,切換到「音效」分頁的話,可以試聽玩家角色的音效,是螺旋槳的聲音。反覆播放這個音效,直到玩家被敵人摧毀為止,也就是說重複到「生命」小於 1 的時候。
共用計時器
Scratch 提供的「計時器」是非常好用的功能,使用計時器來控制敵人出現的時間間隔,比起單純用「重複執行」的次數要更能適應個別電腦的運行速度。
左邊的程式,在新電腦上執行速度會變快,在舊電腦上執行會較慢,而導致遊戲難度不平均的問題。如果用這支程式來設定敵人出現的頻率,執行速度太快的話玩家甚至活不過 30 秒。
右邊的程式,則是根據計時器的秒數來執行,無論在什麼樣的電腦上執行速度都一樣,遊戲在不同電腦上執行會維持相同的難度。
然而,Scratch 的計時器只有一個,如果有兩種不同的敵人,出現頻率不同,該怎麼辦呢?
這種情況,我們可以併用變數和計時器來解決,想想看,如果我們有一個變數「秒數」,當計時器滿 1 秒鐘時,將「秒數」加 1 並「重置計時器」,然後再根據「秒數」進行頻率的判斷就可以了。
計算「秒數」除以 12 的餘數,當餘數為 0 時,「秒數」為 12 的倍數,例如:12、24、36......等等,這個時候就讓「大敵人」出現。
計算「秒數」除以 4 的餘數,當餘數為 0 時,「秒數」為 4 的倍數,例如:4、8、12、16......等等,這個時候就讓「敵人」出現。
請將右側程式放置於「舞台」上。
兩種敵人角色
第一種敵人是零式戰鬥機,會從舞台上方出現,同時出現 1~4 台戰鬥機朝下飛行,飛機的大小為 24,所以我們取一個適當的間隔 30,依照這個距離來放置戰鬥機。將圖層移到最上層,避免被背景圖片蓋住。戰鬥機移動速度設為 2,比玩家角色慢一些,如果想修改這個數字,請不要超過 4,以免遊戲難度過高。
敵機登場後會追蹤玩家的位置,並隨機發射子彈攻擊玩家,同時也必須檢查敵機是否被飛彈擊中?是否撞到玩家?是否飛出舞台外面?
我們可以利用隨機數來計算追蹤玩家與發射子彈的機率,例如:「隨機取數從 1 到 50」等於 1,意思是有 50 分之 1 的機會;「隨機取數從 1 到 200」等於 1,意思是有 200 分之 1 的機會,這個機率可以自行調整,請務必測試效果如何,避免遊戲難度過高或過低。
由於敵機有時候會同時出現數架, 如果這些敵機同時發射子彈,子彈必須移動到發射者的位置上才可以顯示出來。我們要如何紀錄每一架敵機的位置呢?如果使用變數的話,我們並不知道需要多少變數才夠用,這個時候正是「清單」派上用場的好時機。
請建立一個清單「子彈」,用來儲存戰鬥機發射子彈時的位置,第一項資料為 X 座標,第二項資料為 Y 座標。
敵機的爆炸特效,請參考附錄的說明。
第二種敵人是飛龍重型轟炸機,會從舞台下方出現朝上飛行,飛機出現的位置使用隨機數決定。請建立一個新變數「健康」,用來設定大型轟炸機的硬度,也就是被飛彈擊中直到擊沈所需的次數。這個數字可以自行調整。
轟炸機的飛行高度比較低,所以不會與玩家發生碰撞,移動速度較慢,設為 1,發射子彈的機率比較高,設為 100 分之 1。被飛彈擊中時,將「健康」減去 1,當「健康」為零時轟炸機被擊沈,得到的分數為戰鬥機的 5 倍。
敵機的爆炸特效,請參考附錄的說明。
子彈發射
請點擊「子彈」角色,切換到「程式」頁面。「當綠旗子被點擊」時,先將清單「子彈」清空,以便重新開始遊戲。先將角色的本體隱藏起來。
子彈角色的主迴圈中,檢查清單「子彈」的長度,如果為零,表示還沒有敵機發射子彈,這種情況需要繼續等待,一直到有子彈被發射為止。
當清單「子彈」有資料時,讀取清單中的第一項設定為子彈的 X 座標,然後刪除第一項資料,這時候原本的第二項資料會往上移變成是第一項資料,再次讀取清單中的第一項資料,然後設定為子彈的 Y 座標,並再次刪除資料。完成清單「子彈」的處理後,建立自己的分身。
當子彈分身產生時,將分身顯示出來朝玩家的方向的前進,速度可以自行調整,檢查子彈是否跑出舞台外面,或者是碰撞到玩家角色,這兩種情況都要刪除分身。
如果是碰到玩家角色,也必須將「生命」減去 1。
附錄:爆炸特效
素材包裡有附上兩個爆炸特效,「爆炸」是給敵人的戰鬥機使用,「大爆炸」則是給玩家和大型轟炸機使用。請點擊「爆炸」角色,切換到「程式」頁面。
為了記錄每一架爆炸的飛機座標,我們需要使用清單「爆炸」和「大爆炸」。
在零式戰鬥機的程式中,尋找被「飛彈」擊中和碰撞「玩家」的條件判斷,在「分身刪除」之前先將 X 座標與 Y 座標添加到「爆炸」清單。
在飛龍重型轟炸機的程式中,尋找被「飛彈」擊中的條件判斷,在「分身刪除」之前先將 X 座標與 Y 座標添加到「大爆炸」清單。
「敵人」角色的條件判斷
「大敵人」角色的條件判斷
請將「子彈」角色的「當綠旗子被點擊」程式碼,複製到「爆炸」和「大爆炸」中,然後點擊「爆炸」角色將清單的名稱從「子彈」修改為「爆炸」。撰寫「爆炸」角色的分身程式,由於爆炸角色有六個造型,所以要重複六次切換造型。注意:先將造型切換到最後一個造型再顯示出來,因為最後一個造型的下一個造型,就是第一個造型。
請點擊「大爆炸」角色將清單的名稱從「子彈」修改為「大爆炸」,並撰寫分身程式,直接複製「爆炸」角色的分身程式進行修改,要改的地方只有音效選單。
「爆炸」角色的分身程式
「大爆炸」角色的分身程式
與轟炸機的角色不同,玩家爆炸的效果,可以使用本體執行,畢竟玩家只有一個,其位置可以使用「定位到玩家位置」取得,不需要透過清單的輔助。而且兩者之間有一個很大的差異,轟炸機爆炸不應該結束遊戲,而玩家爆炸則需要。因此,不使用分身設計,比較容易控制結束程式的時間點。
點擊「大爆炸」角色後,複製分身程式的所有積木,在迴圈前面加入「定位到玩家位置」積木,在最後結束的地方,加入「結束全部」積木,結束整個遊戲。