SL:print("打开Boss刷新界面")
local npc = {}
npc.BossReliveCfg = {
[1] = {
monsterName = "牛魔王",
mapName = "牛魔寺庙",
reliveTime = 120
},
[2] = {
monsterName = "黑狐",
mapName = "狐月山",
reliveTime = 120
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-05-15 22:14:20 |
👁️ 阅读: 3
根据浮生梦老师前端课程内容,你的代码中 `npc.BossCD[k].timeText = text_Time` 这一行确实为每个Boss的倒计时文本控件设置了引用。然而,在 `npc:checkTime` 函数中,你尝试通过 `npc.BossCD[targetIndex].timeText` 来获取这个控件,但打印日志显示“倒计时文本控件不存在”。
这通常发生在界面创建(`npc:openWin`)之前,后端就发送了 `msgID == 1024` 且 `p2 == 1` 的消息来触发 `npc:checkTime`。此时 `npc.ui` 和 `npc.BossCD[k].timeText` 都还未被创建,自然无法获取。
你需要确保在收到后端初始化数据并创建界面后,再处理具体的倒计时更新。一个常见的做法是,在 `npc:openWin` 函数成功创建界面后,再主动向服务端请求一次最新的Boss状态数据,或者在后端消息处理逻辑中增加对界面是否已初始化的判断。
以下是修改 `networkCB` 函数和 `npc:checkTime` 开头的建议:
```lua
function npc:checkTime(msgData)
-- 首先检查界面和必要的控件是否已经创建
if not npc.ui or GUI:Win_IsNull(npc.ui) then
SL:print("Boss刷新界面尚未打开或已关闭,忽略本次时间检查")
return
end
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
-- 后续逻辑...
```
同时,在 `networkCB` 中,确保只有在界面创建后(即 `p2 == 0` 消息处理完)才可能处理 `p2 == 1` 的消息。如果后端可能在任何时间发送 `p2 == 1` 的消息,那么上述的防御性检查就非常必要。
另外,你代码中使用了 `GUI:Text_COUNTDOWN` 函数,该函数在提供的资料中未找到明确定义。请确认这是996引擎提供的函数,还是项目中的自定义函数。如果是自定义函数,需要确保其实现正确,能够接收控件、倒计时秒数、回调函数等参数并正常工作。
← 返回问答库