关于涂色后“退回到上一步”功能的实现思路

“退回到上一步”的功能,大体思路是这样的:将每一次涂色后的相关数据压栈,点击回退时,从栈中取出数据,根据这些数据恢复上一次的样子。思路很简单,可是,压入栈中的数据应该是什么呢?我这里压入的是鼠标点击的点坐标和这个点所在的封闭区域的颜色值,坐标好办,但是如何知道颜色值呢?quick-cocos-2d-x并没有提供获取当前点的像素值的接口,这就需要一个table来标记每一个区域的颜色值了。那么这样一来,首先需要做的是将图像分割成一个个区域,给每个区域分配一个ID。创建一个markRegionTable用来记录每一个区域当前的颜色。当点击某某个区域时,先获取该区域的ID,然后在markRegionTable[ID]中获取颜色,如果颜色跟当前画笔的颜色不同,则将该颜色压栈,并将markRegionTable[ID]的值修改为当前画笔的颜色值。回退时,取栈顶元素,得到坐标和颜色值,根据坐标给所在区域涂上该颜色就行了。

入栈逻辑大致如下:

local regionId = region_data[x][y] --求出区域ID

markRegionTable = markRegionTable or {}

if not regionId then return end

if markRegionTable[regionId] == nil then

     Stack.push(colorMsgStack, {{x = x, y = y}, 1})

    markRegionTable[regionId] = drawLayer._selectedColor   --drawLayer._selectedColor为画笔颜色

elseif markRegionTable[regionId] ~= drawLayer._selectedColor then

     Stack.push(colorMsgStack, {{x = x, y = y}, markRegionTable[regionId]})

      markRegionTable[regionId] = drawLayer._selectedColor

end

出栈逻辑大致如下:

if event.colorMsg == nil then

      return

end

local x = event.colorMsg[1].x

local y = event.colorMsg[1].y

local regionId = region_data[x][imgTop - y]

local color = event.colorMsg[2]

if not regionId then return end

drawLayer:setColor(color, drawLayer:getRowAndCol(color))

drawLayer:fillColor(x, y)

markRegionTable[regionId] = color

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《ilua》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 1...
    叶染柒丶阅读 13,785评论 0 11
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,723评论 0 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,399评论 19 139
  • 转载请声明 原文链接 关注公众号获取更多资讯 这篇文章主要总结H5的一些新增的功能以及一些基础归纳,这里只是一个提...
    前端进阶之旅阅读 12,957评论 22 225
  • 首页 资讯 文章 资源 小组 相亲 登录 注册 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他...
    Helen_Cat阅读 9,392评论 1 10