重複收廣播

重複收廣播 1-Scratch 中常犯的錯

已經很多次了,幫學生解 bug 時,發現問題都是因為短時間內重複收廣播而造成的。很訝異這個事情很多書都沒有提,傑夫老師就在這裡寫出來,讓大家都知道

把問題簡化成下面這個專案,角色『Cat』透過一個變數『要說的話』利用廣播『骷髏說話』讓另一個角色『Skeleton』說出變數中的話。

角色 Cat 的程式如下:

Cat 透過變數與廣播讓 Skeleton 說話

Cat 透過變數與廣播讓 Skeleton 說話

角色 Skeleton 的程式如下:

Skeleton 只負責說話

Skeleton 只負責說話

執行結果如下:

結果是 Skeleton 只說了第四句話

結果是 Skeleton 只說了第四句話

沒看錯!Skeleton 只說了第四句話。原因就在於當一個『當收到訊息XXX』為首的程式積木串,如果在還沒執行完所有的程式前,又收到了一次這個廣播訊息,那麼此段程式會被中斷並重頭開始執行。

Skeleton 每說一句話需要 2 秒,但 Cat 以飛快的速度改變了『要說的話』裡面的值並發出廣播訊息,Skeleton 收到了第 1 個廣播要說出「第一句」話的時候,馬上收到了第 2 個廣播,所以「第一句」話還沒說出來,就被打斷了。同樣道理,「第二句」與「第三句」也都一樣,最後的結果就只說出了「第四句」。

結論就是不能短時間內重複"收"廣播,更嚴格的說,是不能重複"發"廣播。那要怎麼解決?這不是唯一的解法,但順便介紹一個大多數人不常用的方式『廣播訊息XXX並等待』。

『廣播並等待』會等到相應的廣播訊息的程式做完了,才會執行下一個程式積木。所以 Cat 的程式改成下面這樣,就能解決問題了。

改用廣播並等待就能解決問題

改用廣播並等待就能解決問題

改用廣播並等待之後執行結果如下:

Skeleton 說出 4 句話

Skeleton 說出 4 句話

除了廣播,還有一個地方也會有一樣的問題喔!想知道的話,請看下一篇。

重複收廣播 2-Scratch 中常犯的錯

前篇結尾提到,除了廣播,還有一個情況也會有重複收到就重來的問題。本篇就來說明一下。

這種情況就是『當角色被點擊』,其實這個方式不常使用,但是有一樣的問題,所以來介紹一下。我們看看以下程式積木串:

當角色被點擊時,此角色就會轉 360 度

當角色被點擊時,此角色就會轉 360 度

只點擊一次,火箭就會轉一圈。

只點擊一次,火箭就會轉一圈

只點擊一次,火箭就會轉一圈

但是,如果連續點擊,火箭就會朝向正上方,重新開始旋轉。

連續點擊,火箭就會重新開始旋轉

連續點擊,火箭就會重新開始旋轉

重複收廣播 3-Scratch 中常犯的錯

這系列的標題雖然是"重複收廣播",但這一篇要讓大家來瞭解一下連續"發"廣播的問題,這也是在教學過程中偶爾會遇到但卻不好解決的問題。

不多說,直接看程式,第一段:

程式第一段

程式第一段

段:

程式第二段

程式第二段

段:

程式第三段

程式第三段

此三段程式與角色無關,可以都在同一個角色,也可以分在三個角色中。『廣播清單』中的各項會是哪些?請先想一想,再往下看。


執行結果:

執行結果

執行結果

跟你想的結果一樣嗎?『廣播訊息』後並不會馬上就執行『當收到訊息』的程式積木,必須等到當時的執行緒執行完畢或遇到 「讓點 (yield point)」 ,才會輪流執行。這些都與 Scratch 的內部執行機制有關,如果不知道為什麼會這樣,請從《綠旗不同步-Scratch內部執行機制》看起。

動畫專案中,角色之間的互動都必須經由廣播訊息來溝通,如果有像本篇這樣連續發廣播的狀況,很可能結果就不是所預期的!

Scratch 的幾個不解之謎,都與執行機制有關,不想搞懂「執行緒」、「執行緒列表」或是「讓點」也沒關係,但一定要知道該怎麼解決或避免這樣的問題。有問題歡迎與傑夫老師討論,Bye now~