繪製地圖 ( 牆壁碰撞偵測 )
這篇文章延續「繪製地圖 ( 控制移動 )」文章,搭配廣播訊息和邏輯判斷,實作角色在地圖中移動,並且會被牆壁阻擋無法前進的效果。
相關文章參考:
開啟範例
開啟「繪製地圖 ( 控制移動 )」的範例,從這個範例進行修改。
積木程式原理 ( 更新地圖 )
開啟範例後,先將 source 清單顯示在舞台中,並將 source 的內容清空。
清空的方式可以在積木清單裡,找到「刪除清單的所有項目」積木,下拉選單選擇 source,選擇後點擊該積木,就可以在不使用該積木的狀態下,將 source 的內容清空。
使用試算表編輯地圖的陣列 ( 參考 繪製地圖 ( 二維陣列 ) ),並下載為 CSV,開啟 CSV 檔案,在每一行的前後加上雙引號。
也可以直接使用 CSV 範例:檔案下載
從舞台上,將 CSV 檔案匯入 source 清單。
點擊綠旗,在舞台上可以看到二維陣列產生的地圖。
積木程式原理 ( 修改造型 )
切換到造型頁籤,將原本 a 和 b 的造型,更名為 wall 和 floor ( 方便後續識別 ),將 wall 調整為灰底黑框,floor 調整為白底。
加入邊框後,長寬會變大,要再手動將長寬調整為 24x24。
造型編輯完成後,點擊綠旗,舞台上就會變成有牆壁的地圖。
積木程式原理 ( 橘色球 )
回到角色面板,使用繪圖功能,新增一個 ball 的角色 ( 橘色原形、尺寸設定 24x24、對齊畫布中心 )
切換到程式頁籤,新增 x 和 y 變數,在點擊綠旗時,將 ball 移動到最上層,並將 x 設定為 12,y 設定為 0,將 ball 定位到 (x, y) 的位置。
為什麼要使用 x 和 y 變數?因為待會會透過這兩個變數判斷是否碰到牆壁。
完成後,點擊綠旗,橘色球就會出現在地圖裡。
積木程式原理 ( 碰到牆壁 )
點擊正方形 box 的角色,按照下圖,修改「顯示」函式:
- 如果 list 的第 i 項等於 0,切換造型為 floor。
- 如果 list 的第 i 項等於 1:
- 切換造型為 wall。
- 繼續判斷如果 xy 座標等於變數 x 和變數 y,就發送廣播訊息 wall。
新增一個 state 變數,作為紀錄鍵盤按鍵狀態使用,在按下上下左右鍵時,分別將 state 設定為 up、down、left 和 right。
編輯收到 wall 訊息的程式:
- 如果 state 等於 up,表示按「向上」時碰到牆壁,就執行「向下移」函式。
- 如果 state 等於 down,表示按「向下」時碰到牆壁,就執行「向上移」函式。
- 如果 state 等於 left,表示按「向左」時碰到牆壁,就執行「向右移」函式。
- 如果 state 等於 right,表示按「向右」時碰到牆壁,就執行「向左移」函式。
在牆壁角色蓋印章的過程中,如果發現 ball 在牆壁的座標,就會執行反方向的動作,由於函式勾選了「執行完畢再更新畫面」,所有的動作會在一瞬間完成,所以就像撞到牆壁,然後被牆壁卡住。
為什麼要額外用變數 state 呢?因為如果將反向移動的程式寫在移動的函式裡,由於執行順序的限制,會出現上下移動與左右移動互相干擾的狀況,所以使用 state 來避開這個問題。
最後,點擊 ball 角色,替 ball 角色加入碰到就講話的效果。
完成效果
完成後,點擊綠旗,按下鍵盤的上下左右,彷彿在控制橘色球在移動 ( 橘色球不動,但是地圖在動 ),然後橘色求如果碰到牆壁會被卡住,並講出「Oh!!!!」的文字。
範例解答
範例解答:繪製地圖 ( 牆壁碰撞偵測 )
繼續閱讀
如果已經熟悉了繪製地圖 ( 牆壁碰撞偵測 ) 的程式,就可以繼續閱讀「繪製地圖 ( 吃東西偵測 )」的文章。
文章連結:繪製地圖 ( 吃東西偵測 )
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~