学习cocos2dx的人都知道quick cocos2dx。那么今天我们要学习的就是quick cocos2dx描边的创建实现。具体过程看下面。
测试例子
- - @param:node 欲描边的显示对象
- -- @param:strokeWidth 描边宽度
- -- @param:color 描边颜色
- -- @param:opacity 描边透明度
- function createStroke(node, strokeWidth, color, opacity)
- local w = node:getTexture():getContentSize().width + strokeWidth * 2
- local h = node:getTexture():getContentSize().height + strokeWidth * 2
- local rt = CCRenderTexture:create(w, h)
- -- 记录原始位置
- local originX, originY = node:getPosition()
- -- 记录原始颜色RGB信息
- local originColorR = node:getColor().r
- local originColorG = node:getColor().g
- local originColorB = node:getColor().b
- -- 记录原始透明度信息
- local originOpacity = node:getOpacity()
- -- 记录原始是否显示
- local originVisibility = node:isVisible()
- -- 记录原始混合模式
- local originBlend = node:getBlendFunc()
- -- 设置颜色、透明度、显示
- node:setColor(color)
- node:setOpacity(opacity)
- node:setVisible(true)
- -- 设置新的混合模式
- local blendFuc = ccBlendFunc:new()
- blendFuc.src = GL_SRC_ALPHA
- blendFuc.dst = GL_ONE
- -- blendFuc.dst = GL_ONE_MINUS_SRC_COLOR
- node:setBlendFunc(blendFuc)
- -- 这里考虑到锚点的位置,如果锚点刚好在中心处,代码可能会更好理解点
- local bottomLeftX = node:getTexture():getContentSize().width * node:getAnchorPoint().x + strokeWidth
- local bottomLeftY = node:getTexture():getContentSize().height * node:getAnchorPoint().y + strokeWidth
- local positionOffsetX = node:getTexture():getContentSize().width * node:getAnchorPoint().x - node:getTexture():getContentSize().width / 2
- local positionOffsetY = node:getTexture():getContentSize().height * node:getAnchorPoint().y - node:getTexture():getContentSize().height / 2
- local rtPosition = ccp(originX - positionOffsetX, originY - positionOffsetY)
- rt:begin()
- -- 步进值这里为10,不同的步进值描边的精细度也不同
- for i = 0, 360, 10 do
- -- 这里解释了为什么要保存原来的初始信息
- node:setPosition(ccp(bottomLeftX + math.sin(degrees2radians(i)) * strokeWidth, bottomLeftY + math.cos(degrees2radians(i)) * strokeWidth))
- node:visit()
- end
- rt:endToLua()
- -- 恢复原状
- node:setPosition(originX, originY)
- node:setColor(ccc3(originColorR, originColorG, originColorB))
- node:setBlendFunc(originBlend)
- node:setVisible(originVisibility)
- node:setOpacity(originOpacity)
- rt:setPosition(rtPosition)
- return rt
- end
- 弧度与角度转换函数
- function degrees2radians(angle)
- return angle * 0.01745329252
- end
- function radians2degrees(angle)
- return angle * 57.29577951
- end
测试例子
- -- 文本、图片一样,这里用文本举个例子
- local quickLabel = ui.newTTFLabel({
- text = "QuickCocos2dX-createStroke",
- color = display.COLOR_RED,
- size = 60,
- align = ui.TEXT_ALIGN_CENTER,
- x = display.cx,
- y = display.cy + 150
- }):addTo(self, 1)
- local renderTexture = createStroke(quickLabel, 4, ccc3(0xca, 0xa5, 0x5f), 100)
- -- 设置反锯齿
- renderTexture:getSprite():getTexture():setAntiAliasTexParameters()
- self:addChild(renderTexture, quickLabel:getZOrder()-1)