封存課程
敲磚塊
電腦遊戲是遊戲的一種,而遊戲的主要成份有目的、規則、挑戰及互動,這些成分可以統稱為「遊戲性」。遊戲性就是一個遊戲之所以吸引人的原因,遊戲性可以帶來「脫離現實」的解放感,也導致有些人會沈溺於遊戲當中。
目的:在遊戲當中,我們都有明確性的目標。而在平時的工作和生活當中,我們未必有明確的目標,這也是很多人感到生活迷茫的原因。很多人是因為在生活當中沒有目標,所以就到遊戲這個虛擬世界裡去尋找目標。
規則:在遊戲當中,規則是相對固定的,而且你玩得越久,對規則就把握得越好,遊戲規則是公平的,只要努力總能獲得相應的回報。而在現實社會當中,卻未必都有公平的規則。
互動:只要玩遊戲就會有相應的收穫,例如:稱號、級別、得分、進度條、金幣、裝備。人與遊戲的互動,都是可以預期結果的。而現實世界卻不是可以預測的。
挑戰:所有遊戲都是自願參與的,當面對困難的挑戰時自己可以隨時退出,就算失敗了還可以重新挑戰,有充分的自主權。而現實生活卻不是這樣,總是有許多迫於無奈的事情,而且常常失敗了就沒機會重來。
以遊戲設計的角度來看,電腦遊戲可以簡單分成三個最基礎部分:遊戲內容(contents)、核心玩法(core gameplay)和遊戲系統(game system)。
遊戲內容是指遊戲的故事背景、環境設定、角色設計、配樂、音效、視覺藝術...等等內容,也就是遊戲所具備的文學與藝術成分。
核心玩法是指人與遊戲互動的方式,不同的玩法也會產生不同的遊戲類型,例如:探索、戰鬥、生產、建設、冒險任務、行商、歷史模擬......等等。
遊戲系統是指為了支持核心玩法所設計出來的遊戲機制,例如:探索時的地圖迷霧系統(沒去過的地方在地圖上只看到霧)、戰鬥時的勝負系統、生產時的環境適性加值系統、建設時的資材消耗系統......等等。
在這個單元我們要設計的是動作遊戲「敲磚塊」,遊戲規則如下:
目的:消除所有的磚塊
規則:控制反射板將鋼珠彈到空中撞擊磚塊,磚塊就會消失,清除所有磚塊就過關,如果沒接到鋼珠,遊戲就結束
互動:鋼珠擊中反射板的位置不同,反彈角度就不同,也可以想成反射板中間彈性最好,兩邊彈性較差,玩家透過練習可以控制鋼珠反彈到自己想要的角度,發展出遊戲技巧。
挑戰:遊戲中鋼珠速度會突然變快或突然變慢,考驗玩家的反應能力。不同關卡也有不同難度設計,例如:磚塊較多,排列較不規則。磚塊本身堅固程度也有不同,有的磚塊要敲兩次才會消失,有的磚塊敲不破。
從遊戲設計觀點來看,「敲磚塊」遊戲的三個基礎部分:
遊戲內容:必須要想一個故事來說明遊戲的背景,同時故事也決定了遊戲場景、提示訊息的樣式。
核心玩法:這是動作遊戲,玩家須擁有三項能力:預測鋼珠的位置、滑鼠控制能力、即時反應能力。
遊戲系統:已經在遊戲規則中討論過了,包含:速度突然變化、特殊磚塊設計、關卡難度增加...等要素。
佈置場景與角色
繪製舞台背景
開啟新專案,點選「舞台」,切換到「背景」分頁
新增三個能配合遊戲背景故事的場景。
新增一個新角色,命名為「防線」,,切換到「造型」分頁
在舞台下方邊緣繪製一條橫線,顏色不拘。外框為 20。
新增玩家角色
在角色窗格點選右下角的「新增角色」圓形按鈕,然後點擊「繪畫」
在向量圖模式下作畫,不要轉換到點陣圖
首先設定「填滿」顏色,不要外框。
使用「方形」工具,在舞台中央繪製一個扁扁的長方形,然後移動圖形對準舞台中央的準星符號,這個位置稱為旋轉中心。
點擊「角色窗格」中的「方向」,將旋轉方式改成「不旋轉」。
使用「重新塑形」工具,將長方形改為任意造型。
將角色命名為「玩家」。
新增球角色
「新增角色」,然後點擊「繪畫」。
在造型分頁,左側最下方點擊「選個造型」。
請挑選一顆球作為造型,顏色不要跟背景圖太接近,越顯眼越好。
點擊「角色窗格」中的「方向」,將旋轉方式改成「不旋轉」。
角色命名為「鋼珠」。
操控與反彈
控制玩家角色
我們打算使用鍵盤來控制玩家角色的移動,新增兩個變數「方向」和「移動」,兩個都設定為「僅適用當前角色」(私有變數)。
變數「方向」用來記錄目前的按鍵狀態,用「向右鍵被按下」- 「向右鍵被按下」,當按下「向右鍵」時,為1 - 0 = 1,按下「向左鍵」時,為0 - 1 = -1,其他狀況為 0 - 0 = 0 或 1 - 1 = 0,也就是說變數「方向」有 1,0,-1 三種狀態。
根據變數「方向」的按鍵狀態進行「移動」距離的修改。持續按下「向右鍵」或「向左鍵」會加速,放開按鍵則會減速 90%。
將 X 座標加上剛剛計算出來的「移動」距離。
完整程式如右。
發射鋼珠
鋼珠的起始位置是在舞台中央靠下的位置(0,-40),這是因為要把舞台的上半區域預留給磚塊。
遊戲開始時要向下發射鋼珠,為了增加樂趣,所以發射角度不要固定,使用隨機取數範圍是向下(180度)的左右各 20 度,也就是 160度 ~ 200度。
等候 1 秒讓玩家有時間準備,然後顯示鋼珠,因為切換關卡時會隱藏鋼珠,所以在這裡要讓鋼珠顯示出來。
然後是大家很熟悉的動畫程式。
按綠旗子執行程式,檢查程式運作是否正常,每次按綠旗子是否鋼珠發射的角度都不同呢?
碰到玩家時要反彈
為了簡化計算,我們假設鋼珠的反彈跟光線一樣屬於完全反射,那麼反射角度會等於入射角度
假設鋼珠的方向是 135 度,計算入射角為 180 - 135 = 45,因此反射角等於 45 度
使用「運算」積木來表示,就是「 180 - 鋼珠的方向」
如遊戲規則規劃反射板兩端彈性較差,我們以鋼珠敲擊反射板的位置偏離反射板中心點的間距,當成偏移角度。
使用「運算」積木表示為「 鋼珠的 x 座標 - (反射板的) x 座標」
把兩次運算結果加起來,就是「反彈角度」
碰到玩家就反彈
由於 Scratch 只提供「碰到邊緣就反彈」積木,沒有「碰到玩家就反彈」積木,我們必須要自己做一個函式積木。
新增函式積木時,請將「執行完畢再更新畫面」選項打勾。
當鋼珠「碰到玩家」時,先將「鋼珠」往上推到不會碰到玩家的地方,然後才可以反彈。這可以避免鋼珠卡在玩家造型裡面。
接著計算反彈角度並播放音效。
變更音效
切換到「音效」分頁
按左側窗格最下面的「新增音效」圓形按鈕,進入「範例音效」畫面
滑鼠移動到音效右上角的「Play」按鈕會聽到聲音,以這個方式挑選想要的範例音效
挑選好之後,不要忘記修改「播放音效」積木喔!
鋼珠到目前為止的完整程式如下:
為了讓不同關卡可以設定不同的鋼珠速度,我們需要新增一個「全域變數」(適用於所有角色)「速度」。為了方便測試,可以使用一個獨立積木先將此變數設為 5,點擊執行後,再將該積木移除。
勝負判斷
按綠旗子測試程式,練習玩家角色的操作技巧,應該會發現鋼珠碰到「防線」時不會結束遊戲。
在「碰到玩家就反彈」積木的下面,加入條件判斷,「如果...那麼」,條件為「碰到防線」。
播放遊戲結束音效,並停止「全部」程式。
測試鋼珠碰到「防線」後,鋼珠會不會隱藏並發出音效。
佈置關卡
Scratch 舞台大小為 480 * 360,下半個螢幕用來發射鋼珠和控制反射板,磚塊放置於螢幕上半部,也就是說有 480 * 180 的空間可以佈置關卡。由於磚塊的大小是 48 * 24,可以佈置一列 10 個磚塊共七列,合計 70 個磚塊,如下圖:
新增磚塊角色
「新增角色」,然後點擊「繪畫」。
將「填滿」改成鮮豔的顏色,彩度和亮度都拉到最右邊。
將「外框」改成「透明」,寬度會自動變成 0。
使用「方形」工具畫出矩形。
請使用「選取」工具(斜箭頭),把磚塊的中心點對齊旋轉中心。
調整磚塊的大小,並觀察造型的尺寸是否為 48x24。(如果想要在磚塊與磚塊中間留下拼合的縫隙,請將尺寸縮小為 44x20)
放置磚塊
建立一個新積木「放置磚塊」,添加輸入方塊「type」代表磚塊的造型編號(目前只有一個造型)。為了加快執行速度,將「執行完畢再更新畫面」打勾。
建立兩個私有變數(僅適用當前角色)「行」和「列」,用來控制磚塊擺放位置。
將變數「行」「列」換算成實際的座標。
磚塊寬度為 48,將「行」乘以 48,磚塊是從舞台左側邊緣往右擺放,最左邊的位置 X 座標是 -240,減掉磚塊中心點的位置 48 / 2 = 24,所以是 -264。
磚塊高度為 24,將「列」乘以 24,從舞台中央往上擺放磚塊,減掉磚塊中心點的位置 24 / 2 = 12,所以是 -12。
將磚塊切換到指定造型,稍後將會新增兩種不同造型。
建立分身。
放置多個磚塊
建立一個新積木「放置(num)個磚塊(type)」。
為了加快執行速度,將「執行完畢再更新畫面」打勾。
定義函式積木時用到的輸入方塊,正式名稱為「引數」(或稱為參數)
引數 num 用來控制磚塊數量,也就是放置磚塊的重複次數。放置磚塊時,需檢查引數 type 來決定要放置哪一種造型的磚塊,當 type 為 空白或 0 時,代表不要放置磚塊。
每放置一個方塊就往右邊移動一行,也就是把變數「行」加 1,當 「行」大於 10 的時候,該行已經擺滿,則必須上移一列,也就是把變數「列」加 1,同時把「行」還原為 1。
設計關卡
想想看,不同關卡會有哪些差異?例如:越後面的關卡磚塊數量越多,鋼珠的速度越快,不同關卡背景要不一樣......等等。
要控制這些差異,我們需要幾個「全域變數」(適用於所有角色),包含:計算得分的「分數」、記錄目前磚塊數量的「磚塊數量」以及前面介紹過的「速度」。
磚塊的本體並不打算在關卡中使用,所以先「隱藏」起來。
把變數「分數」歸零。
關卡佈置使用「事件驅動」方式,方便測試關卡。
首先設定第一關的背景。
從第一行第一列開始排列磚塊,總共要排 20 個磚頭。
計算本關卡使用的磚塊總數並修改變數「磚塊數量」(例如:20),注意:不要把空白的位置也算進去。設定鋼珠的移動速度(例如:5)。
按綠旗子執行程式,檢查磚塊分身是否有出現在正確的位置。
檢查是否過關
有了全域變數「磚塊數量」後,我們就可用它來判斷玩家是否已經過關,當所有磚塊都被打掉,也就是「磚塊數量」等於 0 時就過關了。請把前面所有程式中的「重複無限次」積木,改成「重複直到磚塊數量 = 0」。使用重複無限次時,程式會永遠反覆執行無法結束,這樣也就沒辦法結束第一關進入第二關,所以修改成「過關時結束」對於設計多關卡的遊戲至關重要。
另外,要更好控制遊戲流程,必須把遊戲從「循序執行」改成「事件驅動」,這樣就可以透過「廣播訊息」決定什麼時候要執行哪一支程式。
底下分別是修改過的「玩家」角色程式和「鋼珠」角色程式。
磚塊的分身程式
磚塊分身產生的時候,先把分身「顯示」出來。
然後重複檢查是否有碰到鋼珠,由於磚塊不只一種,我們可以使用「造型編號」來判斷目前是哪一種磚塊。
如果第一種磚塊碰到鋼珠就要將變數「磚塊數量」減 1,並將變數「分數」加 10 分,最後將磚塊分身刪除。
另外,當過關時(也就是磚塊數量變成 0 的時候),也要把分身刪除,這對於打不破的磚塊非常有用。
被鋼珠擊中的音效
點擊積木類別窗格最下面的「擴充功能」按鈕
出現「選擇擴充功能」畫面後,點選左上角的「音樂」
將「音樂」分類中的「演奏節拍」積木拉出來,並選取自己想要的「節奏樂器」,點擊該積木就可以聽聽看聲音適不適合。
我們接下來會設計三種不同的磚塊,包含:原來的木磚、石磚和鐵磚。這三種磚塊要配上不同的音效。
執行程式,檢查是否已經可以敲掉磚塊。(擊中磚塊時鋼珠並不會反彈,這個問題在下一小節處理)
多方向的反彈判斷
鋼珠敲中磚塊時的位置變化有 8 種可能,如右圖。
其中 2 打中磚塊上緣和 6 打中磚塊下緣,其反彈方式是一樣的,不是往右就是往左回彈。反彈角度計算公式為「 180 - 鋼珠的方向」。
4 打中磚塊右側和 8 打中磚塊左側, 反彈方式一樣,都是往上或往下回彈。計算公式為「 0 - 鋼珠的方向」。因為在 Scratch 裡面左半邊的角度為「負數」。
若是打中四個頂角,則是朝鋼珠原本的方向回彈,即「 180 + 鋼珠的方向」。
建立碰撞偵測遮罩
點選鋼珠角色,打開造型分頁。
首先將原本的造型改名為「ball」,然後複製二次造型。
第二個造型用來偵測上下,使用「畫筆」工具(預設寬度為 10)點一個小圓放在鋼珠正中間上方邊緣的位置,注意圓心要貼齊鋼珠邊緣,因此會凸出一半到鋼珠外面。在鋼珠正中央下方邊緣也點上小點,選取中央的鋼珠造型將它刪除。
第三個造型用來偵測左右,方法與前面雷同。將造型分別改名為「上下」、「左右」。
當上述兩個偵測遮罩無法偵測成功,剩下的情況就代表碰到四個斜角。
碰撞偵測
點選鋼珠角色,打開程式分頁。
新增一個私有變數(僅適用當前角色)「處理中」,用來記錄偵測是否成功。
建立一個新的函式積木「碰到磚塊就反彈」,勾選下方的「執行完畢再更新畫面」以避免切換遮罩造型時顯示在舞台上。
先將變數「處理中」設為 0,然後檢查是否碰到磚塊,若是則進入反彈角度偵測程序。
由於反彈角度偵測會改變造型,記得要在結束函式積木之前將造型改回來。
先切換到造型「上下」,檢查是否碰到磚塊,若是則讓鋼珠方向設為 180 - 方向,並將變數「處理中」設為 1。
將剛剛寫好的程式複製一份,將造型「上下」改成造型「左右」,計算公式修改為 0 - 方向。
若變數「處理中」為 0,表示沒有碰到「上下」以及「左右」,也就是碰到四個「角落」,計算公式修改為 180 + 方向。
這三段程式組合完成如右圖。
將剛剛寫好的「碰到磚塊就反彈」積木加入到鋼珠的主程式中,放置在「碰到玩家就反彈」積木的下面。
執行程式測試擊中磚塊時鋼珠會不會正常反彈。
關卡控制
為了讓遊戲能夠控制關卡出現的順序,設想遊戲進行的流程如下:
按下綠旗子按鈕執行程式,將會啟動磚塊角色中的主程式
主程式把變數「分數」歸零並廣播訊息「第一關」
磚塊角色收到訊息「第一關」後,將關卡佈置完成並將變數「磚塊數量」設定為第一關的磚塊總數
主程式在關卡佈置完成後,廣播訊息「遊戲開始」
當玩家角色和鋼珠角色收到「遊戲開始」訊息,玩家就可以開始玩遊戲
鋼珠角色會檢查自己是否壓到防線,如果壓到防線則結束遊戲
鋼珠角色會檢查磚塊是否已經打完,如果玩家已經過關則隱藏鋼珠,然後進入下一個關卡
製作第二關和第三關
新增造型
點選磚塊角色,打開造型分頁。
將第一個造型複製一份,這是要打中兩次才會消失的磚塊,請將它修改為不同顏色(例如:橘色)。
再複製一份造型,這是打不破的磚塊,請修改成適當的顏色。
修改磚塊程式
切換到程式分頁。找到分身程式中的「如果碰到鋼珠那麼」積木,將中間的所有積木複製一份移到旁邊。
配合第二種磚塊的特性進行修改:
造型編號為 2
選擇新的音效
修改分數
切換到第一個造型
將剛剛修改完成的程式再複製一份,配合第二種磚塊的特性進行修改:
造型編號為 3
選擇新的音效
給予同情分
第三種磚塊將會在過關後,才執行「分身刪除」
將第二種和第三種磚塊的處理程式串接再一起,接在第一種磚塊處理程式的下方。
佈置第二關和第三關
請將三種不同磚塊佈置成第二關和第三關。可以參考右圖的設計,但不要抄襲,請構思自己的關卡。
可以直接複製第一關的程式再修改。
計算每一個關卡的磚塊數量:
保留的空位不要計算。
第三種磚塊敲不破,所以不要計算。
設定鋼珠移動的速度,速度越快難度越高,請務必測試是否會太難。
如果需要檢視佈置成果是否適當,請先按停止按鈕(清空所有磚塊分身),然後點擊要觀察的關卡的「帽子」積木,就會顯示關卡佈置後的樣子。重複這兩個步驟檢查所有的關卡。
修改磚塊主程式
複製下面兩行程式,並修改為第二關,依此類推。
修改完成後執行程式,檢查打完磚塊後是否能正確進入下一關。
補充教材:
提示與過關訊息製作
我們至少需要製作 3 個不同字幕,分別是「劇情」、「獲勝」、「失敗」。
如果故事已經想好了,就開始來製作。
新增角色後,切換到「造型」分頁,使用「文字」工具在造型中新增文字框。
文字顏色可以從「填滿」顏色修改。
文字輸入完畢後,使用「選取」工具,將文字框的中心點(十字)對齊造型的旋轉中心(準星)。
從角色窗格中,將字幕角色設定為不顯示(禁止眼睛圖示)。
字幕配樂
Scratch 將時間較長的配樂分類為「循環」
請從其中挑選適合遊戲氣氛的 3 首音效,並新增到字幕角色中
字幕動畫
切換到「程式」分頁撰寫程式如右,「滑行」積木在四年級「動畫故事書」單元已經學過了。
如果動畫想要由下向上移動,起點座標位於舞台下方 Y 座標為 -230,而終點座標位於舞台上方 Y 座標為 230。
如果動畫想要由上向下移動,則應將 Y 座標正負顛倒,起點為 230,終點為 -230。
如果想要製作左右滑行動畫,則 Y 座標設為 0,X 座標設為 300 以及 -300。
請根據字幕的長短控制「滑行」積木的秒數。
遊戲結束動畫展示完畢時,增加一個「停止全部」積木。
開場字幕
將寫好的字幕動畫程式複製一份,改寫成劇情介紹字幕動畫
因為劇情介紹字數較多,因此滑行的秒數要長一些,配樂也要找長一點的音效。
試玩與難度調整
試玩之後,如果覺得遊戲太難過關或是太容易過關,可以怎麼調整呢?
修改鋼珠的速度,範例是使用 5、10,可以自行修改快或慢一點
增加「水泥」和「鋼筋」的數量可以有效提高難度,把這兩種磚塊數量減少就會降低難度
增加時間限制,例如:40 秒內沒有過關遊戲就結束
可以增加鋼珠的生命數,死三次才會結束遊戲
增加鋼珠數量,一次出現多個鋼珠
設計新種類磚塊,更難打或是打中就會掉新的鋼珠下來
萬一鋼珠呈現水平一直線,只能左右來回移動時,怎麼辦?
可以在鋼珠角色中加入角度變化程式,當玩家按下空白鍵時,讓鋼珠稍微向左或向右傾斜。