cocos2dx 描边(lua实现)

来源:互联网 发布:koala mac 编辑:程序博客网 时间:2024/05/21 08:29
local mytool = {}mytool.DEFAULT_TTF_FONT      = "Arial"mytool.DEFAULT_TTF_FONT_SIZE = 24mytool.TEXT_ALIGN_LEFT    = kCCTextAlignmentLeftmytool.TEXT_ALIGN_CENTER  = kCCTextAlignmentCentermytool.TEXT_ALIGN_RIGHT   = kCCTextAlignmentRightmytool.TEXT_VALIGN_TOP    = kCCVerticalTextAlignmentTopmytool.TEXT_VALIGN_CENTER = kCCVerticalTextAlignmentCentermytool.TEXT_VALIGN_BOTTOM = kCCVerticalTextAlignmentBottommytool.COLOR_WHITE = ccc3(255, 255, 255)mytool.COLOR_BLACK = ccc3(0, 0, 0)function mytool.round(num)  local floorNum = math.floor(num)  local remainder = num % floorNum  if remainder < 0.5 then    return math.floor(num)  else    return math.ceil(num)  endend--[[--使用 TTF 字体创建文字显示对象,并返回 CCLabelTTF 对象。可用参数:-    text: 要显示的文本-    font: 字体名,如果是非系统自带的 TTF 字体,那么指定为字体文件名-    size: 文字尺寸,因为是 TTF 字体,所以可以任意指定尺寸-    color: 文字颜色(可选),用 ccc3() 指定,默认为白色-    align: 文字的水平对齐方式(可选)-    valign: 文字的垂直对齐方式(可选),仅在指定了 dimensions 参数时有效-    dimensions: 文字显示对象的尺寸(可选),使用 CCSize() 指定-    x, y: 坐标(可选)align 和 valign 参数可用的值:-    mytool.TEXT_ALIGN_LEFT 左对齐-    mytool.TEXT_ALIGN_CENTER 水平居中对齐-    mytool.TEXT_ALIGN_RIGHT 右对齐-    mytool.TEXT_VALIGN_TOP 垂直顶部对齐-    mytool.TEXT_VALIGN_CENTER 垂直居中对齐-    mytool.TEXT_VALIGN_BOTTOM 垂直底部对齐~~~ lua-- 创建一个居中对齐的文字显示对象local label = mytool.newTTFLabel({    text = "Hello, World",    font = "Marker Felt",    size = 64,    align = mytool.TEXT_ALIGN_CENTER -- 文字内部居中对齐})-- 左对齐,并且多行文字顶部对齐local label = mytool.newTTFLabel({    text = "Hello, World\n您好,世界",    font = "Arial",    size = 64,    color = ccc3(255, 0, 0), -- 使用纯红色    align = mytool.TEXT_ALIGN_LEFT,    valign = mytool.TEXT_VALIGN_TOP,    dimensions = CCSize(400, 200)})~~~@param table params 参数表格对象@return CCLabelTTF CCLabelTTF对象]]function mytool.newTTFLabel(params)    assert(type(params) == "table",           "[framework.mytool] newTTFLabel() invalid params")    local text       = tostring(params.text)    local font       = params.font or mytool.DEFAULT_TTF_FONT    local size       = params.size or mytool.DEFAULT_TTF_FONT_SIZE    local color      = params.color or mytool.COLOR_WHITE    local textAlign  = params.align or mytool.TEXT_ALIGN_LEFT    local textValign = params.valign or mytool.TEXT_VALIGN_CENTER    local x, y       = params.x, params.y    local dimensions = params.dimensions    assert(type(size) == "number",           "[framework.mytool] newTTFLabel() invalid params.size")    local label    if dimensions then        label = CCLabelTTF:create(text, font, size, dimensions, textAlign, textValign)    else        label = CCLabelTTF:create(text, font, size)    end    if label then        label:setColor(color)        function label:realign(x, y)            if textAlign == mytool.TEXT_ALIGN_LEFT then                label:setPosition(mytool.round(x + label:getContentSize().width / 2), y)            elseif textAlign == mytool.TEXT_ALIGN_RIGHT then                label:setPosition(x - mytool.round(label:getContentSize().width / 2), y)            else                label:setPosition(x, y)            end        end        if x and y then label:realign(x, y) end    end    return labelend--[[--创建带描边效果的 TTF 文字显示对象,并返回 CCLabelTTF 对象。相比 mytool.newTTFLabel() 增加一个参数:    outlineColor: 描边颜色(可选),用 ccc3() 指定,默认为黑色@param table params 参数表格对象@return CCLabelTTF CCLabelTTF对象]]function mytool.newTTFLabelWithOutline(params)    assert(type(params) == "table",           "[framework.mytool] newTTFLabelWithShadow() invalid params")    local color        = params.color or mytool.COLOR_WHITE    local outlineColor = params.outlineColor or mytool.COLOR_BLACK    local x, y         = params.x, params.y    local g = CCNode:create()    params.size  = params.size    params.color = outlineColor    params.x, params.y = 0, 0    g.shadow1 = mytool.newTTFLabel(params)    g.shadow1:realign(1, 0)    g:addChild(g.shadow1)    g.shadow2 = mytool.newTTFLabel(params)    g.shadow2:realign(-1, 0)    g:addChild(g.shadow2)    g.shadow3 = mytool.newTTFLabel(params)    g.shadow3:realign(0, -1)    g:addChild(g.shadow3)    g.shadow4 = mytool.newTTFLabel(params)    g.shadow4:realign(0, 1)    g:addChild(g.shadow4)    params.color = color    g.label = mytool.newTTFLabel(params)    g.label:realign(0, 0)    g:addChild(g.label)    function g:setString(text)        g.shadow1:setString(text)        g.shadow2:setString(text)        g.shadow3:setString(text)        g.shadow4:setString(text)        g.label:setString(text)    end    function g:getContentSize()        return g.label:getContentSize()    end    function g:setColor(...)        g.label:setColor(...)    end    function g:setOutlineColor(...)        g.shadow1:setColor(...)        g.shadow2:setColor(...)        g.shadow3:setColor(...)        g.shadow4:setColor(...)    end    function g:setOpacity(opacity)        g.label:setOpacity(opacity)        g.shadow1:setOpacity(opacity)        g.shadow2:setOpacity(opacity)        g.shadow3:setOpacity(opacity)        g.shadow4:setOpacity(opacity)    end    if x and y then        g:setPosition(x, y)    end    return gend--[[--创建 cocostudio UILabel文字显示对象,并返回 UILabel 对象。@param table params 参数表格对象可用参数:-    text: 要显示的文本-    fontsize: 文字尺寸,-    x, y: 坐标-    color: 文字颜色(可选), 默认为白色 用ccc3表示-    align: 文字的水平对齐方式(可选)@return CCLabelTTF UILabel对象]]function mytool.newUILabel(params)assert(type(params) == "table","[framework.mytool] newUILabel() invalid params")log("#mytool.newUILabel begin###")local color = params.color or mytool.COLOR_WHITE -- log("#######color = "..tostring(color.r))-- log("#######color = "..tostring(color.g))-- log("#######color = "..tostring(color.b))local text = params.textlocal fontsize = params.fontsizelocal uilabel = UILabel:create()local textAlign  = params.align or mytool.TEXT_ALIGN_LEFTif uilabel thenuilabel:setColor(color.r, color.g, color.b)uilabel:setText(text)uilabel:setFontSize(fontsize)endfunction uilabel:realign(x, y)            if textAlign == mytool.TEXT_ALIGN_LEFT then            local w, h = uilabel:getSize()                uilabel:setPosition(mytool.round(x+3), y) --x + w / 2  --x+3            elseif textAlign == mytool.TEXT_ALIGN_RIGHT then            local w, h = uilabel:getSize()                uilabel:setPosition(x - mytool.round(w / 2), y)            else                uilabel:setPosition(x, y)            end    end    if x and y then label:realign(x, y) end    log("#mytool.newUILabel end###")    return uilabelend--[[--创建带描边效果的 cocostudio UILabel文字显示对象,并返回 UILabel 对象。@param table params 参数表格对象可用参数:-    text: 要显示的文本-    size: 文字尺寸,-    x, y: 坐标-    outlineColor : 文字描边颜色, 用ccc3() 指定, 默认为黑色-    color: 文字颜色(可选),用 ccc3() 指定,默认为白色-    align: 文字的水平对齐方式(可选)@return CCLabelTTF UILabel对象]]function mytool.newUILabelWithOutline(params)    assert(type(params) == "table",           "[framework.mytool] newUILabelWithOutline() invalid params")    log("####mytool.newUILabelWithOutline(params) begin####")    local widget = params.widget    local r, g, b = widget:getColor()    local sizew, sizeh = widget:getSize()    local fontsize = params.fontSize or 28 --这里可以换成获取字体大小    local color        = params.color or ccc3(r, g, b)    local outlineColor = params.outlineColor or mytool.COLOR_BLACK    widget = tolua.cast(widget, "UILabel")    local text = widget:getStringValue()        local g = UILabel:create()--Layout:create()        params.color = outlineColor    params.text = text    params.x, params.y = 0, 0    params.fontsize = fontsize      g.shadow1 = mytool.newUILabel(params)    g.shadow1:realign(1, 0)    g:addChild(g.shadow1)        g.shadow2 = mytool.newUILabel(params)    g.shadow2:realign(-1, 0)    g:addChild(g.shadow2)    g.shadow3 = mytool.newUILabel(params)    g.shadow3:realign(0, -1)    g:addChild(g.shadow3)    g.shadow4 = mytool.newUILabel(params)    g.shadow4:realign(0, 1)    g:addChild(g.shadow4)    local parent = widget:getParent()    widget:removeFromParentAndCleanup(true)    params.color = color    g.label = mytool.newUILabel(params)    g.label:realign(0, 0)    g:addChild(g.label)    parent:addChild(g)    if x and y then        g:setPosition(x, y)    end    log("####mytool.newUILabelWithOutline(params) end####")    return gendreturn mytool


用法:

mytool = require("util.mytool.lua")  local ttf = mytool.newTTFLabel{text = "卧槽xxx", x = 320, y = 640}  localUnionWindow.beginInputLayer:addChild(ttf, 10)


 ---createtext 从cocostudio 中读出来的  local createtext = xwidget.getChild(createBtn, "text")  mytool.newUILabelWithOutline{widget = createtext, outlineColor = ccc3(255, 0, 0)}


效果:



原理:描边用5个控件 来实现 上下左右 各移动一个像素显示 另一个不移动
另种方法:可以用两个控件来实现 下面的控件放大 用字体的大小算比例 最好周围大出一个像素   上面的不变 

0 0
原创粉丝点击