铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 720|回复: 2

[lua复刻] 分享一个高亮显示关键词代码

[复制链接]
 楼主| 发表于 2023-4-20 18:59 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x


分享一个刚用lua写的高亮显示关键词代码

function DrawStringWithMultiHighlight(x, y, str, color, size, highlights)
  if x == -1 then
    local ll = #str
    local w = size * ll / 2 + 2 * CC.MenuBorderPixel
    x = (CC.ScreenW - size / 2 * ll - 2 * CC.MenuBorderPixel) / 2
  end
  if y == -1 then
    y = (CC.ScreenH - size - 2 * CC.MenuBorderPixel) / 2
  end  

  -- 拆分字符串和高亮颜色
  local parts = {}
  local lastIndex = 1
  for i, highlight in ipairs(highlights) do
    local startIndex, endIndex = string.find(str, highlight[1], lastIndex)
    if startIndex then
      table.insert(parts, string.sub(str, lastIndex, startIndex - 1))
      table.insert(parts, {string.sub(str, startIndex, endIndex), highlight[2]})
      lastIndex = endIndex + 1
    end
  end
  table.insert(parts, string.sub(str, lastIndex))

  -- 逐部分显示
  local curX = x
  for i, part in ipairs(parts) do
    if type(part) == "string" then
      lib.DrawStr(curX, y, part, color, size, 0, 0, CC.FontName, CC.SrcCharSet, CC.OSCharSet)
      curX = curX + (#part*size//2)
    else
      lib.DrawStr(curX, y, part[1], part[2], size, 0, 0, CC.FontName, CC.SrcCharSet, CC.OSCharSet)
      curX = curX + (#part[1]*size//2)
    end
  end
end

DrawStringWithMultiHighlight` 函数来同时显示多种颜色高亮的字符串了。你只需要传入如下格式的参数:

- `x` 和 `y`:字符串的左上角坐标。
- `str`:要显示的字符串。
- `color`:字符串的默认颜色。
- `size`:字符串的字体大小。
- `highlights`:一个二维数组,每个元素是一个长度为 2 的一维数组,代表要高亮的关键词和对应的颜色。

示例
local highlights={{"铁血", C_RED},
  {"丹", M_Green},
  {"心", M_Black}
}
DrawStringWithMultiHighlight(100, 100, "铁血丹心论坛", C_WHITE, 16, highlights)



【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2023-4-21 23:36 | 显示全部楼层
本帖最后由 lsl330 于 2023-4-21 23:38 编辑

这样太麻烦啦,每次定义颜色都要新建一个table,其实简单参照对话,就能发现有简单得多的办法。
function DrawStringMC(x, y, s, color, size)
        if x==-1 then
                local ll=#s;
                local w=size*ll/2+2*CC.MenuBorderPixel;
                x=(CC.ScreenW-size/2*ll-2*CC.MenuBorderPixel)/2;
        end
        if y == -1 then
                y = (CC.ScreenH - size - 2 * CC.MenuBorderPixel) / 2
        end
        local cx = 0
        local function readstr(str)
                local T1={{"R",C_RED},{"G",C_GOLD},{"B",C_BLACK},{"W",C_WHITE},{"O",C_ORANGE},{"L",LimeGreen},{"D",M_DeepSkyBlue},{"Z",LightPurple},{"Y",C_YELLOW},{"K",C_PINK}}
                for i=1,10 do
                        if T1[1]==str then return 1,T1[2] end
                end
                return 0
        end
        while string.len(s) >= 1 do
                local str
                str=string.sub(s,1,1)
                if string.byte(s,1,1) > 127 then                --判断单双字符
                        str=string.sub(s,1,2)
                        s=string.sub(s,3,-1)
                else
                        str=string.sub(s,1,1)
                        s=string.sub(s,2,-1)
                end
                --开始控制逻辑
                local kz1,kz2=readstr(str)
                if kz1==1 then
                        color=kz2
                else
                        lib.DrawStr(x+size*cx, y, str, color, size, CC.FontName, CC.SrcCharSet, CC.OSCharSet)
                        cx=cx+string.len(str)/2
                end
        end
end

以后输出字符时,和say对话一样,就可以了
譬如
DrawStringMC(100, 100, "R铁血W丹心O论坛", C_WHITE, 16)
想要其他颜色,自行定义T1就好。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2023-4-25 22:11 | 显示全部楼层
大佬有一键端吗?
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-11-23 17:26

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表