重複收廣播
重複收廣播 1-Scratch 中常犯的錯
已經很多次了,幫學生解 bug 時,發現問題都是因為短時間內重複收廣播而造成的。很訝異這個事情很多書都沒有提,傑夫老師就在這裡寫出來,讓大家都知道
把問題簡化成下面這個專案,角色『Cat』透過一個變數『要說的話』利用廣播『骷髏說話』讓另一個角色『Skeleton』說出變數中的話。
角色 Cat 的程式如下:
Cat 透過變數與廣播讓 Skeleton 說話
角色 Skeleton 的程式如下:
Skeleton 只負責說話
執行結果如下:
結果是 Skeleton 只說了第四句話
沒看錯!Skeleton 只說了第四句話。原因就在於當一個『當收到訊息XXX』為首的程式積木串,如果在還沒執行完所有的程式前,又收到了一次這個廣播訊息,那麼此段程式會被中斷並重頭開始執行。
Skeleton 每說一句話需要 2 秒,但 Cat 以飛快的速度改變了『要說的話』裡面的值並發出廣播訊息,Skeleton 收到了第 1 個廣播要說出「第一句」話的時候,馬上收到了第 2 個廣播,所以「第一句」話還沒說出來,就被打斷了。同樣道理,「第二句」與「第三句」也都一樣,最後的結果就只說出了「第四句」。
結論就是不能短時間內重複"收"廣播,更嚴格的說,是不能重複"發"廣播。那要怎麼解決?這不是唯一的解法,但順便介紹一個大多數人不常用的方式『廣播訊息XXX並等待』。
『廣播並等待』會等到相應的廣播訊息的程式都做完了,才會執行下一個程式積木。所以 Cat 的程式改成下面這樣,就能解決問題了。
改用廣播並等待就能解決問題
改用廣播並等待之後執行結果如下:
Skeleton 說出 4 句話
除了廣播,還有一個地方也會有一樣的問題喔!想知道的話,請看下一篇。
重複收廣播 2-Scratch 中常犯的錯
前篇結尾提到,除了廣播,還有一個情況也會有重複收到就重來的問題。本篇就來說明一下。
這種情況就是『當角色被點擊』,其實這個方式不常使用,但是有一樣的問題,所以來介紹一下。我們看看以下程式積木串:
當角色被點擊時,此角色就會轉 360 度
只點擊一次,火箭就會轉一圈。
只點擊一次,火箭就會轉一圈
但是,如果連續點擊,火箭就會朝向正上方,重新開始旋轉。
連續點擊,火箭就會重新開始旋轉
重複收廣播 3-Scratch 中常犯的錯
這系列的標題雖然是"重複收廣播",但這一篇要讓大家來瞭解一下連續"發"廣播的問題,這也是在教學過程中偶爾會遇到但卻不好解決的問題。
不多說,直接看程式,第一段:
程式第一段
第二段:
程式第二段
第三段:
程式第三段
此三段程式與角色無關,可以都在同一個角色,也可以分在三個角色中。『廣播清單』中的各項會是哪些?請先想一想,再往下看。
執行結果:
執行結果
跟你想的結果一樣嗎?『廣播訊息』後並不會馬上就執行『當收到訊息』的程式積木,必須等到當時的執行緒執行完畢或遇到 「讓點 (yield point)」 ,才會輪流執行。這些都與 Scratch 的內部執行機制有關,如果不知道為什麼會這樣,請從《綠旗不同步-Scratch內部執行機制》看起。
動畫專案中,角色之間的互動都必須經由廣播訊息來溝通,如果有像本篇這樣連續發廣播的狀況,很可能結果就不是所預期的!
Scratch 的幾個不解之謎,都與執行機制有關,不想搞懂「執行緒」、「執行緒列表」或是「讓點」也沒關係,但一定要知道該怎麼解決或避免這樣的問題。有問題歡迎與傑夫老師討論,Bye now~