节点递归变灰精灵跟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;
 }


转载于:https://my.oschina.net/rexblog/blog/390602

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值