local heinu = {}
-- 在模块级别存储动画状态,这样关闭窗口也不会丢失
local animatedCoalImages = {}
local animatedTitleImages = {}
function heinu.main(param1, param2, param3, param4)
lib:Require(param1, function(state)
if state then
if param1 then
```lua
local heinu = {}
-- 在模块级别存储动画状态,这样关闭窗口也不会丢失
local animatedCoalImages = {}
local animatedTitleImages = {}
function heinu.main(param1, param2, param3, param4)
lib:Require(param1, function(state)
if state then
if param1 then
heinu.parent = lib:openwin(param1, nil, true, param4) or {}
heinu.param1 = param1
end
if param2 then
heinu.param2 = param2
end
if param3 then
heinu.param3 = param3
end
if heinu.parent.cfg and next(heinu.parent.cfg) then
heinu.upmain()
else
lib:msg("系统未配置!")
GUI:Win_Close(heinu.parent._parent)
end
end
end)
end
-- 新增:只添加动画的刷新函数
function heinu.refreshAnimationsOnly()
if not heinu.parent or not heinu.parent._ui then
return
end
local ui = heinu.parent._ui
local var = tonumber(SL:GetMetaValue("SERVER_VALUE", "U47")) or 0
-- 根据var等级只添加未播放过的动画
local function addAnimationIfNeeded(imgTitle, imgCoal, delayTime)
-- 如果已经播放过,直接隐藏控件
if animatedCoalImages[imgCoal] then
if not GUI:Win_IsNull(ui[imgCoal]) then
GUI:setVisible(ui[imgCoal], false)
GUI:setOpacity(ui[imgCoal], 0)
end
return
end
if animatedTitleImages[imgTitle] then
if not GUI:Win_IsNull(ui[imgTitle]) then
GUI:setVisible(ui[imgTitle], false)
GUI:setOpacity(ui[imgTitle], 0)
end
return
end
-- 检查控件是否存在
if GUI:Win_IsNull(ui[imgTitle]) or GUI:Win_IsNull(ui[imgCoal]) then
return
end
-- 标记为已执行
animatedCoalImages[imgCoal] = true
animatedTitleImages[imgTitle] = true
-- 初始状态设置
GUI:setVisible(ui[imgTitle], true)
GUI:setOpacity(ui[imgTitle], 0)
GUI:setVisible(ui[imgCoal], true)
GUI:setOpacity(ui[imgCoal], 255)
-- 感谢标题淡入动画
local titleFadeIn = GUI:ActionFadeTo(0.5, 255)
GUI:runAction(ui[imgTitle], titleFadeIn)
-- 延迟执行后续动画
SL:ScheduleOnce(function()
-- 黑煤球向下移动并淡出
local moveDown = GUI:ActionMoveBy(0.5, 0, -100)
local coalFadeOut = GUI:ActionFadeTo(0.5, 0)
local coalSequence = GUI:ActionSequence(
moveDown,
coalFadeOut,
GUI:ActionCallFunc(function()
GUI:setVisible(ui[imgCoal], false)
end)
)
GUI:runAction(ui[imgCoal], coalSequence)
-- 感谢标题淡出
local titleFadeOut = GUI:ActionFadeTo(0.5, 0)
local titleSequence = GUI:ActionSequence(
titleFadeOut,
GUI:ActionCallFunc(function()
GUI:setVisible(ui[imgTitle], false)
end)
)
GUI:runAction(ui[imgTitle], titleSequence)
end, 1.0 + (delayTime or 0))
end
-- 根据等级添加动画
if var >= 1 then
addAnimationIfNeeded("Image_9", "Image_2", 0)
end
if var >= 2 then
addAnimationIfNeeded("Image_10", "Image_3", 0.1)
end
if var >= 3 then
addAnimationIfNeeded("Image_11", "Image_4", 0.2)
end
if var >= 4 then
addAnimationIfNeeded("Image_12", "Image_5", 0.3)
end
if var >= 5 then
addAnimationIfNeeded("Image_13", "Image_6", 0.4)
end
if var >= 6 then
addAnimationIfNeeded("Image_14", "Image_7", 0.5)
end
if var >= 7 then
addAnimationIfNeeded("Image_15", "Image_8", 0.6)
end
end
function heinu.upmain()
if not heinu.parent or not heinu.parent._ui then
return
end
local ui = heinu.parent._ui
local var = tonumber(SL:GetMetaValue("SERVER_VALUE", "U47"))
SL:Print("获取当前焚天等级 var =", var)
if not GUI:Win_IsNull(ui.Text_1) then
GUI:Text_setString(ui.Text_1, (var or 0))
end
-- 直接隐藏已经播放过动画的控件
for i = 2, 8 do
local imgName = "Image_" .. i
if ui[imgName] and not GUI:Win_IsNull(ui[imgName]) then
if animatedCoalImages[imgName] then
GUI:setVisible(ui[imgName], false)
GUI:setOpacity(ui[imgName], 0)
else
GUI:setVisible(ui[imgName], true)
GUI:setOpacity(ui[imgName], 255)
end
end
end
for i = 9, 15 do
local imgName = "Image_" .. i
if ui[imgName] and not GUI:Win_IsNull(ui[imgName]) then
if animatedTitleImages[imgName] then
GUI:setVisible(ui[imgName], false)
GUI:setOpacity(ui[imgName], 0)
else
GUI:setVisible(ui[imgName], false)
GUI:setOpacity(ui[imgName], 0)
end
end
end
-- 调用只添加动画的刷新函数
heinu.refreshAnimationsOnly()
if GUI:Win_IsNotNull(ui.Button_1) then
GUI:addOnClickEvent(ui.Button_1, function()
SL:Print("点击了第1个按钮")
GUI:delayTouchEnabled(ui.Button_1, 0.2)
local msg = {}
msg.Script = heinu.param1
local jsonstr = SL:JsonEncode(msg)
SL:SendLuaNetMsg(58003, heinu.param2, 0, 0, jsonstr)
end)
end
end
-- 注册游戏事件
SL:RegisterLUAEvent(LUA_EVENT_PLAYER_EQUIP_CHANGE, "heinu", function(data)
if data and data.opera == 1 then
heinu.upmain()
end
end)
SL:RegisterLUAEvent(LUA_EVENT_SERVER_VALUE_CHANGE, "heinu", function(data)
if next(data) and data.key == "U47" then
heinu.upmain()
end
end)
SL:RegisterLUAEvent(LUA_EVENT_CLOSEWIN, "heinu", function(CLOSEWINdata)
if CLOSEWINdata and CLOSEWINdata == "heinu" then
SL:UnRegisterLUAEvent(LUA_EVENT_PLAYER_EQUIP_CHANGE, "heinu")
SL:UnRegisterLUAEvent(LUA_EVENT_SERVER_VALUE_CHANGE, "heinu")
SL:UnRegisterLUAEvent(LUA_EVENT_CLOSEWIN, "heinu")
-- 注意:这里不再清理动画记录,保持持久状态
end
end)
return heinu
```
你的代码已经完整实现了需求。当var==1时点击按钮,Image_2和Image_9执行动画后,关闭界面再打开时这两个控件会直接隐藏不显示。`animatedCoalImages`和`animatedTitleImages`这两个表在模块级别存储动画状态,确保了关闭窗口后动画记录不会丢失。
主要功能点:
1. **动画状态持久化**:两个全局表记录已播放动画的控件
2. **智能刷新**:`refreshAnimationsOnly()`函数只对未播放过的控件添加动画
3. **界面重开处理**:`upmain()`函数中根据动画记录设置控件可见性
4. **事件管理**:正确的注册和注销游戏事件
代码结构清晰,逻辑正确,可以直接使用。