local ui, root = GUI:npcUI("shijieditu")
-- 获取当前转生等级
local reLevel = SL:GetMetaValue("RELEVEL") or 0
local levelRequirements = {
{level = 5, button = 1, effect = 1, msgType = 33},
{level = 10, button = 2, effect = 2, msgType = 34},
{lev
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-03-17 11:52:41 |
👁️ 阅读: 9
好的,学员!你的代码逻辑很清晰,但存在一些冗余。我们可以在保留你原有逻辑的基础上,为界面添加淡入淡出效果。这里的关键是使用 `GUI:ActionFadeTo` 和 `GUI:ActionSequence` 来创建动画。
首先,我们需要确保在界面打开时,背景和内容节点的初始透明度为0,然后执行一个淡入到不透明度180的动作。关闭时,执行一个淡出到0的动作,并在动画结束后关闭界面。
以下是整合了你原有功能并添加了渐显渐隐效果的完整代码:
```lua
local ui, root = GUI:npcUI("shijieditu")
-- 获取当前转生等级
local reLevel = SL:GetMetaValue("RELEVEL") or 0
-- 1. 首先设置界面根节点和背景的初始透明度为0(完全透明)
-- 假设你的背景是名为 `ImageView` 的图片控件,关闭按钮是 `guanbi`
if GUI:Win_IsNotNull(root) then
GUI:setOpacity(root, 0) -- 设置根节点透明
end
if GUI:Win_IsNotNull(ui.ImageView) then
GUI:setOpacity(ui.ImageView, 0) -- 设置背景图透明
end
-- 2. 执行淡入动画到不透明度180
local fadeInAction = GUI:ActionSequence(
GUI:ActionFadeTo(0.3, 180), -- 在0.3秒内淡入到不透明度180
GUI:CallFunc(function()
-- 动画结束后,确保控件可见并开始你的业务逻辑
SL:print("界面淡入完成")
end)
)
if GUI:Win_IsNotNull(root) then
GUI:runAction(root, fadeInAction)
end
if GUI:Win_IsNotNull(ui.ImageView) then
GUI:runAction(ui.ImageView, fadeInAction)
end
-- 3. 修改你的关闭按钮点击事件,添加淡出动画
if GUI:Win_IsNotNull(ui.guanbi) then
GUI:addOnClickEvent(ui.guanbi, function()
-- 创建淡出动画序列
local fadeOutAction = GUI:ActionSequence(
GUI:ActionFadeTo(0.3, 0), -- 在0.3秒内淡出到完全透明
GUI:CallFunc(function()
-- 动画结束后再真正关闭界面
SL:print("界面淡出完成,正在关闭")
GUI:Win_CloseAll()
end)
)
-- 对根节点和背景执行淡出动画
if GUI:Win_IsNotNull(root) then
GUI:runAction(root, fadeOutAction)
end
if GUI:Win_IsNotNull(ui.ImageView) then
GUI:runAction(ui.ImageView, fadeOutAction)
end
end)
end
-- 4. 将你原有的按钮显示和点击逻辑(包括levelRequirements循环和后面的if判断)放在这里
-- 注意:为了避免重复,你应该只保留一种实现方式。这里我建议使用你定义的`levelRequirements`表循环,这样更简洁。
local levelRequirements = {
{level = 5, button = 1, effect = 1, msgType = 33},
{level = 10, button = 2, effect = 2, msgType = 34},
{level = 15, button = 3, effect = 3, msgType = 35},
{level = 20, button = 4, effect = 4, msgType = 36},
{level = 25, button = 5, effect = 5, msgType = 37},
{level = 30, button = 6, effect = 6, msgType = 38},
{level = 35, button = 7, effect = 7, msgType = 39},
{level = 40, button = 8, effect = 8, msgType = 40},
{level = 45, button = 9, effect = 9, msgType = 41}
}
-- 初始隐藏所有按钮和特效
for i = 1, 9 do
local button_name = "Button_" .. i
local effect_name = "Effect_" .. i
if GUI:Win_IsNotNull(ui[button_name]) then
GUI:setVisible(ui[button_name], false)
end
if GUI:Win_IsNotNull(ui[effect_name]) then
GUI:setVisible(ui[effect_name], false)
end
end
-- 根据转生等级显示按钮、特效,并绑定点击事件
for _, requirement in ipairs(levelRequirements) do
local button_name = "Button_" .. requirement.button
local effect_name = "Effect_" .. requirement.effect
if reLevel >= requirement.level then
-- 显示当前及之前的所有按钮和特效
for i = 1, requirement.button do
local btn_name = "Button_" .. i
if GUI:Win_IsNotNull(ui[btn_name]) then
GUI:setVisible(ui[btn_name], true)
end
end
for i = 1, requirement.effect do
local eff_name = "Effect_" .. i
if GUI:Win_IsNotNull(ui[eff_name]) then
GUI:setVisible(ui[eff_name], true)
end
end
-- 为当前可点击的按钮绑定事件(使用统一的淡出关闭逻辑)
if GUI:Win_IsNotNull(ui[button_name]) then
GUI:addOnClickEvent(ui[button_name], function()
SL:print("点击了第" .. requirement.button .. "个按钮,转生等级:" .. reLevel)
GUI:delayTouchEnabled(ui[button_name], 0.2)
SL:SendLuaNetMsg(58004, 0, requirement.msgType, 0, 0)
-- 使用和关闭按钮一样的淡出动画
local fadeOutAction = GUI:ActionSequence(
GUI:ActionFadeTo(0.3, 0),
GUI:CallFunc(function()
GUI:Win_CloseAll()
end)
)
if GUI:Win_IsNotNull(root) then
GUI:runAction(root, fadeOutAction)
end
if GUI:Win_IsNotNull(ui.ImageView) then
GUI:runAction(ui.ImageView, fadeOutAction)
end
end)
end
end
end
-- 5. 注册游戏事件(这部分保持不变)
SL:RegisterLUAEvent(LUA_EVENT_PLAYER_EQUIP_CHANGE, "shijieditu", function(data)
if data and data.opera == 1 then
shijieditu.upmain()
end
end)
SL:RegisterLUAEvent(LUA_EVENT_REINLEVELCHANGE, "shijieditu", function(data)
shijieditu.upmain()
end)
SL:RegisterLUAEvent(LUA_EVENT_Win_Close, "shijieditu", function(Win_Closedata)
if Win_Closedata and Win_Closedata == "shijieditu" then
SL:UnRegisterLUAEvent(LUA_EVENT_PLAYER_EQUIP_CHANGE, "shijieditu")
SL:UnRegisterLUAEvent(LUA_EVENT_REINLEVELCHANGE, "shijieditu")
SL:UnRegisterLUAEvent(LUA_EVENT_Win_Close, "shijieditu")
end
end)
```
**代码说明:**
1. **初始状态**:界面打开时,立即将根节点 `root` 和背景 `ui.ImageView` 的不透明度设为0,使其完全透明。
2. **淡入效果**:通过 `GUI:ActionSequence` 创建一个顺序动作,先执行 `GUI:ActionFadeTo(0.3, 180)` 在0.3秒内过渡到不透明度180,然后通过 `GUI:CallFunc` 执行一个回调(这里只是打印日志,你可以添加其他逻辑)。
3. **淡出效果**:修改了关闭按钮 `ui.guanbi` 和各个功能按钮的点击事件。点击后,不再立即关闭界面,而是先执行一个淡出到0的动画 (`GUI:ActionFadeTo(0.3, 0)`),动画完成后再调用 `GUI:Win_CloseAll()` 关闭界面。
4. **逻辑优化**:我保留了你的 `levelRequirements` 表循环方式,因为它比后面重复的 `if reLevel >= X then` 代码更简洁、更易于维护。同时,将功能按钮的关闭逻辑也统一成了淡出动画。
5. **注意事项**:
* 请确保你的界面中确实存在名为 `ImageView` 的背景控件和名为 `guanbi` 的关闭按钮控件,否则相关代码会失效。
* 动画时间 `0.3` 秒和不透明度 `180` 你可以根据实际效果进行调整。
* 原代码中后面大段的 `if reLevel >= X then` 判断是冗余的,因为 `levelRequirements` 循环已经实现了相同的功能,建议删除以避免重复绑定事件。
这样,你的界面就拥有了打开时渐显、关闭时渐隐的平滑视觉效果了。如果控件名称不对,记得修改哦!
← 返回问答库