“退回到上一步”的功能,大体思路是这样的:将每一次涂色后的相关数据压栈,点击回退时,从栈中取出数据,根据这些数据恢复上一次的样子。思路很简单,可是,压入栈中的数据应该是什么呢?我这里压入的是鼠标点击的点坐标和这个点所在的封闭区域的颜色值,坐标好办,但是如何知道颜色值呢?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