資訊內(nèi)容
淺談Scratch的舞臺刷新機(jī)制 Part 2——在常規(guī)積木中的應(yīng)用
“?簡單來說,我們之所以能從各種屏幕上看到畫面的動態(tài)變化,都是由于屏幕在進(jìn)行不斷地刷新——不斷地快速切換靜態(tài)的畫面,由于視覺暫留效應(yīng),給人產(chǎn)生畫面動態(tài)變化的“錯(cuò)覺”。在Scratch中,可以通過舞臺觀察到角色的運(yùn)動等動態(tài)效果,那么,Scratch的舞臺是否也可以看做是一個(gè)小屏幕呢?本文將對于Scratch舞臺的刷新機(jī)制進(jìn)行討論。”
在淺談Scratch的舞臺刷新機(jī)制 Part 1——自制積木的不刷新屏幕功能一文中,介紹了“運(yùn)行時(shí)不刷新屏幕”功能的原理及其應(yīng)用。此外,關(guān)于舞臺的刷新機(jī)制,在一般積木中也有涉及,本文將會討論舞臺的刷新機(jī)制在一般積木中的應(yīng)用及其實(shí)現(xiàn)原理。
01
案例演示
舞臺通過不斷刷新,才能讓用戶看到角色的變化,不論是運(yùn)動也好,造型也罷,可以說舞臺刷新是Scratch重要的底層功能。那么除了“在運(yùn)行時(shí)不刷新屏幕”還有哪些地方可以利用舞臺的刷新機(jī)制呢?或者說,關(guān)于舞臺的刷新機(jī)制還有哪些tips呢?別急,我們對于舞臺的刷新機(jī)制還不夠了解,先來思考一個(gè)問題。
為什么【重復(fù)執(zhí)行】配合【移動()步】積木可以實(shí)現(xiàn)角色在舞臺上移動的效果呢?為什么我們可以看到角色移動的過程呢?為什么角色不是“嗖”一下就從舞臺左側(cè)閃到舞臺右側(cè)呢?也許初學(xué)者會被這樣告知,是因?yàn)槌绦虻膱?zhí)行有一個(gè)延遲時(shí)間,每次移動都會延遲一小會兒,這樣就能看到移動的過程了。那么這種說法是否正確呢?再來看兩段代碼吧
右轉(zhuǎn)90度,循環(huán)4次
右轉(zhuǎn)90度,順序執(zhí)行
兩段代碼在邏輯上可以說是一樣的,他們的運(yùn)行結(jié)果也是一樣的,那展示它們到底意義何在?
循環(huán)結(jié)構(gòu)效果
順序結(jié)構(gòu)效果
盡管兩段代碼在邏輯上幾乎一致,結(jié)果也一模一樣,但是他們的運(yùn)行過程有著天壤之別。在循環(huán)結(jié)構(gòu)中,可以看到角色旋轉(zhuǎn)的過程,而在順序結(jié)構(gòu)中,程序像是沒有執(zhí)行。
02
解釋
結(jié)合上一篇中關(guān)于“運(yùn)行時(shí)不刷新屏幕”功能的講解,對于這個(gè)現(xiàn)象應(yīng)該并不陌生,也很好解釋,其實(shí)程序是執(zhí)行了的,只是在執(zhí)行時(shí)沒有刷新屏幕罷了,依次右轉(zhuǎn)四次,剛好是一周,又回到了原來的位置,盡管執(zhí)行完畢后舞臺進(jìn)行了一次刷新,但是“為時(shí)已晚”,看起來程序像是未曾運(yùn)行過一般。
基于這兩種不同的現(xiàn)象,我的推論是,順序結(jié)構(gòu)的代碼,在執(zhí)行過程中,都不會刷新舞臺,只有在執(zhí)行完最后一塊積木后,才會進(jìn)行刷新;而循環(huán)結(jié)構(gòu)的代碼,每一輪循環(huán)都會刷新一次舞臺,如循環(huán)結(jié)構(gòu)中角色的旋轉(zhuǎn)效果,每執(zhí)行完一次右轉(zhuǎn)的代碼,當(dāng)輪循環(huán)結(jié)束,舞臺刷新一次,如此我們就會看到角色旋轉(zhuǎn)的過程了。循環(huán)結(jié)構(gòu)不能單獨(dú)存在,循環(huán)結(jié)構(gòu)中必然包含順序結(jié)構(gòu),所以本質(zhì)還是順序結(jié)構(gòu)執(zhí)行完后對舞臺進(jìn)行刷新。
03
延伸
在順序結(jié)構(gòu)中,程序必然是只有執(zhí)行完最后一塊積木才會刷新舞臺嗎?這種說法,可以說對,也可以說不對。
【等待()秒】積木對于順序結(jié)構(gòu)中舞臺刷新的影響
即使是在順序結(jié)構(gòu)中,代碼也不總是只有執(zhí)行完最后一塊積木才刷新舞臺的,【等待()秒】積木可以打破這種順序結(jié)構(gòu)中不刷新屏幕的默契,強(qiáng)行使其刷新,類似地,其他還有【等待()】(條件成立)積木、【說()()秒】積木、【思考()()秒】積木,凡是會使程序進(jìn)入“阻塞”狀態(tài)的積木,都會使屏幕刷新。寫到這里我忽然恍然大悟,對于舞臺刷新的認(rèn)識,更加證實(shí)了我之前對于【等待()】(條件成立)積木的認(rèn)識,也就是在2.0中我們熟悉的【在()之前一直等待】積木。篇幅有限,亦不是主題,直接上結(jié)論:【等待()】(條件成立)積木的本質(zhì)就是【重復(fù)執(zhí)行直到()】積木的變形。
【等待】的本質(zhì)是循環(huán)執(zhí)行一段空的代碼,直到條件成立,跳出循環(huán)
如圖所示兩段代碼首先在效果上是完全等價(jià)的,其次表現(xiàn)也是完全一樣的。在Scratch中,只有正在執(zhí)行的代碼才出現(xiàn)高亮黃色邊緣,三種循環(huán)如此,各種等待積木亦是如此。因此【等待】積木的本質(zhì)是循環(huán)執(zhí)行一段空的代碼,直到條件成立,跳出循環(huán)。現(xiàn)在又多了一條理由:循環(huán)結(jié)構(gòu)的代碼才會在程序執(zhí)行過程中不斷刷新屏幕,【等待】積木會在順序結(jié)構(gòu)中強(qiáng)制刷新屏幕,因此【等待】的本質(zhì)就是循環(huán)。還可以推斷出如下結(jié)論:
【等待()秒】的本質(zhì)也是等待條件成立,只不過在這里條件是時(shí)間
【等待()秒】也可以看做是一種循環(huán)
回到我們的主題——舞臺刷新,為何那些使程序進(jìn)入阻塞狀態(tài)的積木,如等待()秒,也可以使舞臺刷新,現(xiàn)在看來似乎是理所應(yīng)當(dāng)?shù)牧?,因?yàn)樗麄兊谋举|(zhì)都是循環(huán)。
至于【重復(fù)執(zhí)行】配合【移動()步】積木可以讓用戶看到角色在舞臺上移動的過程,其原因確實(shí)是由于循環(huán)結(jié)構(gòu)導(dǎo)致的,每移動一次,完成一輪循環(huán),舞臺就刷新一次,周而復(fù)始,用戶就可以觀察到角色移動的過程了。
04
辟謠
至于延遲時(shí)間的說法,其實(shí)是由于在循環(huán)時(shí),舞臺會被刷新,刷新舞臺才能看出移動的過程。而在刷新舞臺的過程中,有一個(gè)附贈品——時(shí)間的消耗,刷新舞臺需要消耗一定的計(jì)算資源,計(jì)算機(jī)在執(zhí)行更底層的舞臺重繪時(shí)需要花費(fèi)一定的時(shí)間。這僅僅是舞臺刷新的一個(gè)附贈品,而舞臺刷新的真正任務(wù)是使用戶觀測到角色的運(yùn)動過程,因此那些關(guān)于積木內(nèi)部延遲時(shí)間的討論并無意義,其實(shí)測算出來的是舞臺刷新所需的時(shí)間。就如A直接產(chǎn)生B現(xiàn)象,A又順帶產(chǎn)生了C現(xiàn)象,人們觀測到了C現(xiàn)象,就直接下定論說是C導(dǎo)致B。這是一種人們在探索未知領(lǐng)域中常犯的錯(cuò)誤,也許本文所討論的、得出的結(jié)論亦是一種類似這樣的錯(cuò)誤也說不定呢?
05
應(yīng)用1
總結(jié)了這么多看似沒有實(shí)際用處的推論,總該寫一些具有使用價(jià)值的東西了吧?
污漬擦除
抹布角色帶有一個(gè)和背景顏色相同的純色塊造型
根據(jù)上文得出的結(jié)論,順序結(jié)構(gòu)不刷新舞臺,因此切換成純色塊造型時(shí),舞臺是沒有刷新的,用戶也是看不到效果的。在執(zhí)行完移到鼠標(biāo)時(shí)針和圖章的代碼后,舞臺依舊沒有刷新,最后切換回抹布造型,這時(shí)候順序結(jié)構(gòu)執(zhí)行完畢,刷新舞臺,用戶只能看到最終的造型——抹布,而看不到之前的造型切換過程。而在執(zhí)行圖章代碼時(shí),在舞臺中留下的“印記”是“當(dāng)前”造型,也就是純色塊,因此抹布能將純色涂抹在舞臺中,實(shí)現(xiàn)遮蓋住污漬的效果,而自身造型看起來不發(fā)生改變。
06
應(yīng)用2
接下來介紹另一個(gè)關(guān)于舞臺刷新的應(yīng)用技巧——碰撞塊
在制作案例時(shí),尤其是一些游戲類的案例,常常會用到碰撞偵測,在角色碰到其他對象時(shí),通過后續(xù)代碼控制其相應(yīng)的行為。而角色往往又不是一些常規(guī)的幾何圖形,邊緣不光整,所以在碰撞偵測時(shí)會產(chǎn)生穿墻BUG,面對這種情況,我們可以使用一種我稱之為碰撞塊的技巧。以坦克對戰(zhàn)為例:
在控制坦克移動時(shí),一旦碰到墻壁,則后退一定距離,但是由于坦克是個(gè)不規(guī)則圖形,往往在實(shí)際操作中會倒退進(jìn)墻壁內(nèi)部從而產(chǎn)生穿墻BUG
解決方法是給坦克創(chuàng)建一個(gè)邊緣規(guī)則的“碰撞塊”造型
在執(zhí)行碰撞偵測等代碼之前,先切換成碰撞塊造型,在最后將造型切換回坦克造型即可。此時(shí)在用戶眼前呈現(xiàn)的始終是坦克的造型,而在執(zhí)行中間的代碼時(shí)卻是以碰撞塊造型去進(jìn)行碰撞偵測的,不會產(chǎn)生穿墻BUG
聲明:本文章由網(wǎng)友投稿作為教育分享用途,如有侵權(quán)原作者可通過郵件及時(shí)和我們聯(lián)系刪除

- 上一篇
教你用Scratch做垃圾分類
前不久,上海出臺了“史上最嚴(yán)”垃圾回收,一時(shí)間群眾叫苦連天,緊接著,烏魯木齊市為全國46個(gè)垃圾分類重點(diǎn)城市之一,垃圾分類已經(jīng)刻不容緩。 垃圾分類要從娃娃抓起,所以,今天邢老師結(jié)合Scratch,教會你如何垃圾分類
- 下一篇
什么是scratch???
這么久以來公眾號一直沒有更新,沒有給大家?guī)砀嚓P(guān)于科技教育的咨詢,對大家說聲抱歉。 歡迎大家對scratch少兒編程課了解,scratch課程通過視頻和圖文的方式進(jìn)行。但是對于新的科技課程,很多家長只聽說過,或者有些陌生,在教育的過程中很多家長孩子有很多疑問,今天