克隆技術是時下熱門的Scratch少兒編程考試或者競賽必須面對的重點與難點之一。本文試圖從較高的層面探討Scratch編程中克隆技術的本質,並進一步把克隆技術的應用劃分爲兩大類型——共享數據克隆體和非共享數據克隆體,最後給出各自的應用舉例。編程
對於初、高中對面向對象編程概念沒有基礎的小朋友,能夠略過本註釋的閱讀轉而進行第二小節的閱讀。熟悉其餘高級編程語言的朋友都瞭解面向對象編程,其三種特徵(封裝、繼承與多態)都在Scratch中獲得很是天然與形象的體現。在此暫不贅述,有興趣的朋友可多多聯繫這些概念,從而更有助於理解Scratch中的克隆技術。小程序
編程中,當須要大量類似的精靈完成類似的任務時,建議主動考慮使用克隆技術。其實,經過大量應用克隆技術的案例分析後,整體概括一下,克隆體不外乎以下兩大種類型:數據結構
在之後的文章中我會經過全面的應用實例來展現這裏的結論。在本篇中,咱們僅經過典型的小例來講明問題。編程語言
這種類型的克隆體不須要共享信息,所以這種狀況下問題比較簡單。ide
製做非共享數據克隆體的一種方法是根據建立克隆體的順序爲每一個克隆體指定一個標識號。且看下面的舉例運行時截圖。設計
一、快照3d
設計想法是:當遊戲開始時(點擊綠色小旗子),母體(黃頭貓)生成本身的三個克隆體,並在不一樣位置顯示;而後各自發言。造型設計以下:對象
下面,咱們來看相應的編程實現。
二、編程分析
首先,須要定義如下變量:blog
先來看母體代碼:繼承
如前所述,當點擊綠色小旗開始程序執行時,母體生成三個克隆體。
【問題】爲何上面的變量定義爲局部變量?其實,看過我前面文章( http://www.javashuo.com/article/p-uyswxyjc-de.html Scratch高級編程之妙用變量管理母體與克隆體 )的朋友均可能理解了在克隆體編程中局部變量與全局變量在克隆體編程中的奇妙做用。稍後的代碼中還會說明這一點。
接下來,咱們分別爲每一個克隆對象啓動下面腳本(積木【看成爲克隆體運行時】的做用):
你們先略過代碼【說(你好)】這一句,往下看。意思是:根據變量lvID的當前值,克隆體切換成不一樣的對應造型並修改自身其餘屬性。
【問題】若是有須要全部的克隆體當即都要作的事情,怎麼辦?
【方法一】如上面代碼所示,能夠在條件語句以前放置相應的命令塊(此處只有一句問好)。
【方法二】或者說是更推薦的作法是,將這些命令塊放在另外一個「看成爲克隆體啓動時」中。
【小結】至此,咱們實現了既定目標:根據指定順序生成克隆體對象。
接下來,咱們來簡單介紹一下局部變量與全局變量在克隆體編程中的區別。這裏只使用代碼展現一下:
首先,在母體角色(黃頭貓)引入一個全局類型變量「gv克隆體計數器」。簡單修改一下母體代碼以下:
意思暫時不用解釋了。接下來,添加以下代碼:
咱們想點擊每一隻貓時讓它說出對應的數據,顯然觸發器「看成爲克隆體啓動時」中的代碼塊只有克隆體執行,而其餘地方的代碼母體與克隆體都要執行。所以,上面的代碼是母體與克隆體都要執行的。
執行結果截圖以下:
綠貓一開始說出本身的「lvID」值,稍後說出全局變量「gv克隆體計數器」的值,以下圖:
點小紅貓,顯示以下:
其餘省略......
熟悉面向對象編程的朋友,若是結合變量(也稱做「屬性」)的繼承來理解這裏公有變量與私有變量區別的話,相對更容易一些。
在更多狀況下,例如在開發炮塔類遊戲的狀況下,方向、造型及其餘屬性的組合很是之多,簡直數不勝數。在這種狀況下,典型的方法是將這些屬性(方向、造型等)直接定義爲一些全局變量——這些變量不屬於某一種角色,從而使得各類遊戲角色(包括各類角色的克隆體)均可以操做這些變量。雖然這樣的方案(定義不少的全局變量)也帶來總體數據管理的複雜性,但這種辦法也確實是由軟件自己的複雜性和Scratch的侷限性不得已而肯定的。
接下來的代碼片段中,咱們只做部分關鍵代碼的展現,在之後的文章中我還會開發出完整的小遊戲來展現這些技術的應用。下面是一個簡單的空戰小遊戲的截圖(尚不完善,因此只給出與本文主題直接相關的代碼分析)。
簡單快照
固然,實際空戰遊戲中,會有我方與敵方的許多戰機(以及類型),子彈或者炮彈數量及類型更多是不少種且數量更大。
數據結構定義
基於上面分析,咱們須要針對子彈的多種屬性建立許多全局變量(而不是局部於子彈角色的局部變量!)。在本例中,將使用如下定義:
關鍵代碼一
每當想讓我方戰機角色開始射擊時,能夠把下面腳本放在某個觸發器中(好比在按下空格鍵以後,或者某種狀況下):
再看子彈角色造型設計:
固然,爲了簡化問題,咱們只設計了兩種造型:一種是我方子彈,一種是敵方子彈。
關鍵代碼二
相應於上面的代碼,做爲子彈角色,典型的克隆體執行代碼設計多是:
至此,咱們給出非共享數據克隆體w使用的第二種更典型的情形分析。
接下來,咱們來看相對複雜的共享數據克隆體應用的狀況。
如前所述,本節中討論的「共享數據克隆體」是指其餘精靈(包括母體精靈)或克隆體須要訪問當前克隆體的私有數據,例如它的位置、造型名稱與編號等。
這裏提供一種通用技巧就是,將克隆體的各私有數據存儲在若干個對應的全局列表中,從而實現其餘精靈能夠訪問特定克隆體的特定數據(屬性值)。
由於本處的例子也是小例,可是爲了有助於後面理解,先上運行時快照的第一個。
注意:本例中,母體是老黃貓!
要建立共享數據類型的克隆體,須要如下數據結構:
本代碼實現了三點主要功能:
(1)母貓站在舞臺左上角(說出本身的身份),兩個全局變量初始化
(2)經過執行4次的循環,建立4個克隆體,並初始化一個(這裏只有一個!)全局列表變量
(3)還原母體造型(由於通過循環中的不斷切換造型的克隆操做後,母體造型有所改變)
【問題1】爲何這裏造型名稱列表內容是空的?
【問題2】私有變量「lv克隆體編號」爲何沒有在這裏露頭?
含義:每隻小貓變得小些;私有變量「lv克隆體編號」在此出現,用於存儲當前克隆個體編號(這個編號正在存儲在產生本個體時的全局變量中)。而後,調整一下自身位置,並報出本身的個體編號。最後一句比較關鍵:把當前克隆體造型名稱存儲在全局列表變量中。
【思考】上述代碼中,可否把最後一句中的變量「lv克隆體編號」使用全局變量「gv克隆體計數器」代替?爲何?
很簡單,當點擊任何角色(包括母體)時,報出本身的造型名稱。
【問題】當點擊母體時,報出本身的造型名稱是否正確?根據Scratch支持特徵,儘管母體中仍然能夠訪問私有變量「lv克隆體編號」的值,可是其含義已經「歪曲」了!請認真思考。固然,有「面向對象編程」概念基礎的朋友,是不難理解這個問題的。
由上面第三段代碼知,咱們的設計目的是:當用戶按下空格鍵時,讓2號小貓思考「媽媽在哪?」這個問題,並經過Scratch消息廣播技術尋找媽媽。
在第四段代碼中,媽媽接收消息時,報出本身的身份。
乍看起來有點複雜,可是結合我前面發的兩篇克隆文章並結合本文前面的介紹,在真正理解了全局變量與私有(也稱「局部」)變量在克隆技術中的特殊用法後,上面的問題確定會豁然開朗。有關截圖以下:
小貓思考:
貓媽媽迴應:
其實,咱們還能夠將兩種克隆體結合起來使用,在共享數據的同時建立不一樣類別的克隆體,從而建立功能更強大的遊戲、創新創意小程序……
本文結合Scratch克隆體應用的各類情形,大膽地把克隆體使用的各類場景歸結爲兩種類型,即「共享數據克隆體」和「非共享數據克隆體」,並給出各自的應用舉例。實踐需求是複雜的,也靈活多變。此外,咱們還有可能將兩種克隆體結合起來使用,便可以在共享數據的同時建立不一樣類別的克隆體,從而建立功能更強大的程序。本文中如有概念或結論不當之處,請讀者朋友批評指正!
(https://blog.51cto.com/cloumn/detail/88 本人拙做,歡迎交流)