欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Lua 实现富文本打字机逐字显示效果

程序员文章站 2022-06-22 20:02:31
...

Lua 实现富文本打字机逐字显示效果

例如我们有一段富文本,并且需要像

local RichText = “这是一段<red>富文本</>”

我的思路是优先分隔每个字符,即第一次循环得到

_DialogStr = “这”

第二次循环得到

_DialogStr = “这是”

当循环得至

_DialogStr = “这是一段<”

进行字符串截取,只截取 ‘<’ 前的字符,并且不进行延时循环下一个字符,当循至

_DialogStr = “这是一段<red>”

则开始对字符串进行截取,截取从 “<red>” 标签到字符串结尾,并且开始匹配 “</>” 标签,若未匹配到对应字符串,则对原本字符串进行 “</>” 的补齐。

具体代码如下:

function GetRichTextFormat(_DialogStr)
    if not _DialogStr then return "" end
    local _OutStr = ""
    local _Index = 1
    local _IsNeedDelay = true
    while true do
        local _TagIndex = string.find(_DialogStr, "<", _Index)
        if _TagIndex then
            local _CheckStr = string.sub(_DialogStr, _TagIndex, string.len(_DialogStr))
            local _StartTagIndex = string.find(_CheckStr, "(<.+>)")
            if _StartTagIndex then
                local _EndTagIndex = string.find(_CheckStr, "(</>)")
                if _EndTagIndex then
                    _Index = _TagIndex + _EndTagIndex + 3
                else
                    local _LastChar = string.sub(_CheckStr, string.len(_CheckStr), string.len(_CheckStr) + 1)
                    if _LastChar == "<" then
                        _OutStr = _DialogStr .. "/>"
                    elseif _LastChar == "/" then
                        _OutStr = _DialogStr .. ">"
                    else
                        _OutStr = _DialogStr .. "</>"
                    end
                    _IsNeedDelay = true
                    break
                end
            else
                _OutStr = string.sub(_DialogStr, 1, _TagIndex - 1)
                _IsNeedDelay = false
                break
            end
        else
            _OutStr = _DialogStr
            _IsNeedDelay = true
            break
        end
    end
    return _OutStr, _IsNeedDelay
end

代码中 _IsNeedDelay 代表是否需要延时显示下一个字符,就比如从 “这是一段<” 到 “这是一段<red>” 之间是不需要延时的。

相关标签: lua