egret白鷺引擎繪畫程序,實現(xiàn)撤銷,重做,歷史記錄功能
?就在最近幾天我在做游戲的場景編輯器,場景編輯器的繪畫場景功能需要有一個繪畫系統(tǒng),繪畫系統(tǒng)前半部分筆刷配置等等各種東西都做完了就差歷史記錄和非常關(guān)鍵的功能ctrl+z撤銷,ctrl+shift+z重做了。

這三個功能的重要程度有多高呢?基本上每個比較專業(yè)一點的生產(chǎn)力軟件都標(biāo)準(zhǔn)配備的,不分公司還是操作系統(tǒng)還是各種應(yīng)用程序,乃至于所有生產(chǎn)軟件都有的一種通用性非常強的功能。


?
?那么我是怎么實現(xiàn)的呢?
首先所有的繪畫功能函數(shù)類等等系統(tǒng)都已經(jīng)比較完備了,可以直接調(diào)用其中的接口進(jìn)行各種程序繪畫的工作。
而這三個功能是建立在這些基礎(chǔ)功能之上的所以我就用繼承的面向?qū)ο蠓椒ɡ^承一層歷史記錄系統(tǒng)。

?讓我們分析一下,歷史記錄的本質(zhì),其實不管是撤銷還是重做都是建立在歷史記錄功能上的,所以我就進(jìn)行優(yōu)先制作歷史記錄功能。然后開發(fā)撤銷,重做。
我的實現(xiàn)方法是先讓繪畫類有一個信息提供的基礎(chǔ),比如我現(xiàn)在用的什么筆刷,畫的這一筆畫了多少個點,點都在什么位置,每畫一筆我都會記錄每一筆的記錄然后存起來。
這樣歷史記錄層就可以看見每一筆的記錄都有什么內(nèi)容,能夠保存起來,這時候就分化出了兩種不同的歷史記錄解決方案。

?先說第一種,每次撤銷重做記錄都進(jìn)行一遍繪畫到當(dāng)前選擇點的繪畫流程渲染,很顯然這樣對性能消耗很高,所以我就直接在抬起畫筆位置進(jìn)行保存一遍當(dāng)前畫布的texture紋理到數(shù)組里面。
這是第二種方案了,texture紋理占用空間也不會特別大,畢竟沒有渲染就是掛到內(nèi)存里面罷了,而且現(xiàn)在電子設(shè)備的內(nèi)存容量相比以前已經(jīng)非常大幅度提升了,至少可以存到1萬步記錄。所以嘛,我就把所有記錄的紋理texture都放到一個數(shù)組里面,每次打開繪畫文件的時候就進(jìn)行遍歷一次,存入每一步記錄到texture數(shù)組。
這時候撤銷和重做功能也就有了基礎(chǔ)的提供,撤銷就是減去一步繪畫內(nèi)容,重做就是添加一步繪畫內(nèi)容,不過這里要注意了,歷史記錄不能刪除,不過可以覆蓋,指定當(dāng)前指示繪畫筆畫點的位置就可以了。
所以就這樣完美的實現(xiàn)了歷史記錄,重做,撤銷功能,比較簡單,沒有復(fù)雜的算法。