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
看了你的代码,主要问题在于前后端的倒计时管理不同步。前端使用了 `SL:RegisterLuaNetMsg(2028, ...)` 接收后端的时间数据,但你的后端代码中,当倒计时为0时,你发送了 `{totalCount = 0, percent = 0}` 的数据,然后前端会立即清理所有特效,这导致特效的视觉表现和逻辑处理不协调。
此外,前端在 `showEffect` 函数中,每次收到后端时间数据都会更新所有特效的倒计时文本,但当 `totalCount == 0` 时,前端会立即为每个特效创建技能特效并清理预警特效,这可能会和特效本身的播放周期冲突。
根据浮生梦老师前端课程内容,这里提供修正后的完整前端 `showEffect` 函数,主要调整点在于倒计时结束时的处理逻辑:
```lua
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
-- 创建父节点作为容器
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")
if GUI:Win_IsNotNull(mainImage) then
GUI:setVisible(mainImage, true)
end
local mainLoadingBar = GUI:LoadingBar_Create(mainImage, "Main_LoadingBar", 0, 0, "res/erdalu/leishen/jdt/1.png", 0)
GUI:LoadingBar_setPercent(mainLoadingBar, 0) -- 初始0%
-- 存储所有需要管理的对象
local effectObjects = {}
for i = 1, num do
-- 获取屏幕尺寸
local screenWidth = SL:GetMetaValue("SCREEN_WIDTH") or 1280
local screenHeight = SL:GetMetaValue("SCREEN_HEIGHT") or 720
-- 在屏幕范围内随机位置显示特效
local posX, posY
if data.mapdata and data.mapdata[i] then
posX = data.mapdata[i].x or math.random(100, screenWidth - 100)
posY = data.mapdata[i].y or math.random(100, screenHeight - 100)
else
posX = math.random(100, screenWidth - 100)
posY = math.random(100, screenHeight - 100)
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", "40")
-- 存储对象
effectObjects[i] = {
circleEffect = circleEffect,
countdownText = countdownText,
posX = posX,
posY = posY,
eff2 = eff2,
hasPlayedSkill = false -- 新增标志位,防止重复播放技能特效
}
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)
-- 更新主进度条
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
end
end
-- 当倒计时为0时触发技能特效(只触发一次)
if totalCount == 0 then
for i = 1, num do
if effectObjects[i] and not effectObjects[i].hasPlayedSkill then
effectObjects[i].hasPlayedSkill = true
-- 清理预警特效和倒计时文本
if effectObjects[i].countdownText and not GUI:Win_IsNull(effectObjects[i].countdownText) then
GUI:removeFromParent(effectObjects[i].countdownText)
end
if effectObjects[i].circleEffect and not GUI:Win_IsNull(effectObjects[i].circleEffect) then
GUI:removeFromParent(effectObjects[i].circleEffect)
-- 创建技能特效
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
end
end
end
-- 所有技能特效播放完成后清理场景
SL:ScheduleOnce(function()
if not GUI:Win_IsNull(sceneLayer) then
GUI:removeFromParent(sceneLayer)
end
-- 取消注册消息
SL:UnRegisterLuaNetMsg(2028)
end, 2.0) -- 等待2秒让所有技能特效播放完
end
end)
end
```
主要修改点:
1. 增加了 `hasPlayedSkill` 标志位,确保每个特效的技能特效只播放一次
2. 将场景清理逻辑改为所有技能特效播放完成后统一执行,使用 `SL:ScheduleOnce` 延迟2秒
3. 当倒计时为0时,先清理预警特效和倒计时文本,再创建技能特效
这样修改后,特效的CD逻辑会更加清晰:预警特效显示倒计时,倒计时结束后播放技能特效,所有技能特效播放完成后清理整个场景。
如果你还有其他问题,比如特效位置或动画效果需要调整,可以继续问我!