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 |
🕒 时间: 2026-03-24 14:22:24 |
👁️ 阅读: 0
看了你的代码,我发现一个关键问题:在点击Button_5后,你调用了`GUI:Win_CloseAll()`,这会关闭所有界面,包括你刚刚创建的`sceneLayer`特效容器。
## 问题分析:
1. `GUI:Win_CloseAll()`会关闭所有界面,包括你创建的`EffectLayer`
2. 特效需要在关闭界面后继续显示
3. `Image_6`组件需要在关闭其他界面后依然可见
## 解决方案:
```lua
if GUI:Win_IsNotNull(ui["Button_5"]) then
GUI:addOnClickEvent(ui["Button_5"], function()
SL:print("点击Button_5触发特效")
GUI:delayTouchEnabled(ui["Button_5"], 0.2)
-- 先创建特效容器(放在关闭界面之前)
local sceneLayer = GUI:Win_Create("EffectLayer", 0, 0, 0, 0, false, false, true, false, false, false, 1)
-- 创建特效数据
local effectData = leishen.createButtonEffectData()
-- 添加随机位置
local screenWidth = SL:GetMetaValue("SCREEN_WIDTH") or 1280
local screenHeight = SL:GetMetaValue("SCREEN_HEIGHT") or 720
for i = 1, effectData.num do
effectData.mapdata[i] = {
x = math.random(100, screenWidth - 100),
y = math.random(100, screenHeight - 100)
}
end
-- 直接发送消息触发特效
local effectJson = SL:JsonEncode(effectData)
SL:SendLuaNetMsg(2027, 0, 0, 0, effectJson)
-- 发送升级请求
local msg = {}
msg.Script = leishen.param1
local jsonstr = SL:JsonEncode(msg)
SL:SendLuaNetMsg(58003, leishen.param2, 4, 0, jsonstr)
-- 关闭其他界面
GUI:Win_CloseAll()
-- 显示Image_6(需要确保Image_6在sceneLayer中创建)
local image6 = GUI:Image_Create(sceneLayer, "Image_6", 0, 0, "res/public_win32/1900000610.png")
GUI:setVisible(image6, true)
-- 创建LoadingBar_1
local loadingBar = GUI:LoadingBar_Create(image6, "LoadingBar_1", 100, 100, "res/public/loadingbar_bg.png", "res/public/loadingbar_fill.png")
GUI:LoadingBar_setPercent(loadingBar, 100)
-- 倒计时逻辑
local count = 40
local timerID = "loadingbar_countdown"
SL:Unschedule(timerID)
SL:Schedule(timerID, function()
count = count - 1
if count >= 0 then
local percent = (count / 40) * 100
GUI:LoadingBar_setPercent(loadingBar, percent)
if count == 0 then
GUI:setVisible(image6, false)
GUI:LoadingBar_setPercent(loadingBar, 100)
SL:Unschedule(timerID)
GUI:removeFromParent(sceneLayer)
end
else
SL:Unschedule(timerID)
end
end, 1, true)
end)
end
```
## 关键修改:
1. **提前创建特效容器**:在关闭界面之前创建`sceneLayer`,避免被关闭
2. **重新创建Image_6**:在`sceneLayer`中创建新的`Image_6`,而不是依赖界面中的组件
3. **正确创建LoadingBar**:使用`GUI:LoadingBar_Create`创建进度条组件
4. **清理资源**:倒计时结束后移除`sceneLayer`
这样修改后,点击Button_5会:
1. 关闭所有现有界面
2. 显示特效和新的Image_6界面
3. 40秒倒计时结束后自动清理
注意:你需要根据实际需求调整Image_6的位置和大小参数。
看了你的代码,我发现一个关键问题:在点击Button_5后,你调用了`GUI:Win_CloseAll()`,这会关闭所有界面,包括你刚刚创建的`sceneLayer`特效容器。
## 问题分析:
1. `GUI:Win_CloseAll()`会关闭所有界面,包括你创建的`EffectLayer`
2. 特效需要在关闭界面后继续显示
3. `Image_6`组件需要在关闭其他界面后依然可见
## 解决方案:
```lua
if GUI:Win_IsNotNull(ui["Button_5"]) then
GUI:addOnClickEvent(ui["Button_5"], function()
SL:print("点击Button_5触发特效")
GUI:delayTouchEnabled(ui["Button_5"], 0.2)
-- 先创建特效容器(放在关闭界面之前)
local sceneLayer = GUI:Win_Create("EffectLayer", 0, 0, 0, 0, false, false, true, false, false, false, 1)
-- 创建特效数据
local effectData = leishen.createButtonEffectData()
-- 添加随机位置
local screenWidth = SL:GetMetaValue("SCREEN_WIDTH") or 1280
local screenHeight = SL:GetMetaValue("SCREEN_HEIGHT") or 720
for i = 1, effectData.num do
effectData.mapdata[i] = {
x = math.random(100, screenWidth - 100),
y = math.random(100, screenHeight - 100)
}
end
-- 直接发送消息触发特效
local effectJson = SL:JsonEncode(effectData)
SL:SendLuaNetMsg(2027, 0, 0, 0, effectJson)
-- 发送升级请求
local msg = {}
msg.Script = leishen.param1
local jsonstr = SL:JsonEncode(msg)
SL:SendLuaNetMsg(58003, leishen.param2, 4, 0, jsonstr)
-- 关闭其他界面
GUI:Win_CloseAll()
-- 显示Image_6(需要确保Image_6在sceneLayer中创建)
local image6 = GUI:Image_Create(sceneLayer, "Image_6", 0, 0, "res/public_win32/1900000610.png")
GUI:setVisible(image6, true)
-- 创建LoadingBar_1
local loadingBar = GUI:LoadingBar_Create(image6, "LoadingBar_1", 100, 100, "res/public/loadingbar_bg.png", "res/public/loadingbar_fill.png")
GUI:LoadingBar_setPercent(loadingBar, 100)
-- 倒计时逻辑
local count = 40
local timerID = "loadingbar_countdown"
SL:Unschedule(timerID)
SL:Schedule(timerID, function()
count = count - 1
if count >= 0 then
local percent = (count / 40) * 100
GUI:LoadingBar_setPercent(loadingBar, percent)
if count == 0 then
GUI:setVisible(image6, false)
GUI:LoadingBar_setPercent(loadingBar, 100)
SL:Unschedule(timerID)
GUI:removeFromParent(sceneLayer)
end
else
SL:Unschedule(timerID)
end
end, 1, true)
end)
end
```
## 关键修改:
1. **提前创建特效容器**:在关闭界面之前创建`sceneLayer`,避免被关闭
2. **重新创建Image_6**:在`sceneLayer`中创建新的`Image_6`,而不是依赖界面中的组件
3. **正确创建LoadingBar**:使用`GUI:LoadingBar_Create`创建进度条组件
4. **清理资源**:倒计时结束后移除`sceneLayer`
这样修改后,点击Button_5会:
1. 关闭所有现有界面
2. 显示特效和新的Image_6界面
3. 40秒倒计时结束后自动清理
注意:你需要根据实际需求调整Image_6的位置和大小参数。
← 返回问答库