国产日韩欧美一区二区三区综合,日本黄色免费在线,国产精品麻豆欧美日韩ww,色综合狠狠操

極客小將

您現(xiàn)在的位置是:首頁 » scratch編程資訊

資訊內(nèi)容

淺談Scratch的舞臺(tái)刷新機(jī)制 Part 2——在常規(guī)積木中的應(yīng)用

極客小將2021-01-13-
“?簡單來說,我們之所以能從各種屏幕上看到畫面的動(dòng)態(tài)變化,都是由于屏幕在進(jìn)行不斷地刷新——不斷地快速切換靜態(tài)的畫面,由于視覺暫留效應(yīng),給人產(chǎn)生畫面動(dòng)態(tài)變化的“錯(cuò)覺”。在Scratch中,可以通過舞臺(tái)觀察到角色的運(yùn)動(dòng)等動(dòng)態(tài)效果,那么,Scratch的舞臺(tái)是

?簡單來說,我們之所以能從各種屏幕上看到畫面的動(dòng)態(tài)變化,都是由于屏幕在進(jìn)行不斷地刷新——不斷地快速切換靜態(tài)的畫面,由于視覺暫留效應(yīng),給人產(chǎn)生畫面動(dòng)態(tài)變化的“錯(cuò)覺”。在Scratch中,可以通過舞臺(tái)觀察到角色的運(yùn)動(dòng)等動(dòng)態(tài)效果,那么,Scratch的舞臺(tái)是否也可以看做是一個(gè)小屏幕呢?本文將對(duì)于Scratch舞臺(tái)的刷新機(jī)制進(jìn)行討論。

在淺談Scratch的舞臺(tái)刷新機(jī)制 Part 1——自制積木的不刷新屏幕功能一文中,介紹了“運(yùn)行時(shí)不刷新屏幕”功能的原理及其應(yīng)用。此外,關(guān)于舞臺(tái)的刷新機(jī)制,在一般積木中也有涉及,本文將會(huì)討論舞臺(tái)的刷新機(jī)制在一般積木中的應(yīng)用及其實(shí)現(xiàn)原理。


01

案例演示

舞臺(tái)通過不斷刷新,才能讓用戶看到角色的變化,不論是運(yùn)動(dòng)也好,造型也罷,可以說舞臺(tái)刷新是Scratch重要的底層功能。那么除了“在運(yùn)行時(shí)不刷新屏幕”還有哪些地方可以利用舞臺(tái)的刷新機(jī)制呢?或者說,關(guān)于舞臺(tái)的刷新機(jī)制還有哪些tips呢?別急,我們對(duì)于舞臺(tái)的刷新機(jī)制還不夠了解,先來思考一個(gè)問題。

upload/article/images/2021-01-13/7fad044b0e42bae156082e0aa5d80e1c.jpg

為什么【重復(fù)執(zhí)行】配合【移動(dòng)()步】積木可以實(shí)現(xiàn)角色在舞臺(tái)上移動(dòng)的效果呢?為什么我們可以看到角色移動(dòng)的過程呢?為什么角色不是“嗖”一下就從舞臺(tái)左側(cè)閃到舞臺(tái)右側(cè)呢?也許初學(xué)者會(huì)被這樣告知,是因?yàn)槌绦虻膱?zhí)行有一個(gè)延遲時(shí)間,每次移動(dòng)都會(huì)延遲一小會(huì)兒,這樣就能看到移動(dòng)的過程了。那么這種說法是否正確呢?再來看兩段代碼吧https://cdn.china-scratch.com/Public/Home/images/grey.gif

upload/article/images/2021-01-13/043b9ea6532c6b1c21f2b22912d0b8ff.jpg

右轉(zhuǎn)90度,循環(huán)4次

upload/article/images/2021-01-13/ff75e0cae9f9ecb66a3042e6e2e6f796.jpg

右轉(zhuǎn)90度,順序執(zhí)行

兩段代碼在邏輯上可以說是一樣的,他們的運(yùn)行結(jié)果也是一樣的,那展示它們到底意義何在?

https://cdn.china-scratch.com/timg/190801/1334252D7-4.gif

循環(huán)結(jié)構(gòu)效果

https://cdn.china-scratch.com/timg/190801/1334261502-5.gif

順序結(jié)構(gòu)效果

盡管兩段代碼在邏輯上幾乎一致,結(jié)果也一模一樣,但是他們的運(yùn)行過程有著天壤之別。在循環(huán)結(jié)構(gòu)中,可以看到角色旋轉(zhuǎn)的過程,而在順序結(jié)構(gòu)中,程序像是沒有執(zhí)行。


02

解釋

結(jié)合上一篇中關(guān)于“運(yùn)行時(shí)不刷新屏幕”功能的講解,對(duì)于這個(gè)現(xiàn)象應(yīng)該并不陌生,也很好解釋,其實(shí)程序是執(zhí)行了的,只是在執(zhí)行時(shí)沒有刷新屏幕罷了,依次右轉(zhuǎn)四次,剛好是一周,又回到了原來的位置,盡管執(zhí)行完畢后舞臺(tái)進(jìn)行了一次刷新,但是“為時(shí)已晚”,看起來程序像是未曾運(yùn)行過一般。

基于這兩種不同的現(xiàn)象,我的推論是,順序結(jié)構(gòu)的代碼,在執(zhí)行過程中,都不會(huì)刷新舞臺(tái),只有在執(zhí)行完最后一塊積木后,才會(huì)進(jìn)行刷新;而循環(huán)結(jié)構(gòu)的代碼,每一輪循環(huán)都會(huì)刷新一次舞臺(tái),如循環(huán)結(jié)構(gòu)中角色的旋轉(zhuǎn)效果,每執(zhí)行完一次右轉(zhuǎn)的代碼,當(dāng)輪循環(huán)結(jié)束,舞臺(tái)刷新一次,如此我們就會(huì)看到角色旋轉(zhuǎn)的過程了。循環(huán)結(jié)構(gòu)不能單獨(dú)存在,循環(huán)結(jié)構(gòu)中必然包含順序結(jié)構(gòu),所以本質(zhì)還是順序結(jié)構(gòu)執(zhí)行完后對(duì)舞臺(tái)進(jìn)行刷新。


03

延伸

在順序結(jié)構(gòu)中,程序必然是只有執(zhí)行完最后一塊積木才會(huì)刷新舞臺(tái)嗎?這種說法,可以說對(duì),也可以說不對(duì)。

https://cdn.china-scratch.com/timg/190801/13342G055-6.gif

【等待()秒】積木對(duì)于順序結(jié)構(gòu)中舞臺(tái)刷新的影響

即使是在順序結(jié)構(gòu)中,代碼也不總是只有執(zhí)行完最后一塊積木才刷新舞臺(tái)的,【等待()秒】積木可以打破這種順序結(jié)構(gòu)中不刷新屏幕的默契,強(qiáng)行使其刷新,類似地,其他還有【等待()】(條件成立)積木、【說()()秒】積木、【思考()()秒】積木,凡是會(huì)使程序進(jìn)入“阻塞”狀態(tài)的積木,都會(huì)使屏幕刷新。寫到這里我忽然恍然大悟,對(duì)于舞臺(tái)刷新的認(rèn)識(shí),更加證實(shí)了我之前對(duì)于【等待()】(條件成立)積木的認(rèn)識(shí),也就是在2.0中我們熟悉的【在()之前一直等待】積木。篇幅有限,亦不是主題,直接上結(jié)論:【等待()】(條件成立)積木的本質(zhì)就是【重復(fù)執(zhí)行直到()】積木的變形。

upload/article/images/2021-01-13/d4f12ca1455ea081b2ead8ca6e5bb9bf.jpg

upload/article/images/2021-01-13/72ce2b785c897c6b69f818351f90f732.jpg

【等待】的本質(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)的代碼才會(huì)在程序執(zhí)行過程中不斷刷新屏幕,【等待】積木會(huì)在順序結(jié)構(gòu)中強(qiáng)制刷新屏幕,因此【等待】的本質(zhì)就是循環(huán)。還可以推斷出如下結(jié)論:

upload/article/images/2021-01-13/d32f48008ce39132ab4b26da0897a565.jpg

upload/article/images/2021-01-13/44dacbb4a85481cf87c970f2eac4d3c8.jpg

【等待()秒】的本質(zhì)也是等待條件成立,只不過在這里條件是時(shí)間


upload/article/images/2021-01-13/e9249bf41b375fd75f9fef9eb8e9d607.jpg

【等待()秒】也可以看做是一種循環(huán)

回到我們的主題——舞臺(tái)刷新,為何那些使程序進(jìn)入阻塞狀態(tài)的積木,如等待()秒,也可以使舞臺(tái)刷新,現(xiàn)在看來似乎是理所應(yīng)當(dāng)?shù)牧耍驗(yàn)樗麄兊谋举|(zhì)都是循環(huán)。

至于【重復(fù)執(zhí)行】配合【移動(dòng)()步】積木可以讓用戶看到角色在舞臺(tái)上移動(dòng)的過程,其原因確實(shí)是由于循環(huán)結(jié)構(gòu)導(dǎo)致的,每移動(dòng)一次,完成一輪循環(huán),舞臺(tái)就刷新一次,周而復(fù)始,用戶就可以觀察到角色移動(dòng)的過程了。


04

辟謠

至于延遲時(shí)間的說法,其實(shí)是由于在循環(huán)時(shí),舞臺(tái)會(huì)被刷新,刷新舞臺(tái)才能看出移動(dòng)的過程。而在刷新舞臺(tái)的過程中,有一個(gè)附贈(zèng)品——時(shí)間的消耗,刷新舞臺(tái)需要消耗一定的計(jì)算資源,計(jì)算機(jī)在執(zhí)行更底層的舞臺(tái)重繪時(shí)需要花費(fèi)一定的時(shí)間。這僅僅是舞臺(tái)刷新的一個(gè)附贈(zèng)品,而舞臺(tái)刷新的真正任務(wù)是使用戶觀測到角色的運(yùn)動(dòng)過程,因此那些關(guān)于積木內(nèi)部延遲時(shí)間的討論并無意義,其實(shí)測算出來的是舞臺(tái)刷新所需的時(shí)間。就如A直接產(chǎn)生B現(xiàn)象,A又順帶產(chǎn)生了C現(xiàn)象,人們觀測到了C現(xiàn)象,就直接下定論說是C導(dǎo)致B。這是一種人們?cè)谔剿魑粗I(lǐng)域中常犯的錯(cuò)誤,也許本文所討論的、得出的結(jié)論亦是一種類似這樣的錯(cuò)誤也說不定呢?https://cdn.china-scratch.com/Public/Home/images/grey.gif


05

應(yīng)用1

總結(jié)了這么多看似沒有實(shí)際用處的推論,總該寫一些具有使用價(jià)值的東西了吧?

https://cdn.china-scratch.com/timg/190801/1334302260-13.gif

污漬擦除

upload/article/images/2021-01-13/7ea5344fad06bcc0ab6c2f2edf5d573c.jpg

抹布角色帶有一個(gè)和背景顏色相同的純色塊造型

upload/article/images/2021-01-13/8015a4e06185ced3abbe7a9516f6c2c2.jpg

根據(jù)上文得出的結(jié)論,順序結(jié)構(gòu)不刷新舞臺(tái),因此切換成純色塊造型時(shí),舞臺(tái)是沒有刷新的,用戶也是看不到效果的。在執(zhí)行完移到鼠標(biāo)時(shí)針和圖章的代碼后,舞臺(tái)依舊沒有刷新,最后切換回抹布造型,這時(shí)候順序結(jié)構(gòu)執(zhí)行完畢,刷新舞臺(tái),用戶只能看到最終的造型——抹布,而看不到之前的造型切換過程。而在執(zhí)行圖章代碼時(shí),在舞臺(tái)中留下的“印記”是“當(dāng)前”造型,也就是純色塊,因此抹布能將純色涂抹在舞臺(tái)中,實(shí)現(xiàn)遮蓋住污漬的效果,而自身造型看起來不發(fā)生改變。


06

應(yīng)用2

接下來介紹另一個(gè)關(guān)于舞臺(tái)刷新的應(yīng)用技巧——碰撞塊

在制作案例時(shí),尤其是一些游戲類的案例,常常會(huì)用到碰撞偵測,在角色碰到其他對(duì)象時(shí),通過后續(xù)代碼控制其相應(yīng)的行為。而角色往往又不是一些常規(guī)的幾何圖形,邊緣不光整,所以在碰撞偵測時(shí)會(huì)產(chǎn)生穿墻BUG,面對(duì)這種情況,我們可以使用一種我稱之為碰撞塊的技巧。以坦克對(duì)戰(zhàn)為例:

upload/article/images/2021-01-13/1063e528ace671c6e80c86896c99b236.jpg

在控制坦克移動(dòng)時(shí),一旦碰到墻壁,則后退一定距離,但是由于坦克是個(gè)不規(guī)則圖形,往往在實(shí)際操作中會(huì)倒退進(jìn)墻壁內(nèi)部從而產(chǎn)生穿墻BUG

upload/article/images/2021-01-13/9edd69ce1e4564b856baacb6e2b44c99.jpg

解決方法是給坦克創(chuàng)建一個(gè)邊緣規(guī)則的“碰撞塊”造型

upload/article/images/2021-01-13/199ee299d5bbb1dec724de7bf45d69c4.jpg

在執(zhí)行碰撞偵測等代碼之前,先切換成碰撞塊造型,在最后將造型切換回坦克造型即可。此時(shí)在用戶眼前呈現(xiàn)的始終是坦克的造型,而在執(zhí)行中間的代碼時(shí)卻是以碰撞塊造型去進(jìn)行碰撞偵測的,不會(huì)產(chǎn)生穿墻BUG


在了解了舞臺(tái)刷新機(jī)制及其應(yīng)用技巧后,別忘記額外的小收獲:Scratch中所有的“等待”,也許其實(shí)都是由循環(huán)模擬出來的。

聲明:本文章由網(wǎng)友投稿作為教育分享用途,如有侵權(quán)原作者可通過郵件及時(shí)和我們聯(lián)系刪除

預(yù)約試聽課

已有385人預(yù)約都是免費(fèi)的,你也試試吧...

主站蜘蛛池模板: 衡阳县| 酉阳| 探索| 兴国县| 海口市| 鄂托克旗| 锡林郭勒盟| 吴江市| 屏山县| 喀什市| 陆河县| 昭觉县| 金昌市| 威远县| 双牌县| 大庆市| 黄骅市| 周至县| 泰顺县| 九龙县| 共和县| 宁波市| 开化县| 德昌县| 马关县| 罗城| 交口县| 永修县| 中牟县| 潍坊市| 固镇县| 达拉特旗| 沁源县| 同江市| 乃东县| 辰溪县| 武强县| 若尔盖县| 微山县| 上饶市| 安多县|