local leishen = {}
local function showEffect(msgID, p1, p2, p3, msgData)
local data = SL:JsonDecode(msgData, false) or {}
SL:Print("特效数据", data)
local num = data.num or 0
local eff1, eff2 = data.preEff, data.startEff
-- -- 检
```lua
-- 根据浮生梦老师前端课程内容,我发现你的代码有几个问题需要修正:
-- 1. 注册网络消息处理器时,回调函数参数顺序错误
-- 正确应该是:function(msgID, p1, p2, p3, msgData)
SL:RegisterLuaNetMsg(2028, function(msgID, p1, p2, p3, timeDataStr)
local timeData = SL:JsonDecode(timeDataStr, false) or {}
local totalCount = timeData.totalCount or 0
local percent = timeData.percent or 0
-- 更新主进度条
if not GUI:Win_IsNull(mainLoadingBar) then
GUI:LoadingBar_setPercent(mainLoadingBar, percent)
end
-- 更新所有特效的倒计时文本
for i = 1, num do
if effectObjects[i] and effectObjects[i].countdownText then
if not GUI:Win_IsNull(effectObjects[i].countdownText) then
GUI:Text_setString(effectObjects[i].countdownText, tostring(totalCount))
end
-- 当倒计时为0时触发技能特效
if totalCount == 0 then
if not GUI:Win_IsNull(effectObjects[i].circleEffect) then
-- 创建技能特效
local skillEffect = GUI:Effect_Create(sceneLayer, "skill_effect_" .. i .. math.random(999999),
effectObjects[i].posX, effectObjects[i].posY, 0, eff2, 0, 0, 0, 1)
-- 技能特效动画
if not GUI:Win_IsNull(skillEffect) then
GUI:setOpacity(skillEffect, 255)
local skillAction = GUI:ActionSequence(
GUI:ActionScaleTo(0.2, 2.0),
GUI:DelayTime(0.3),
GUI:ActionFadeTo(0.5, 0),
GUI:CallFunc(function()
GUI:removeFromParent(skillEffect)
end)
)
GUI:runAction(skillEffect, skillAction)
end
-- 清理单个特效
if not GUI:Win_IsNull(effectObjects[i].countdownText) then
GUI:removeFromParent(effectObjects[i].countdownText)
end
if not GUI:Win_IsNull(effectObjects[i].circleEffect) then
GUI:removeFromParent(effectObjects[i].circleEffect)
end
end
end
end
end
-- 所有倒计时结束,清理场景
if totalCount == 0 then
-- 使用单次定时器延迟清理
SL:ScheduleOnce(function()
if not GUI:Win_IsNull(sceneLayer) then
GUI:removeFromParent(sceneLayer)
end
-- 取消注册消息
SL:UnRegisterLuaNetMsg(2028)
end, 1.0) -- 延迟1秒执行
end
end)
-- 2. 注意:showEffect函数中的eff2变量需要从data中获取
-- 在showEffect函数中,应该这样获取:
local function showEffect(msgID, p1, p2, p3, msgData)
local data = SL:JsonDecode(msgData, false) or {}
SL:Print("特效数据", data)
local num = data.num or 0
local eff1 = data.preEff or 0
local eff2 = data.startEff or 0 -- 这里获取技能特效ID
-- ... 其他代码
end
-- 3. 后端每秒发消息,前端收到后释放特效的逻辑是正确的
-- 但需要注意:当totalCount为0时,特效会被触发并清理
-- 如果后端持续发送totalCount=0的消息,特效会持续播放
-- 4. 建议添加一个标志位,防止重复触发
local hasTriggered = false
-- 在注册消息处理器中:
if totalCount == 0 and not hasTriggered then
hasTriggered = true
-- 触发特效逻辑
-- ...
-- 清理后重置标志位
SL:ScheduleOnce(function()
hasTriggered = false
end, 1.0)
end
```
主要问题是网络消息回调函数的参数顺序和变量作用域问题。后端每秒发消息,前端收到后释放特效的逻辑是可行的,但需要确保特效只触发一次,避免重复播放。