后端Lua尊者:嗨,小仙!我是后端Lua老师!
看到你的问题了,你问的是为什么点击复选框时不能直接获取到复选框状态。我来帮你分析一下代码。
首先,在你的前端代码`refined:openWin()`函数中,复选框的点击事件是在**每个装备按钮的点击事件内部**嵌套设置的。这意味着只有当玩家**点击了某个装备按钮**后,才会为这个装备对应的复选框绑定点击事件。
```lua
-- 这是你的代码结构
GUI:addOnClickEvent(refined.ui[buttonName], function()
refined.currentEquipPos = x
refined:createHighLight(refined.ui[buttonName], x)
SL:SendLuaNetMsg(2013, 13, 0, x, "装备洗练")
-- 获取复选框状态
-- 逻辑与实际相反,打钩为false..1,未打钩为true..0
for i = 1 ,3 do
local lockState = "CheckBox_"..i
GUI:addOnClickEvent(refined.ui[lockState], function()
local lockState_i = GUI:CheckBox_isSelected(refined.ui[lockState])
if lockState_i == true then
refined.lock[i] = 1
else
refined.lock[i] = 0
end
local lockJson = SL:JsonEncode(refined.lock)
SL:SendLuaNetMsg(2013, 13, 2, x, lockJson)
end)
end
end)
```
问题在于:**默认装备位置0虽然被选中了,但它的复选框点击事件还没有被绑定!**
当你首次进入界面时,虽然执行了`refined:createHighLight(refined.ui["but_0"], 0)`来高亮第一个按钮,但**并没有触发按钮0的点击事件**,所以位置0对应的复选框点击事件就没有被绑定。
解决方案是在界面打开后,**主动触发一次默认装备的点击事件**:
```lua
function refined:openWin()
-- ... 前面的代码 ...
refined.currentEquipPos = 0 -- 默认选中衣服位置0
for x, y in pairs(EquipPos) do
refined.lockStatus[x] = {0, 0, 0} -- 默认复选框状态
local buttonName = "but_"..x
GUI:addOnClickEvent(refined.ui[buttonName], function()
-- ... 按钮点击逻辑 ...
end)
end
-- 首次进入时,在第一个按钮上创建高亮
if refined.ui["but_0"] then
refined:createHighLight(refined.ui["but_0"], 0)
-- 主动触发按钮0的点击事件,绑定复选框事件
if refined.ui["but_0"].onClick then
refined.ui["but_0"].onClick() -- 如果GUI系统支持这样调用
else
-- 或者手动执行按钮0的点击逻辑
refined.currentEquipPos = 0
SL:SendLuaNetMsg(2013, 13, 0, 0, "装备洗练")
-- 绑定复选框事件
for i = 1, 3 do
local lockState = "CheckBox_"..i
GUI:addOnClickEvent(refined.ui[lockState], function()
local lockState_i = GUI:CheckBox_isSelected(refined.ui[lockState])
if lockState_i == true then
refined.lock[i] = 1
else
refined.lock[i] = 0
end
local lockJson = SL:JsonEncode(refined.lock)
SL:SendLuaNetMsg(2013, 13, 2, 0, lockJson)
end)
end
end
end
end
```
另外,你的后端代码中`npc:iniLock`函数还没有完善,需要处理前端发送过来的锁定状态:
```lua
function npc:iniLock(actor, param3, str)
local lockStatus = json2tbl(str)
local player_ID = getbaseinfo(actor, 2)
local itemObj = linkbodyitem(actor, param3)
if itemObj then
local itemOnlyID = getiteminfo(actor, itemObj, 1)
local data = npc:getRefineData(actor, param3)
if data then
-- 更新锁定状态
for i = 1, 3 do
data.lockStatus[i] = (lockStatus[i] == 1) -- 1表示锁定,0表示未锁定
end
release_print("装备"..param3.."的锁定状态已更新")
end
end
end
```
总结一下:**复选框的点击事件是在装备按钮点击时才绑定的,默认选中装备0时没有触发这个绑定过程**。你需要确保界面打开后,默认选中的装备也能正常绑定复选框事件。
如果还有不明白的地方,随时问我!浮生梦尊师说过,编程要细心,每个细节都要考虑到哦!