local leishen = {}
-- 主处理函数
function leishen.link(actor, msgid, arg1, arg2, arg3, sMsg)
-- 检查配置
if not cfg_leishen or not next(cfg_leishen) then
lib:msg(actor, "配置错误", 1)
return
end
local rlv_str = getplaydef(ac
你的特效CD没有实现主要问题在于前端处理逻辑存在缺陷。让我帮你分析并修正:
## 主要问题分析:
1. **前端接收消息处理不当**:你的`showEffect`函数中,特效创建后立即开始计时,但实际应该等待后端发送的倒计时数据。
2. **消息处理冲突**:前端自己创建特效数据并显示,与后端发送的数据可能不同步。
## 修正后的代码:
```lua
-- 注册网络消息
SL:RegisterLuaNetMsg(2027, function(msgID, p1, p2, p3, msgData)
local data = SL:JsonDecode(msgData, false) or {}
SL:Print("收到后端特效数据", data)
-- 创建特效层
local sceneLayer = GUI:Win_Create("EffectLayer", 0, 0, 0, 0, false, false, true, false, false, false, 1)
-- 主进度条
local mainImage = GUI:Image_Create(sceneLayer, "Main_Image", 700, 500, "res/erdalu/leishen/jdt/leishen.png")
local mainLoadingBar = GUI:LoadingBar_Create(mainImage, "Main_LoadingBar", 0, 0, "res/erdalu/leishen/jdt/1.png", 0)
GUI:LoadingBar_setPercent(mainLoadingBar, 100) -- 初始100%
-- 存储特效对象
local effectObjects = {}
local num = data.num or 0
local eff1, eff2 = data.preEff, data.startEff
for i = 1, num do
local posX, posY
if data.mapdata and data.mapdata[i] then
posX = data.mapdata[i].x or 0
posY = data.mapdata[i].y or 0
else
posX = 0
posY = 0
end
-- 创建预警特效
local circleEffect = GUI:Effect_Create(sceneLayer, "circle_effect_" .. i,
posX, posY, 0, eff1, 0, 0, 0, 1)
-- 倒计时文本
local countdownText = GUI:Text_Create(circleEffect, "countdown_" .. i,
0, 30, 20, "#FF0000", "等待中...")
effectObjects[i] = {
circleEffect = circleEffect,
countdownText = countdownText,
posX = posX,
posY = posY,
eff2 = eff2
}
end
end)
-- 单独注册倒计时消息
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
SL:Print("倒计时更新:", "剩余时间:", totalCount, "百分比:", percent)
-- 获取特效层
local sceneLayer = GUI:getChildByName(GUI:getRootNode(), "EffectLayer")
if GUI:Win_IsNull(sceneLayer) then
return
end
-- 更新主进度条
local mainImage = GUI:getChildByName(sceneLayer, "Main_Image")
if not GUI:Win_IsNull(mainImage) then
local mainLoadingBar = GUI:getChildByName(mainImage, "Main_LoadingBar")
if not GUI:Win_IsNull(mainLoadingBar) then
GUI:LoadingBar_setPercent(mainLoadingBar, percent)
end
end
-- 更新所有倒计时文本
for i = 1, 10 do -- 假设最多10个特效
local circleEffect = GUI:getChildByName(sceneLayer, "circle_effect_" .. i)
if not GUI:Win_IsNull(circleEffect) then
local countdownText = GUI:getChildByName(circleEffect, "countdown_" .. i)
if not GUI:Win_IsNull(countdownText) then
GUI:Text_setString(countdownText, tostring(totalCount))
end
end
end
-- 倒计时结束
if totalCount == 0 then
-- 播放技能特效
for i = 1, 10 do
local circleEffect = GUI:getChildByName(sceneLayer, "circle_effect_" .. i)
if not GUI:Win_IsNull(circleEffect) then
local pos = GUI:getPosition(circleEffect)
-- 创建技能特效
local skillEffect = GUI:Effect_Create(sceneLayer, "skill_effect_" .. i,
pos.x, pos.y, 0, 83383, 0, 0, 0, 1)
-- 淡出动画
local fadeAction = GUI:ActionSequence(
GUI:DelayTime(0.5),
GUI:ActionFadeTo(0.5, 0),
GUI:CallFunc(function()
GUI:removeFromParent(skillEffect)
end)
)
GUI:runAction(skillEffect, fadeAction)
-- 移除预警特效和文本
GUI:removeFromParent(circleEffect)
end
end
-- 延迟清理场景
SL:ScheduleOnce(function()
if not GUI:Win_IsNull(sceneLayer) then
GUI:removeFromParent(sceneLayer)
end
end, 2.0) -- 2秒后清理
end
end)
```
## 关键修正点:
1. **分离消息处理**:将2027和2028消息分开处理,避免逻辑混乱
2. **使用后端数据**:完全依赖后端发送的倒计时数据,不要在前端自己计时
3. **正确获取组件**:使用`GUI:getChildByName`获取已创建的组件
4. **延迟清理**:使用`SL:ScheduleOnce`延迟清理场景,确保特效播放完成
## 使用建议:
1. 后端每次触发特效时发送2027消息(包含特效数据)
2. 后端定时器每秒发送2028消息(包含倒计时数据)
3. 前端只负责显示,不自己计算时间
这样就能确保CD功能正常工作了!记得在后端正确设置定时器并发送消息哦。