节点递归变灰精灵跟ui控件(支持9宫图) --lua

--引擎3.3final版本
--
-- Author: rex
-- Date: 2015-02-26 17:11:29
--
local shaderHelper = shaderHelper or {}

function shaderHelper:grayNode(node)
    if node and type(node) == "userdata" then
        --创建现有系统变灰fiter
        local fiter = cc.GrayFilter:create()
    	fiter:initSprite(nil)
    	--判断是否ui控件
    	if node.getVirtualRenderer then
            --9宫图获取9宫图中的sprite,注:getProtectedChildren方法自己在引擎中添加
    	    if node.isScale9Enabled ~= nil and node:isScale9Enabled() then
    		local sp_children = node:getVirtualRenderer():getProtectedChildren()			
    		for k,v in pairs(sp_children) do
    		    self:grayNode(v)
    	        end
    	    else
    	   	node:getVirtualRenderer():getSprite():setGLProgram(fiter:getProgram())
    	    end
    	else
    	   node:setGLProgram(fiter:getProgram())
    	end
    		
    	local children = node:getChildren()
    	for k,v in pairs(children) do
    	   self:grayNode(v)
    	end
   end
end

--清除shader效果
function shaderHelper:clearnShader(node)
    if node and type(node) == "userdata" then
	if node.getVirtualRenderer then
	    if node.isScale9Enabled ~= nil and node:isScale9Enabled() then
		local sp_children = node:getVirtualRenderer():getProtectedChildren()			
		for k,v in pairs(sp_children) do
		    self:clearnShader(v)
		end
	    else
	   	node:getVirtualRenderer():getSprite():setGLProgram(cc.GLProgramCache:getInstance():getGLProgram("ShaderPositionTextureColor_noMVP"))
	    end
	else
	  node:setGLProgram(cc.GLProgramCache:getInstance():getGLProgram("ShaderPositionTextureColor_noMVP"))
	end
	local children = node:getChildren()
	for k,v in pairs(children) do
	   self:clearnShader(v)
	end
    end
end

return shaderHelper

注意:--getProtectedChildren 该方法是在源码库Scale9Sprite类自己添加,并且导出lua使用 C++代码如下 

Vector<Node*> Scale9Sprite::getProtectedChildren()const
 {
  return _protectedChildren;
 }


你可能感兴趣的:(变灰,9宫图变灰)