cocos2d-lua 图片裁剪自定义形状

前端之家收集整理的这篇文章主要介绍了cocos2d-lua 图片裁剪自定义形状前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

有两种方法一种是用clippingNode来进行遮罩--对节点进行遮罩式裁剪

  1. --picPath and stencilPath 尺寸要一致, 更新节点需要移除之前的节点
  2. function cc.exports.exchangeImageToClipNode(imgNode,picPath,stencilPath,index)
  3. imgNode:setVisible(false)
  4. local parent = imgNode:getParent()
  5. local clipnode = parent:getChildByName("ClipNode"..tostring(index))
  6. if clipnode then
  7. clipnode:removeFromParent()
  8. end
  9.  
  10. local clipNodeEx = cc.ClippingNode:create()
  11. parent:addChild(clipNodeEx)
  12. local maskNode = imgNode:clone()
  13. maskNode:loadTexture(picPath,ccui.TextureResType.localType)
  14. maskNode:setVisible(true)
  15. local sprite = cc.Sprite:create(stencilPath)
  16. clipNodeEx:addChild(maskNode)
  17. clipNodeEx:setStencil(sprite)
  18. maskNode:setPosition(imgNode:getPosition())
  19. sprite:setPosition(imgNode:getPosition())
  20. clipNodeEx:setName("ClipNode"..tostring(index))
  21. clipNodeEx:setInverted(true)
  22. clipNodeEx:setAlphaThreshold(0.5)
  23.  
  24. return clipNodeEx
  25. end

另一种是用renderTexture进行裁剪
  1. --对纹理进行裁剪 裁剪的图片路径spritePath 裁剪的形状图片路径maskPath
  2. function cc.exports.maskedSprite(spritePath,maskPath)
  3. local textureSprite = cc.Sprite:create(spritePath)
  4. local textureSize = textureSprite:getContentSize()
  5.  
  6. local maskSprite = cc.Sprite:create(maskPath)
  7. local maskSize = maskSprite:getContentSize()
  8.  
  9. local renderTexture = cc.RenderTexture:create(maskSize.width,maskSize.height)
  10. maskSprite:setPosition(cc.p(maskSize.width/2,maskSize.height/2))
  11. textureSprite:setPosition(cc.p(textureSize.width/2,textureSize.height/2))
  12.  
  13. maskSprite:setBlendFunc(cc.blendFunc(GL_ONE,GL_ZERO))
  14. textureSprite:setBlendFunc(cc.blendFunc(GL_DST_ALPHA,GL_ZERO))
  15.  
  16. renderTexture:begin()
  17. maskSprite:visit()
  18. textureSprite:visit()
  19. renderTexture:endToLua()
  20.  
  21. local retSprite = cc.Sprite:createWithTexture(renderTexture:getSprite():getTexture())
  22. retSprite:setFlippedY(true)
  23. return retSprite
  24. end

第一种方法可以根据imageview的尺寸自适应,不过有个bug,如果有弹出窗的层级高于在遮罩图片的被创建前父节点的层级,当遮罩图片被创建以后,弹出窗也会被遮罩裁剪

第二种方法则是在利用需要裁剪的图片纹理,重新创建了一个裁剪图片,因此图片的大小是相对于纹理的尺寸,大小需要手动进行设置

猜你在找的Cocos2d-x相关文章