Scratch第73講:火柴人射箭游戲

2019-12-03 11:34

我們有很多涉及到反射的游戲,這一款是CC哥比較喜歡的,就是小人之間有很多障礙物,需要我們射箭的時候計算發射角度,通過反射來射中目標。我們之前的反射游戲通常是碰到墻壁反射,或者一些垂直或水平的面進行反射,那么如果很多不規則形狀該怎么反射呢?今天CC哥就用這個游戲讓大家輕松的掌握任意角度的反射技巧。

讓大家先看看CC哥編的小游戲:

是不是挺有意思的?

中間的障礙物和墻壁,以及每個面都可以進行反射,那是怎么計算反射角的呢?今天CC哥就重點講這個部分:

游戲思路

1:先要確定反射面,象這個游戲里面,除了墻壁,障礙物每一個表面都需要能夠反射。

2:做反射的第一個條件就是必須知道反射面的角度。

3:如何最簡單的獲取反射面的角度,最容易的方法就是每個反射面都是一個角色,這樣你只要簡單的獲取角色的方面就好了。

4:技巧上你可以每個面用跟障礙物同色的細直線角色貼在障礙物的每個面上就可以了。

https://cdn.china-scratch.com/timg/191205/11340925E-0.jpg

所以大家看,中間的障礙物,其實就是三個直線角色拼接而成,當然如果你另外畫一個同樣的實心角色放在中間,那么就是實心的障礙物了。CC哥沒費勁做是為了通過這種形式,讓大家很容易理解編程的思路。

任意角度的反射角計算

https://cdn.china-scratch.com/timg/191205/1134103L8-1.jpg

假設的反射面就是y軸,那么反射角很容易,假設入射角是a,那么反射角就是0-a。就這么簡單。如果反射面不是正好是豎直呢?假設反射面有一個方向角度呢?比如是B。那么我們該怎么辦?現在是運用你想象力的時候了,可以想象一下我們只要把這個反射面豎直了!也就是反向旋轉B度,那么不就又變成了豎直面反射了嗎?好移動之后,入射角就變成了(a-B),那么反射角就是0-(a-B),然后我們再把反射面旋轉回去,就是再正向旋轉B,恢復到反射面的正常位置,那么反射角跟著一起旋轉,真實的反射角就是:0-(a-B)+B=0-a+2B。這個就是通用的反射角計算公式啦。a代表入射角,B代表反射面的角度。

徹底的理解了這個,那么這一課的精髓你就算學完了。順便看看程序吧:

箭矢的處理

https://cdn.china-scratch.com/timg/191205/1134103R3-2.jpg

看這只箭CC哥做的不錯吧,很逼真。但是有一個問題大家注意到沒有?這個箭是有長度的,箭尖碰到反射面,箭矢就要開始反彈轉向,那么箭尾怎么處理?在轉向過程中,箭尾也會碰到反射面的,整個箭矢是一個角色,角色碰撞,那不是又要再反射一次了?所以這里必須要有處理技巧。怎么做?引入影子角色!

https://cdn.china-scratch.com/timg/191205/113410J13-3.jpg

注意

CC哥發現有的朋友上來就從60講以后開始學,但是實際編程水平還是很初級。所以CC哥勸這些朋友,還是要從第一講開始學,學編程是一個過程,在前60講里面有很多技巧的基礎和概念,如果不能熟悉和很好的掌握,直接從后面學是很吃力的,事倍功半。

https://cdn.china-scratch.com/timg/191205/1134104235-4.jpg

這個影子角色,CC哥叫箭頭,也就是一個小點,很小,平常是隱形的。所有的反射代碼就編寫在這個箭頭里,而箭矢很簡單,只要保持跟箭頭方向一致,箭頭的位置始終跟緊箭頭就好。

https://cdn.china-scratch.com/timg/191205/11341035Y-5.jpg

https://cdn.china-scratch.com/timg/191205/1134102203-6.jpg

這段代碼比較長,也是本程序的關鍵,其中用到的反射角計算公式就是文章上面剛講過的。

另外,Scratch的偵測命令里有可以在任意角色里偵測其他角色的信息,非常方便編程。

https://cdn.china-scratch.com/timg/191205/1134114L3-7.jpg

就是這個,容易被忽略,通過下拉選項,你就可以知道其他任意角色的方向。

https://cdn.china-scratch.com/timg/191205/1134115N8-8.jpg

https://cdn.china-scratch.com/timg/191205/113411K36-9.jpg

舞臺最下面灰色的部分定義的是地面,也是一個角色,箭頭碰到就會停下來。

其實這個程序,CC哥覺得最花心思的還不是上面講的這部分,而是射箭的動作部分。

https://cdn.china-scratch.com/timg/191205/1134112550-10.jpg

這個射箭動作有意思的有幾點:

1:有拉弓搭箭的動作。

2:用鼠標可以控制弓箭瞄準的方向,而且小人的手臂也跟著弓在動。

處理技巧:

1:拉弓搭箭的關鍵是角色的位置和配合,因為箭和弓可不是一個角色,所以角色的位置配合要非常好。

2:另外為了保證手臂和弓能同時旋轉,所以手臂跟弓是一個角色,造型放在了一起,而射箭小人是沒有手臂的。

https://cdn.china-scratch.com/timg/191205/11341134a-11.jpg

https://cdn.china-scratch.com/timg/191205/1134123405-12.jpg

有沒有覺得CC哥構思很巧妙,其實程序設計編程不是最復雜的,關鍵是構思,思路好,程序就簡單,思路不好,那編程就會編的很復雜。

3:最大的難度是如何讓弓和箭都繞著箭尾的點旋轉。要知道,弓的中心點是旋轉的圓心,非常好處理。但是箭矢的中心點是箭頭,就不能簡單的用旋轉了,而是要根據弓旋轉的角度,計算箭頭的位置(影子角色)。這部分就需要用到三角函數了。大家可以畫畫圖,然后計算一下,小朋友如果沒有學過sin cos這些三角函數可以問問爸爸媽媽。

CC哥做了兩種控制方法去做瞄準和發射動作,一種是空格配合上下箭頭,一種就是用鼠標,CC哥更喜歡鼠標這種操作,鼠標按下-拉弓,鼠標上下移動來調整方向,鼠標松開-發射。

鼠標的控制,大家自己試的時候可以參考下面代碼的邏輯。

https://cdn.china-scratch.com/timg/191205/1134121D7-13.jpg

--end--

后記,小編朋友公司研發了一個游戲化的少兒編程在線課程(5-12歲),游戲化教學結合scratch(一款在線少兒編程工具,類似樂高的積木拼搭),我家娃娃學了幾次課,非常喜歡(超預期),16次課才200多塊錢,對鍛煉孩子的思維能力和動手動力很有幫助。

感興趣的朋友可以掃描二維碼,關注一下,或微信搜索“大耳猴少兒編程”

http://www.oeerar.tw/Uploads/Editor/2018-04-22/5adca08bdc212.jpg

聲明:本文章由爬蟲自動處理和轉載作為教育分享用途,原作者可通過郵件及時和我們聯系處理:freemanzk@qq.com