cocos2dx的資源文件有兩種存在方式(只代表我在實戰項目中用到的):單個圖片文件和plist文件
因項目原因一個項目中兩種資源形式並存,所以在生成CCSprite時,涉及兩種構建的方式,構建ccsprite的方式不同,對應生成遮罩的方法也不同。Cocos2dx-lua 中提供了生成遮罩的方法,但是在具體的項目中,未必能滿足項目的需求。我所參於的項目是模擬經營類的,需要根據不同圖片,動態生成遮罩,所以使用display.newMaskedSprite(__mask, __pic)時就無法滿足項目需求。接下來我把display.newMaskedSprite改進方法簡單介紹下。
首先生成遮罩的Texture,這個核心代碼不變,使用display.newMaskedSprite提供的代碼:
local __mb = ccBlendFunc()
__mb.src = GL_ONE
__mb.dst = GL_ZERO
local __pb = ccBlendFunc()
__pb.src = GL_DST_ALPHA
__pb.dst = GL_ZERO
local __maskSprite = display.newSprite(__mask):align(display.LEFT_BOTTOM, 0, 0)
__maskSprite:setBlendFunc(__mb)
local __picSprite = display.newSprite(__pic):align(display.LEFT_BOTTOM, 0, 0)
__picSprite:setBlendFunc(__pb)
local __maskSize = __maskSprite:getContentSize()
local __canva = CCRenderTexture:create(__maskSize.width,__maskSize.height)
__canva:begin()
__maskSprite:visit()
__picSprite:visit()
__canva:endToLua()
接下來就是如何將生成的Texture應用在原有的CCSprite中:
1、display.newSprite(單個圖片的絕對徑)
wallSprite:setTexture(__canva:getSprite():getTexture())
2、display.newSprite(plist中定義的圖片key值)
local frame = CCSpriteFrame:createWithTexture(__canva:getSprite():getTexture(),CCRectMake(0,0,__maskSize.width,__maskSize.height))
wallSprite:setDisplayFrame(frame)