SL:print("打开洗练界面")
local refined = {}
EquipPos = {[0] = "衣服",[1] = "武器",[2] = "勋章",[3] = "头盔",[4] = "项链",[5] = "手镯(右)" ,
[6] = "手镯(左)",[7] = "戒指(右)",[8] = "戒指(左)",[10] = "腰带",[11] = "靴子"}
refined.currentAttributes = {
{type = 0, name = "无属性",
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-03-22 13:04:07 |
👁️ 阅读: 11
你的代码逻辑有个问题:在`openWin()`函数中,复选框的点击事件是循环内创建的,但`refined.lock`数组和发送消息时使用的装备位置`x`是循环的变量。当用户稍后点击复选框时,`x`的值已经是循环结束后的最后一个值(比如11),而不是你点击的那个装备按钮对应的位置。
你需要让每个复选框的点击事件能记住它属于哪个装备位置。这里用闭包可以解决。
修改`openWin()`函数中创建复选框点击事件的部分:
```lua
function refined:openWin()
-- ... [前面的代码保持不变] ...
refined.currentEquipPos = 0
for x, y in pairs(EquipPos) do
refined.lockStatus[x] = {0, 0, 0}
local buttonName = "but_"..x
GUI:addOnClickEvent(refined.ui[buttonName], function()
refined.currentEquipPos = x
refined:createHighLight(refined.ui[buttonName], x)
SL:SendLuaNetMsg(2013, 13, 0, x, "装备洗练")
end)
-- 为每个装备位置的3个复选框分别创建事件
for i = 1, 3 do
local lockState = "CheckBox_"..i
-- 使用闭包捕获当前的装备位置x
GUI:addOnClickEvent(refined.ui[lockState], function()
-- 现在这里能访问到正确的x值
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)
-- 发送时使用当前装备位置x
SL:SendLuaNetMsg(2013, 13, 2, x, lockJson)
SL:print("装备位置 " .. x .. " 的第" .. i .. "个复选框状态: " .. refined.lock[i])
end)
end
end
-- ... [后面的代码保持不变] ...
end
```
**关键改动:**
1. 将复选框点击事件的创建也放到了`for x, y in pairs(EquipPos) do`循环内部
2. 这样每个复选框的点击函数都能通过闭包记住它对应的装备位置`x`
3. 发送网络消息时使用正确的`x`值
**注意:** 这样修改后,每个装备位置都会创建3个复选框点击事件,总共会有 11×3 = 33个事件。但实际界面上可能只有3个复选框控件,这样会导致事件被重复绑定。你可能需要调整界面设计,或者使用其他方式记录当前选中的装备位置。
更常见的做法是:只绑定一次复选框事件,在事件内使用`refined.currentEquipPos`来获取当前选中的装备位置:
```lua
-- 在openWin()函数外部或内部合适位置,只绑定一次复选框事件
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, refined.currentEquipPos, lockJson)
SL:print("当前装备位置 " .. refined.currentEquipPos .. " 的第" .. i .. "个复选框状态: " .. refined.lock[i])
end)
end
```
这样更简洁,也符合你的需求——点击复选框时获取对应的装备按钮位置(通过`refined.currentEquipPos`)。
← 返回问答库