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

極客小將

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

資訊內(nèi)容

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

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

?簡單來說,我們之所以能從各種屏幕上看到畫面的動態(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è)問題。

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

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

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

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

upload/article/images/2021-01-13/4f21782b04273b44f0f2318a24d25704.jpg

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

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

https://cdn.china-scratch.com/timg/190803/1320554T6-4.gif

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

https://cdn.china-scratch.com/timg/190803/1320562302-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í)不刷新屏幕”功能的講解,對于這個(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í)行完最后一塊積木才會刷新舞臺嗎?這種說法,可以說對,也可以說不對。

https://cdn.china-scratch.com/timg/190803/13205A394-6.gif

【等待()秒】積木對于順序結(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í)行直到()】積木的變形。

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

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

upload/article/images/2021-01-13/43ce3f8d1fa0edba5ed3348e70c0f24c.jpg

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

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


upload/article/images/2021-01-13/8439fab17920933bc0cef91251b4abcf.jpg

【等待()秒】也可以看做是一種循環(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ò)誤也說不定呢?https://cdn.china-scratch.com/Public/Home/images/grey.gif


05

應(yīng)用1

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

https://cdn.china-scratch.com/timg/190803/13205a339-13.gif

污漬擦除

upload/article/images/2021-01-13/091f0e8840847983bafcd52f555ec7de.jpg

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

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

根據(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)為例:

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

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

upload/article/images/2021-01-13/061e1f23e186670498de7b208082c989.jpg

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

upload/article/images/2021-01-13/3f264b3cc2936d2016883ca9367fb4fb.jpg

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

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

預(yù)約試聽課

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

主站蜘蛛池模板: 垦利县| 仪征市| 桐梓县| 淅川县| 英山县| 天峻县| 晋州市| 财经| 新龙县| 龙门县| 余干县| 宜黄县| 德惠市| 潞西市| 中牟县| 西丰县| 巴楚县| 虞城县| 轮台县| 灵丘县| 丹棱县| 巴青县| 深州市| 扎鲁特旗| 金阳县| 台北市| 印江| 云霄县| 县级市| 九江县| 建宁县| 慈溪市| 怀仁县| 中宁县| 邻水| 潞城市| 大埔县| 三穗县| 锡林郭勒盟| 元阳县| 营口市|