世界频道一半的消息带着表情,纯文本控件画不出来。RichText让表情图标嵌进文字流自动排版,配合历史折叠策略,聊天框再热闹也不糊屏。
消息里的方括号占位符替换成富文本img标签,单条上限三个表情,超出截断。表情ID经白名单校验防路径注入。
local EMOJI = { [1] = true, [2] = true, [3] = true, [4] = true }
local function toRich(text)
local cnt = 0
local s = string.gsub(text, "%[(%d)%]", function(id)
if EMOJI[tonumber(id)] and cnt < 3 then
cnt = cnt + 1
return "<img src='res/chat/emoji/" .. id .. ".png' />"
end
return ""
end)
return s
end
每条消息新建一个RichText控件追加到聊天层,历史超过十条移除最旧的一条,屏幕只保留最近十行。
local history = {}
SL:RegisterLuaNetMsg(7501, function(data)
local rich = GUI:RichText_Create(chatLayer, "chat" .. os.clock(), 8, 0, toRich(data.text), 320, 16, { 230, 230, 230 }, 6, nil)
table.insert(history, rich)
if #history > 10 then
local old = table.remove(history, 1)
GUI:removeFromParent(old)
end
end)
测试覆盖纯文字、满三表情、超三表情、非法ID四类消息,验证渲染与截断。低端机压测每秒十条连续刷屏,帧率跌破30把折叠上限降到六行。
RichText的内容在创建时传入,追加式聊天天然适配,编辑已有内容的需求要用重建实现,别找不存在的set接口。img标签的src必须单引号,双引号截断解析;表情ID不走白名单,路径拼接可被构造成越界资源引用。os.clock拼节点名高频下会重名,创建失败静默丢消息,改自增序号。removeFromParent后history里的引用要同步移除,残留引用会让折叠计数虚高,十行上限形同虚设。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 悬赏捕杀把玩家之间的恩怨变成可托付的系统行为:仇家难以亲自复仇时,花费金条发布悬赏,全服玩家接单击杀目标…
实战应用:用在哪里 策划改表是日常动作,漏填字段、引用了不存在的编号、数值越界这三类问题占了配表故障的绝大多数。等玩家报错再…
实战应用:用在哪里 行会擂台给中小行会提供了固定的对抗出口:挑战方击败守擂方后接管擂台,连胜次数决定每日结算奖励档位。接口层…
实战应用:用在哪里 世界首领战里玩家最关心的是伤害前十名:榜单要求随时插入、随时能按序取出,每来一条伤害记录都重新排序一次太…
实战应用:用在哪里 百人同屏的攻城战里,把每条移动、施法消息广播给全地图是最常见的性能失误。九宫格视野的做法是把地图切成等大…
实战应用:用在哪里 留言板、行会招募语、邮件标题这类字段会被玩家自由填写,并写入角色变量或转发给持久层。拼接式的写法一旦遇到…