在项目开发过程当中,尤其是游戏开发,当使用lua脚本语言编写客户端程序时,需要给玩家角色名长度做适配。如果玩家角色名的长度很长,超过了给定框,那么就会遮住游戏界面其他地方的图片,效果很难看,这样给玩家的体验就不好。为了给用户一个好的体验,往往策划会提出要求,比如角色名最大长度为18位,但是12位就已经超出框框,那么可以只显示9位,剩余部分用省略号替换,这样整个角色名就在给定框当中,给玩家的体验效果就更好。
下面是我在游戏开发遇到的情况。
没有修改前的情形:
策划往往会要求客户端把角色名缩短,但又不影响阅读。于是,截取角色名一部分字符,其余部分用省略号替换。
又由于游戏当中,很多模块界面都需要显示角色名称,所以,就考虑能否写一个公共函数GetShortName(),当一个模块界面需要显示角色名称,而角色名称超框时,直接调用这个函数GetShortName()就可以显示合适的角色名称。
以下是我在做游戏开发当中遇到的情形,我采用这种方法,先在公共方法函数GlobalDefine.lua中定义公共方法GetShortName(),给其他模块使用者调用,仅供参考。
函数定义如下:
[email protected] 切割字符串,并用“...”替换尾部 [email protected] sName:要切割的字符串 [email protected] nMaxCount,字符串上限,中文字为2的倍数 [email protected] nShowCount:显示英文字个数,中文字为2的倍数,可为空 [email protected] 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
然后在需要使用角色名称的模块界面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)
调用后,效果如下:
其他地方类似,效果如下:
时间: 2024-11-06 07:40:48