你遇到的问题是在`checkTime`函数中,`text_Time`变量在倒计时回调函数中无法正确访问。这是因为`text_Time`是局部变量,在回调函数执行时可能已经超出作用域或者值发生了变化。
根据浮生梦老师前端课程内容,这里有几种解决方案:
## 方案1:使用闭包捕获变量(推荐)
```lua
function npc:checkTime(msgData)
SL:print(msgData)
local bossData = SL:GetMetaValue("MAP_GET_MONSTERS")
SL:dump(bossData)
local targetIndex = nil
for k, v in ipairs(npc.BossReliveCfg) do
if v.monsterName and string.find(v.monsterName, msgData, 1, true) then
targetIndex = k
break
end
end
if not targetIndex then
SL:print("未找到该BOSS配置")
return
end
local setBoss = npc.BossReliveCfg[targetIndex]
local bossCD = npc.BossCD[targetIndex]
bossCD.isCD = true
bossCD.leftTime = setBoss.reliveTime
-- 获取倒计时文本控件
local text_Time = setBoss.timeText
-- 检查控件是否存在
if not text_Time or GUI:Win_IsNull(text_Time) then
SL:print("倒计时文本控件不存在")
return
end
GUI:Text_setString(text_Time, tostring(setBoss.reliveTime).."秒")
-- 使用闭包捕获targetIndex和text_Time
GUI:Text_COUNTDOWN(text_Time, setBoss.reliveTime, function(data)
SL:print(data)
-- 这里可以直接使用text_Time和targetIndex
npc.BossCD[targetIndex].isCD = false
-- 再次检查控件是否存在
if not GUI:Win_IsNull(text_Time) then
GUI:Text_setString(text_Time, "已刷新")
GUI:Text_setTextColor(text_Time, "#0000e7")
end
end, 0)
end
```
## 方案2:将text_Time存储在BossCD表中
```lua
function npc:checkTime(msgData)
-- ... 前面的代码相同 ...
local setBoss = npc.BossReliveCfg[targetIndex]
local bossCD = npc.BossCD[targetIndex]
bossCD.isCD = true
bossCD.leftTime = setBoss.reliveTime
bossCD.timeWidget = setBoss.timeText -- 存储到CD表中
local text_Time = setBoss.timeText
if not text_Time or GUI:Win_IsNull(text_Time) then
SL:print("倒计时文本控件不存在")
return
end
GUI:Text_setString(text_Time, tostring(setBoss.reliveTime).."秒")
GUI:Text_COUNTDOWN(text_Time, setBoss.reliveTime, function(data)
SL:print(data)
npc.BossCD[targetIndex].isCD = false
-- 从CD表中获取控件
local timeWidget = npc.BossCD[targetIndex].timeWidget
if timeWidget and not GUI:Win_IsNull(timeWidget) then
GUI:Text_setString(timeWidget, "已刷新")
GUI:Text_setTextColor(timeWidget, "#0000e7")
end
end, 0)
end
```
## 方案3:使用upvalue确保变量持久化
```lua
function npc:checkTime(msgData)
-- ... 前面的代码相同 ...
local setBoss = npc.BossReliveCfg[targetIndex]
local bossCD = npc.BossCD[targetIndex]
bossCD.isCD = true
bossCD.leftTime = setBoss.reliveTime
-- 将控件存储为upvalue
local timeWidget = setBoss.timeText
local cdIndex = targetIndex -- 存储索引
if not timeWidget or GUI:Win_IsNull(timeWidget) then
SL:print("倒计时文本控件不存在")
return
end
GUI:Text_setString(timeWidget, tostring(setBoss.reliveTime).."秒")
GUI:Text_COUNTDOWN(timeWidget, setBoss.reliveTime, function(data)
SL:print(data)
npc.BossCD[cdIndex].isCD = false
if not GUI:Win_IsNull(timeWidget) then
GUI:Text_setString(timeWidget, "已刷新")
GUI:Text_setTextColor(timeWidget, "#0000e7")
end
end, 0)
end
```
## 关键点说明:
1. **作用域问题**:回调函数执行时,原函数中的局部变量可能已经失效
2. **控件检查**:使用`GUI:Win_IsNull()`确保控件仍然有效
3. **闭包捕获**:Lua的闭包可以捕获外部变量,使其在回调中可用
4. **数据存储**:重要数据应该存储在持久化的表中
建议使用方案1,它最简洁且符合Lua的编程习惯。记得在回调函数中也要检查控件是否存在,因为界面可能在倒计时过程中被关闭。