Lua语言实现:截取给定字符串的部分长度,超出部分用省略号“...”替换

       在项目开发过程当中,尤其是游戏开发,当使用lua脚本语言编写客户端程序时,需要给玩家角色名长度做适配。如果玩家角色名的长度很长,超过了给定框,那么就会遮住游戏界面其他地方的图片,效果很难看,这样给玩家的体验就不好。为了给用户一个好的体验,往往策划会提出要求,比如角色名最大长度为18位,但是12位就已经超出框框,那么可以只显示9位,剩余部分用省略号替换,这样整个角色名就在给定框当中,给玩家的体验效果就更好。

       下面是我在游戏开发遇到的情况。

没有修改前的情形:


策划往往会要求客户端把角色名缩短,但又不影响阅读。于是,截取角色名一部分字符,其余部分用省略号替换。

又由于游戏当中,很多模块界面都需要显示角色名称,所以,就考虑能否写一个公共函数GetShortName(),当一个模块界面需要显示角色名称,而角色名称超框时,直接调用这个函数GetShortName()就可以显示合适的角色名称。

以下是我在做游戏开发当中遇到的情形,我采用这种方法,先在公共方法函数GlobalDefine.lua中定义公共方法GetShortName(),给其他模块使用者调用,仅供参考。

函数定义如下:


<span style="font-size:18px;"><span style="color:#33CC00;">--@brief	切割字符串,并用“...”替换尾部
--@param	sName:要切割的字符串
--@return	nMaxCount,字符串上限,中文字为2的倍数
--@param	nShowCount:显示英文字个数,中文字为2的倍数,可为空
--@note         函数实现:截取字符串一部分,剩余用“...”替换</span>
function GetShortName(sName,nMaxCount,nShowCount)
    if sName == nil or nMaxCount == nil then
        return
    end
    local sStr = sName
    local tCode = {}
    local tName = {}
    local nLenInByte = #sStr
    local nWidth = 0
    if nShowCount == nil then
       nShowCount = nMaxCount - 3
    end
    for i=1,nLenInByte do
        local curByte = string.byte(sStr, i)
        local byteCount = 0;
        if curByte>0 and curByte<=127 then
            byteCount = 1
        elseif curByte>=192 and curByte<223 then
            byteCount = 2
        elseif curByte>=224 and curByte<239 then
            byteCount = 3
        elseif curByte>=240 and curByte<=247 then
            byteCount = 4
        end
        local char = nil
        if byteCount > 0 then
            char = string.sub(sStr, i, i+byteCount-1)
            i = i + byteCount -1
        end
        if byteCount == 1 then
            nWidth = nWidth + 1
            table.insert(tName,char)
            table.insert(tCode,1)
            
        elseif byteCount > 1 then
            nWidth = nWidth + 2
            table.insert(tName,char)
            table.insert(tCode,2)
        end
    end
    
    if nWidth > nMaxCount then
        local _sN = ""
        local _len = 0
        for i=1,#tName do
            _sN = _sN .. tName[i]
            _len = _len + tCode[i]
            if _len >= nShowCount then
                break
            end
        end
        sName = _sN .. "..."
    end
    return sName
end</span>



然后在需要使用角色名称的模块界面SceneBattleSetment.lua文件调用这个GetShortName()函数:


    --note sName为玩家的名字
    local sName = WBattleGlobal:getCurrent():getHeroWithId(self.playerIds[index]).m_sPlayerName
    local ttfname1 = element:getChildElement("teammateName")
    assert(ttfname1, "ttfname is nil")
    local sShortName = GetShortName(sName,12,7)   --调用函数显示合适角色名称
    WZUILabelTTF:luaTo(ttfname1):setText(sShortName)
调用后,效果如下:




其他地方类似,效果如下:




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ccwRadar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值