案例库里的 GMBoxUI.lua 是一个完整的 GM 面板实现:按钮矩阵、指令输入、结果回显三区布局。分析这个案例能学到工具类界面的标准结构——按钮的定义表驱动、点击事件的统一分发、执行结果的反馈回路。
---GM 面板的按钮定义(来自 GMBoxUI.lua 的结构整理)
local GM_BUTTONS = {
{ name = "满血", cmd = "hp", arg = "100%" },
{ name = "满蓝", cmd = "mp", arg = "100%" },
{ name = "解卡", cmd = "recall", arg = "" },
{ name = "清任务", cmd = "cleartask", arg = "" },
}
function GMBoxUI.build(panel)
for i, def in ipairs(GM_BUTTONS) do
local btn = GUI:Button_Create(panel, "gmBtn" .. i, x(i), 40, "gm_btn.png")
GUI:Button_setTitleText(btn, def.name)
GUI:addOnClickEvent(btn, function()
SL:SendNetMsg(MSGID.GM_EXEC, 0, 0, 0, def.cmd .. "|" .. def.arg)
end)
end
end
按钮用定义表驱动而不是逐个手写:加一个 GM 功能就是加一行配置,界面的扩展成本是常量。点击回调统一走 SL:SendNetMsg 发指令到服务端,按钮本身不执行任何逻辑,指令的权威在服务端。
---执行结果的回显区
SL:RegisterLuaNetMsg(MSGID.GM_RESULT, function(p1, p2, p3, sMsg)
local logText = GUI:getChildByName(gmPanel, "resultLog")
GUI:Text_setString(logText, sMsg .. "\n" .. GUI:Text_getString(logText))
end)
执行结果从服务端推回后插入回显区的顶部,最近的操作始终在最上面。GM 面板的案例教会三件事:定义表驱动界面、按钮只发指令不执行逻辑、结果回显回路。这三条适用于所有工具类界面的开发。
按钮的使用频次统计进 GM 操作日志,高频按钮的位置调整提升操作效率。
按钮的防连击缺失曾经一秒发出十几次相同指令,点击后的禁用窗口是工具界面的标配。GM 面板的入口权限曾经只在打开时校验,面板常驻后台的玩家在降权后仍能点击按钮,每次点击都重新校验才是安全的做法。
GM 面板的按钮按使用频率排序,高频操作放第一屏。指令的参数输入框与按钮分离,带参数的指令点击后弹出参数确认。面板的打开权限与按钮的执行权限是两层校验,界面的可见不等于可执行。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 跨服开放后,各服的世界频道各自为政,热门话题被服务器墙分隔。话题聚合方案:带话题标签的消息汇聚到跨服频道…
实战应用:用在哪里 运营要的是“这周谁打了副本、谁在挂机、谁在交易”,不是每天几万条的原始行为流。周报摘要方案:行为流水按玩…
实战应用:用在哪里 战斗中打字报点来不及,快捷短语轮盘让玩家按住轮盘键滑向常用语松手即发:集合、撤退、求奶、集火左,八条槽位…
实战应用:用在哪里 部分玩家用手柄玩传奇,键位习惯各不相同。按键映射方案:手柄的摇杆、十字键、肩键映射到游戏动作,映射表玩家…
实战应用:用在哪里 模块级的计数器、限流器都面临一个问题:状态存全局容易被别的代码改坏。闭包把状态封在函数的作用域里,外部只…
实战应用:用在哪里 师门任务的日常共同任务做成师徒双人副本:师父带徒弟进入专属关卡,关卡机制要求两人配合——师父扛伤开门、徒…