反彈球 ( 乒乓球 )
這篇文章會介紹,如何在 Scratch 裡使用定位、偵測碰到、反彈、數學計算、重複...等積木,實作一個反彈球 ( 類似乒乓球 ) 的小遊戲,並且更進一步做到板子以不同速度碰撞到乒乓球時,會改變乒乓球的移動軌跡和角度。
角色設定
在角色編輯區,刪除貓咪角色,使用繪畫,繪製球、板子和地板三個新角色 ( 參考:造型與繪圖 )。
下圖是三個造型在舞台上排列的大小示意,地板佔滿整個舞台底部 ( 因為到時候如果球碰到地板,表示扣分或遊戲結束 )。
積木程式原理 ( 球 )
點擊「球」角色,先編輯讓球「碰到邊緣就反彈」的程式:
- 放入當綠旗被點擊積木。
- 點擊綠旗時,將球面朝 135 度,定位在舞台中間正上方 ( 0, 150 )。
- 使用重複無限次積木,每次重複時「撞到邊緣就反彈」,並且移動 10 點。
完成後點擊綠旗,就能看到球在舞台中移動,撞到邊緣會反彈。
接著理解「球碰板子反彈」的原理:
- 球的入射角大於 0 ( 從左上往右下移動 ),反射角等於「180 - 入射角」。
- 球的入射角小於 0 ( 從右上往左下移動 ),反射角等於「( 180 + 入射角 ) x -1」。
按照反彈原理,編輯球碰到板子的程式:
- 放入「如果...那麼」積木,判斷當球碰到板子角色。
- 接著放入「如果...那麼...否則」積木。
- 如果「方向 > 0」( 入射角 > 0 ) 時,面朝 ( 反射角 )「180 - 方向」度。
- 否則 ( 方向 <= 0 )時,面朝「( 180 + 方向) x -1」度。
補充說明,如果使用「方向 > 0」的公式,套用到「方向 <= 0」的角度,會產生「大於 180 的角度」,當出現大於 180 角度的數值時,Scratch 會將其變成「負值」( 180 - 該數值 ),所以可以將上述積木簡化成「180 - 方向」一塊即可。
完成後,就能看到球碰到板子反彈。
由於球是以每次移動「 10 點」為單位進行移動,所以某些情況下,會發生「超過板子」的奇怪狀況。
為了避免這種狀況,可以建立一個「反彈修正」的函式處理,點選左側清單「函式積木」,建立一個函式,命名為「反彈修正」,勾選「執行完畢再更新畫面」。
注意,一定要勾選「執行完畢再更新畫面」,這個功能可以讓函式內不需要等待的程式快速執行,加快畫面運行速度。
「反彈修正」函式的內容,放入一個「重複...直到」積木,每次重複將球的 y 增加 1,直到沒有碰到板子為止 (碰到板子不成立 ),接著在原本的程式中「如果碰到板子」的積木裡,執行「反彈修正」的函式。
最後加入「如果...那麼...否則」積木,判斷如果碰到地板,就說出「你已經死了」,否則 ( 如果沒碰到地板 ),就執行球的移動與碰撞程式。
積木程式原理 ( 板子 )
編輯「板子」角色的程式,讓板子可以跟隨滑鼠移動:
- 放入當綠旗被點擊積木。
- 點擊綠旗時,執行重複無限次積木。
- 每次重複時,將板子的 x 座標定位到滑鼠的 x 座標。
雖然做到這個步驟,程式已經全部完成,但球只會以「單一角度」反彈或移動,因此可以替板子角色加入「速度」變數,由板子的移動快慢,進一步控制球的反彈角度。
首先新增兩個變數:
- ax:0.001 秒之前板子的 x 座標。
- v:板子的移動速度。
修改板子的跟隨滑鼠移動的程式,每次重複執行:
- 設定變數 ax 為板子的 x 座標。
- 等待 0.001 秒。
- 將板子定位到新的滑鼠座標。
- 設定變數 v 為「新的 x 座標 - ax」。
此處的速度 v 表示 0.001 秒內滑鼠移動的「距離」,0.001 秒內移動距離越大,速度越快。
最後,點擊「球」的角色,將變數 v 加入角度的計算裡。
完成效果
完成後,點擊綠旗,就能開始進行反彈球的遊戲,當板子移動速度越快,就越能改變球的反彈角度。
範例解答
範例解答:反彈球 ( 乒乓球 )
延伸練習
如果已經熟悉了反彈球 ( 乒乓球 )的原理,還可以嘗試更多好玩的作法:
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~