3D建模與程式設計
課程總覽
教學軟體:Blender
教學網站:Scratch、codecombat
課程規劃:
海龜畫圖/4
浮雕建模/4
立體建模/6
文字型程式遊戲/4
單元一:海龜畫圖
LOGO 海龜畫圖
Logo是一種電腦程式設計語言,在1966年由西摩爾·派普特和Wally Feurzeig設計,Logo一詞源自希臘語邏各斯(logos)。Logo是一種直譯語言,和其他語言不同的是,它內建一套海龜繪圖(Turtle Graphics)系統,通過向海龜傳送命令,使用者可以直觀地學習程式的執行過程,因此很適於初學者特別是兒童學習程式設計。
海龜繪圖使得Logo使用者可以通過簡單的編程創作出豐富多彩的視覺效果或圖案。假想一隻帶著畫筆的海龜可以接受簡單的命令,例如向前走100步,或者左轉30度。通過對這隻海龜傳送命令,可以讓它繪製出較為複雜的圖形,例如正方形,三角形,圓等。
海龜的移動相對於它本身所在的位置。例如,命令"左90"意味著讓海龜左轉90度,學生可以站在海龜的角度來思考它將如何執行命令,這使得程式設計更加形象化,也更易於理解。
code.org 冰雪奇緣闖關活動
網址:https://studio.code.org/s/frozen
底下三個難關,請依據老師課堂上的提示,嘗試過關:
第六關:巢狀迴圈的應用
第十關:平行四邊形四個外角的計算方法
第十四關:自定義函式(Function)的應用
從畫點到畫線
要在舞臺上畫出線條,必須用到 Scratch 的畫筆積木
使用畫筆積木,應該先做「初始化」,也就是把舞台上所有筆跡清除,並讓畫筆角色回到舞台中央面朝上
練習使用函式積木定義自己的指令積木
使用新定義的積木清除畫布(舞臺)
幾何學裡面最基本的單位是點,畫點可以使用「下筆」積木
連續畫點就會形成線,右圖的「畫線」積木用來畫長度 100 的線
改成自行輸入線的長度,積木會更好用,函式積木可以定義輸入方塊以接受外部輸入的資料,在程式設計裡這些方塊被稱為:引數(或稱為「參數」)
引數與變數功能相同,但作用範圍不同,引數僅在該函式積木內有作用。
輸入方塊有兩種:數字或文字、布林值,我們要使用的是前者,並將該輸入方塊命名為 x,你可以把 x 當成該函式積木的內建變數來使用(用拖曳方式引用)
正多邊形的畫法
我們知道繞一圈回原位就是轉 360 度,三角形可以想成是圓形的變形(把一個圓形的橡皮筋套在三根鐵釘上面),因此畫完每一邊要轉 360÷3=120 度,總共要畫三次。
其餘多邊形也可以想成是圓形的變形,畫 N 邊形每次要轉 360÷N 度
把長度和邊數改成輸入方塊並命名為 y 和 z,設計出多邊形函式積木。
利用剛剛設計好的多邊形積木,我們可以畫出複雜圖形
右邊範例是畫 10 個 5 邊形繞一圈的結果,請小朋友自行修改邊長和邊數化出不同的複雜圖形,也可以修改重複次數,但右轉角度也必須同步修改。
圓的畫法
多邊形積木也可以用來畫圓形,方法是把長度改為 1 或 2,邊數改成 360 邊。
我們習慣用直徑來測量圓形的大小,利用多邊形積木畫圓,必須改用邊長,比較難掌握畫出來的大小。
請嘗試設計一個新的積木來畫圓,輸入的資料是直徑。
把直徑乘以圓周率(3.14)算出周長,然後把周長除以 360 就得到 360 邊形的邊長。這樣我們就可以畫出正確大小的圓。
弧的應用
畫圓畫一半就會得到弧線,我們根據畫圓的積木,設計一個新的畫弧積木。
利用畫弧積木,可以進一步設計出更多複雜圖案。
組合兩個弧變成花瓣,然後利用花瓣積木,畫出不同花瓣數量的花。
作業:請利用隨機數在舞台的任意位置,繪製 3 ~ 12 個花瓣,大小 20 ~ 60 的花朵,記得修改畫筆顏色,以呈現出五彩繽紛的花園氣氛。
補充資料:五芒星畫法
要畫五芒星,那就先研究三芒星畫法,所謂三芒星其實就是正三角形。小朋友已經知道三角形內角和是 180 度,也就是說「三芒星的三個芒角加起來是 180 度」,事實上「五芒星的五個芒角加起來也是 180 度」。
要畫五芒星的話,就是要把 180 度分給 5 個芒角,180÷5=36,每個芒角 36 度。用海龜來畫圖,每次轉彎的角度是外角,外角的算法是 180-內角,以五芒星為例,就是 180-36=144 度。
下面最右邊的積木可以用來畫任意奇數的芒星,但偶數芒星的算法太複雜,這裡略過不討論。
補充資料:螺旋與遞迴
利用課堂上所設計的「畫弧」函式積木,可以進一步畫出螺旋線,方法是一邊畫弧線,然後一邊把直徑縮小,例如:每畫一條 90 度的弧線就把直徑縮小 5 點,一直縮小到直徑為 0 時停止。
這是一個需要反覆執行相同動作的程式,可以利用「重複執行直到」積木來製作,如下圖左邊的函式積木。這個函式積木裡面需要對「引數(參數)」進行運算操作,但可惜 Scratch 的「引數(參數)」不提供運算功能,所以只能改用變數來設計。
換個方式來思考,把螺旋線最外面一條 90 度弧線擦掉,剩下的圖形也是螺旋線,以此類推,我們可以發現螺旋線就是由更小的螺旋線組成的。只要反覆執行「螺旋線積木」就可以把整個螺旋線畫好。這種函式積木「引用自身」的做法稱為「遞迴」演算法。
下面右側示範的是最簡單的遞迴程式,僅只引用自身一次,而這一次不需要用到變數。下列兩個程式的執行結果完全相同,仔細觀察比較很快就會發現「遞迴其實就是重複執行的另一種寫法」。
單元三:立體建模
三維座標系
在幾何學概念中,「點」是不佔有空間的,僅用來表示「位置」,所以是 0D。「線」是點運動的軌跡,除了位置之外還佔有長度空間,稱為 1D。將線連續排列在一起形成「面」,除了在立體空間的位置外,還佔有長、寬兩種空間,也就是 2D,而「體」則是將面疊在一起而有了高度,因此稱為 3D。
三維座標系即三維空間座標系統,使用三個參數來標示三維空間中的每一個點,右圖是常用的直角座標系,分別用 X、Y、Z 代表三維,而 x、y、z 則是點(x,y,z)與原點 O 在三維上面的距離。
利用電腦來表示 3D 物體的方法就是建立 3D 模型,要將 3D 模型顯示在 2D 螢幕上,需要運用「投射」數學對 3D 模型進行演算,稱為「算圖」(render)。
投射數學源於文藝復興時期的畫家「達文西」所發明的「透視法」,是一種把立體三維空間的形象表現在二維平面上的繪畫方法。達文西是一個博學者:在繪畫、音樂、建築、數學、幾何學、解剖學、生理學、動物學、植物學、天文學、氣象學、地質學、地理學、物理學、光學、力學、發明、土木工程等領域都有顯著的成就。
取自維基百科
三視圖
除了「透視法」以外還有另外一種將立體投影成平面的方法,稱為「三視圖」。當我們觀察一個物體時,隨著觀測者位置的不同會有上面、下面、左面、右面、前面、後面共六個角度,將看到的物體輪廓測量繪製出來的圖形稱為「視圖」,由於上、下視圖方向相反但圖形相同,左、右視圖和前、後視圖也是如此,因此可以把六個視圖歸納成兩個兩個一組,上視圖和下視圖合稱「俯視圖」,左視圖和右視圖合稱「側視圖」,前視圖和後視圖合稱「正視圖」,這三種視圖合稱「三視圖」。
下圖取自國家教育研究院「三視圖-從哪裡看?」教師手冊,請仔細觀察圖表,是否有發覺「透視圖」與「三視圖」之間的關係呢?
視錯覺,是指透過幾何排列、視覺成像規律等手段,製作有「視覺欺騙」成分的圖像進行眼球欺騙,引起的視覺上的錯覺,達到藝術或者類似魔術般的效果。當我們觀察立體圖形時,兩隻眼睛的可視範圍合起來大約是 124 度左右,無法同時看到圖形的左右兩側,而人類的大腦會根據有限的視覺訊息去想像和推測不足的部分,因此很容易造成視錯覺,例如:凹面看成凸面、斷裂的圖形看成是連接的......等等。
Blender
是專業的自由及開放原始碼3D電腦圖形軟體,擁有極豐富的高階模組塑造功能,可用於捏塑、建立 3D 模型、材質貼圖、製作 3D 動畫......等等。
在家分作業系統安裝 Blender 軟體示範
在Windows上安裝Blender
在Mac (蘋果電腦) 上安裝 Blender
使用平板怎麼建立模型?
使用平板可以到應用程式商店搜尋「tinkercad」,雖然 tinkercad 功能比較陽春,但要拿來製作雪人模型還是很好用的。有關 tinkercad 的操作示範,請看「四年級下學期浮雕建模」單元。
跟著一起做:3D建模示範操作教學影片~~堆雪人
單元四:文字型程式遊戲
什麼是程式語言?
所謂「程式語言」是指用來向電腦發出指令,讓電腦能因應不同狀況採取適當行動的「人工語言」,與自然演化而來的「自然語言」不同(例如:國語、英語......等)兩者之間的差異除了產生方式不同、使用目的不同之外,主要的差異是:人工語言有嚴格的語法定義,不符合規範的語法將無法解析意義,具有「單義性」;而自然語言則會根據個別使用者允許有語法、意義上的差異,這種特性稱為「多義性」。
最早的程式語言是在電腦發明之前產生的,當時是用來控制提花織布機及自動演奏鋼琴的動作,而在電腦發明之後,專為電腦設計的「電腦程式語言」大量出現,至今已將近有 1000 種,並且每年仍有新的電腦程式語言誕生。隨著電腦科學的發展,無論是提花織布機或自動演奏鋼琴都已經改由電腦直接控制,也因此「程式語言」通常就是指「電腦程式語言」。
自然語言是先用語音來表達語意(程式語言中稱為語義)然後才發明文字,有了文字以後才發展出文法(程式語言中稱為語法)。而程式語言則一開始就先發展語法,透過語法來定義語義。「語法」是說明程式設計語言中,哪些符號或文字的組合方式是正確的,「語義」則是對於程序的解釋。
過去學過的 Scratch 算不算是一種程式語言呢?如果從 Scratch 積木僅有「語義」沒有定義「語法」的特性來判斷,Scratch 並非傳統所說的「程式語言」,之所以沒有語法是為了避免輸入程式時會有「語法錯誤」導致程式無法正常運作,對於不熟悉程式語言的小朋友來說,要檢查出語法錯在哪裡,會是一件痛苦而且耗時的工作,也可能因此導致小朋友喪失學習興趣。
然而 Scratch 積木所堆積出來的程式是可以確實執行的,在「語義」方面是完整可行的,與傳統所說的「程式語言」並沒有不同。因此有些程式語言專家認為 Scratch 是一種「視覺化」程式語言,因為 Scratch 是透過視覺操作介面用滑鼠拖拉來寫程式,而不是用文書處理軟體(例如:記事本)來寫程式。「視覺化」程式語言只是讓小朋友在接觸真正的「程式語言」之前,培養邏輯與運算思維的工具,其最終目標是要讓小朋友熟悉「文字型」程式語言。
CodeCombat
Python 是一種擁有簡潔語法,容易理解的語言,因此非常適合作為「文字型」程式語言入門學習使用。除此之外,Java Script 也是一種適合作為入門學習的程式語言。透過遊戲方式來學習 Python(或 Java Script)是一件輕鬆又有趣的方法,特別是底下推薦的「CodeCombat」遊戲網站。
請點選右圖右上角的圖示,進入 CodeCombat 網站,然後點選「我是學生」,輸入班級代碼(由老師提供)
進入登入畫面後,請點選右下角的「Sign in with Google」按鈕,使用學校提供的學生信箱帳號密碼登入。
打開 gmail 信箱收取 CodeCombat 網站寄給你的「確認信」,並啟用帳號。
看老師示範前面 2 關並講解遊戲玩法,然後自己嘗試闖關,祝你好運囉!
附錄:浮雕建模
浮雕是雕刻的一種,藝術家在一塊平板上將他要塑造的形象雕刻出來,使它脫離原來材料的平面。在 3D 建模裡面,浮雕建模被稱為 2.5D 建模,意思是介於平面和立體之間。
浮雕一般可以分為陽刻和陰刻,與之相對的 2.5D 建模也可分為凸雕和凹雕兩種技法。如果想要的圖案浮在表面材料上面,就是凸雕。如果是沈入於表面材料之中,則稱為凹雕。
生活中屬於 2.5D 的物品有:招牌、名牌、匾額、印章、杯墊、隔熱墊、行李吊牌......等等。這些物品都可以使用 3D 建模軟體繪製,然後透過 3D 印表機製作出來。
3D 建模軟體的分類:
CAD:參數式建模軟體,例如:Solidworks、Catia、UG 、Inventor、Autocad 3D......等
Polygon:多邊形建模軟體,例如:3D max、Maya、Blender、TinkerCad......等
sculpt:捏塑軟體,例如:Mudbox、Blender、ZBrush、MeshMixer、Sculptura......等
優秀學生作品
多邊形建模
連接網址:https://www.tinkercad.com/,按右上角的「登入」按鈕
登入頁面出現後,點擊「學生,加入您的課程」,然後輸入課程代碼(由老師提供)
點擊課程歡迎畫面下方的「Google」圖示,使用學校提供的學生郵件信箱帳號加入課程。
Tinkercad 教學示範影片
附錄:敲磚塊
電腦遊戲是遊戲的一種,而遊戲的主要成份有目的、規則、挑戰及互動,這些成分可以統稱為「遊戲性」。遊戲性就是一個遊戲之所以吸引人的原因,遊戲性可以帶來「脫離現實」的解放感,也導致有些人會沈溺於遊戲當中。
目的:在遊戲當中,我們都有明確性的目標。而在平時的工作和生活當中,我們未必有明確的目標,這也是很多人感到生活迷茫的原因。很多人是因為在生活當中沒有目標,所以就到遊戲這個虛擬世界裡去尋找目標。
規則:在遊戲當中,規則是相對固定的,而且你玩得越久,對規則就把握得越好,遊戲規則是公平的,只要努力總能獲得相應的回報。而在現實社會當中,卻未必都有公平的規則。
互動:只要玩遊戲就會有相應的收穫,例如:稱號、級別、得分、進度條、金幣、裝備。人與遊戲的互動,都是可以預期結果的。而現實世界卻不是可以預測的。
挑戰:所有遊戲都是自願參與的,當面對困難的挑戰時自己可以隨時退出,就算失敗了還可以重新挑戰,有充分的自主權。而現實生活卻不是這樣,總是有許多迫於無奈的事情,而且常常失敗了就沒機會重來。
以遊戲設計的角度來看,電腦遊戲可以簡單分成三個最基礎部分:遊戲內容(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 秒內沒有過關遊戲就結束
可以增加鋼珠的生命數,死三次才會結束遊戲
增加鋼珠數量,一次出現多個鋼珠
設計新種類磚塊,更難打或是打中就會掉新的鋼珠下來
萬一鋼珠呈現水平一直線,只能左右來回移動時,怎麼辦?
可以在鋼珠角色中加入角度變化程式,當玩家按下空白鍵時,讓鋼珠稍微向左或向右傾斜。