local heinu = {}
-- 在模块级别存储动画状态,这样关闭窗口也不会丢失
local animatedCoalImages = {}
local animatedTitleImages = {}
function heinu.main(param1, param2, param3, param4)
lib:Require(param1, function(state)
if state then
if param1 then
看了你的代码,问题出在动画状态记录的持久化逻辑上。你虽然用 `animatedCoalImages` 和 `animatedTitleImages` 两个表来记录状态,但每次重新打开界面时,`heinu.upmain()` 函数会重新执行,而这两个表是模块级别的,确实会保留。然而,你在播放动画的 `playAnimation` 函数里,检查的是这两个表,这没问题。
但关键在于,你在 `upmain` 函数开头,根据 `animatedCoalImages` 和 `animatedTitleImages` 来设置控件可见性和透明度时,逻辑有冲突。
对于 `Image_2` 到 `Image_8` (黑煤球),如果已播放过动画 (`animatedCoalImages[imgName]` 为真),你会隐藏它 (`setVisible(false)`) 并设置透明度为0。这步操作是正确的,它应该让已播放动画的煤球不再显示。
对于 `Image_9` 到 `Image_15` (感谢标题),你的逻辑是:如果已播放过动画 (`animatedTitleImages[imgName]` 为真),就隐藏并透明;**否则,也隐藏并透明**。这意味着,无论是否播放过动画,这些标题图片在界面刚打开时都是隐藏的。这就是为什么你感觉动画“再一次播放”了——因为标题图片在动画开始前被强制隐藏了,动画播放时(淡入)你又让它显示出来,所以看起来像是重新播放。
**修复方案:**
对于标题图片 (`Image_9` 到 `Image_15`),只有当它已经播放过动画时才隐藏,否则应该保持它原本的状态(可能是显示,等待动画触发)。但根据你的动画设计,这些标题在触发前应该是隐藏的。所以,更合理的做法是:在界面初始化时,如果标题**没有**播放过动画,就将其隐藏(而不是无论是否播放都隐藏)。这样,已播放过的标题会保持隐藏状态,未播放的标题也会被隐藏,等待动画触发时再显示。
另外,你的 `playAnimation` 函数里,在动画最后用 `CallFunc` 隐藏了控件,这和你开头根据状态表隐藏控件的逻辑是重复的,但问题不大,可以确保隐藏。
以下是修改后的 `heinu.upmain()` 函数中,初始化控件显示状态的部分代码:
```lua
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
-- ... 后面的 playAnimation 函数和根据 var 播放动画的逻辑保持不变 ...
```
**核心修改点:**
1. 对于黑煤球 (`Image_2` 到 `Image_8`):已播放动画的隐藏,未播放的显示。这和你原来一样,是正确的。
2. 对于感谢标题 (`Image_9` 到 `Image_15`):已播放动画的隐藏;**未播放动画的,也先隐藏起来**。这样它们不会在界面打开时突兀地显示,只会在 `playAnimation` 函数中被触发显示(淡入)。
这样修改后,当 `Image_2` 和 `Image_9` 的动画已经播放并记录在状态表中,再次打开界面时,`Image_2` 会根据状态表被隐藏,`Image_9` 也会根据状态表被隐藏,就不会再触发动画了。
另外,检查一下你的 `playAnimation` 函数,确保在动画序列的最后,`CallFunc` 里的 `GUI:setVisible(ui[imgCoal], false)` 和 `GUI:setVisible(ui[imgTitle], false)` 确实执行了,这能保证动画播放完毕后控件是隐藏的,和状态表记录一致。
如果还有问题,可以在 `playAnimation` 函数开头加一句打印,确认当状态表里已有记录时,函数是否真的直接返回了:
```lua
local function playAnimation(imgTitle, imgCoal, delayTime)
if animatedCoalImages[imgCoal] or animatedTitleImages[imgTitle] then
SL:Print("动画已播放过,直接返回:", imgCoal, imgTitle)
return -- 这个动画已经执行过,直接返回
end
-- ... 其余代码 ...
end
```
这样就能更清楚地知道逻辑是否按预期执行了。