欢迎光临散文网 会员登陆 & 注册

egret白鹭引擎绘画程序,实现撤销,重做,历史记录功能

2022-03-30 17:10 作者:-千里马-  | 我要投稿

 就在最近几天我在做游戏的场景编辑器,场景编辑器的绘画场景功能需要有一个绘画系统,绘画系统前半部分笔刷配置等等各种东西都做完了就差历史记录和非常关键的功能ctrl+z撤销,ctrl+shift+z重做了。

这三个功能的重要程度有多高呢?基本上每个比较专业一点的生产力软件都标准配备的,不分公司还是操作系统还是各种应用程序,乃至于所有生产软件都有的一种通用性非常强的功能。

 

 那么我是怎么实现的呢?

首先所有的绘画功能函数类等等系统都已经比较完备了,可以直接调用其中的接口进行各种程序绘画的工作。

而这三个功能是建立在这些基础功能之上的所以我就用继承的面向对象方法继承一层历史记录系统。

 让我们分析一下,历史记录的本质,其实不管是撤销还是重做都是建立在历史记录功能上的,所以我就进行优先制作历史记录功能。然后开发撤销,重做。

我的实现方法是先让绘画类有一个信息提供的基础,比如我现在用的什么笔刷,画的这一笔画了多少个点,点都在什么位置,每画一笔我都会记录每一笔的记录然后存起来。

这样历史记录层就可以看见每一笔的记录都有什么内容,能够保存起来,这时候就分化出了两种不同的历史记录解决方案。

 先说第一种,每次撤销重做记录都进行一遍绘画到当前选择点的绘画流程渲染,很显然这样对性能消耗很高,所以我就直接在抬起画笔位置进行保存一遍当前画布的texture纹理到数组里面。

这是第二种方案了,texture纹理占用空间也不会特别大,毕竟没有渲染就是挂到内存里面罢了,而且现在电子设备的内存容量相比以前已经非常大幅度提升了,至少可以存到1万步记录。所以嘛,我就把所有记录的纹理texture都放到一个数组里面,每次打开绘画文件的时候就进行遍历一次,存入每一步记录到texture数组。

这时候撤销和重做功能也就有了基础的提供,撤销就是减去一步绘画内容,重做就是添加一步绘画内容,不过这里要注意了,历史记录不能删除,不过可以覆盖,指定当前指示绘画笔画点的位置就可以了。

所以就这样完美的实现了历史记录,重做,撤销功能,比较简单,没有复杂的算法。


egret白鹭引擎绘画程序,实现撤销,重做,历史记录功能的评论 (共 条)

分享到微博请遵守国家法律