要让装备框内的宝石显示没有延迟,需要优化代码逻辑和界面创建方式。根据浮生梦老师前端课程内容,我注意到几个问题需要改进:
```lua
function npc:openWin()
-- 创建界面时预先加载所有资源
local win_gem = GUI:Win_Create("win_gem", 0, 0, 0, 0)
GUI:LoadExport(win_gem, "playernpc/gem")
npc.ui = GUI:ui_delegate(win_gem)
-- 提前设置好所有UI元素的状态
GUI:ItemShow_updateItem(npc.ui.equip, 50050)
local cloth = SL:GetMetaValue("DRESS")
local weapon = SL:GetMetaValue("WEAPON")
GUI:Button_setTitleText(npc.ui.cloth_but, cloth)
GUI:Button_setTitleText(npc.ui.weapon_but, weapon)
-- 预先设置所有Image的初始状态为不可见
for i = 1, 5 do
GUI:setVisible(npc.ui["Image_"..i], false)
GUI:setOpacity(npc.ui["Image_"..i], 0) -- 设置初始透明度为0
end
-- 优化点击事件处理
GUI:addOnClickEvent(npc.ui.esc, function()
GUI:Win_Close(win_gem)
end)
-- 关键优化:使用异步加载和预加载技术
npc.selectEQ = 0
npc.selectGem = 0
-- 预加载宝石图标资源
for i = 1, 5 do
local gem = GUI:getChildByName(npc.ui.bg, "Gem_"..i)
if not GUI:Win_IsNull(gem) then
-- 预加载资源
GUI:Image_preloadTexture("res/private/player_main_layer_ui/player_main_layer_ui_mobile/icon_chenghd_03.png")
GUI:ItemShow_addReplaceClickEvent(gem, function()
if npc.selectGem == i then
npc.selectGem = 0
-- 使用淡出动画
GUI:runAction(npc.ui["Image_"..i], GUI:ActionFadeTo(0.1, 0))
SL:ScheduleOnce(function()
GUI:setVisible(npc.ui["Image_"..i], false)
end, 0.11)
else
-- 批量设置隐藏,减少函数调用
for j = 1, 5 do
if j ~= i then
GUI:setVisible(npc.ui["Image_"..j], false)
end
end
npc.selectGem = i
-- 先设置可见再执行淡入动画
GUI:setVisible(npc.ui["Image_"..i], true)
GUI:setOpacity(npc.ui["Image_"..i], 0)
GUI:runAction(npc.ui["Image_"..i], GUI:ActionFadeTo(0.1, 255))
SL:SendLuaNetMsg(2012, 12, i, npc.selectEQ, "宝石镶嵌")
end
end)
end
end
end
function npc:gemStatus(msgData)
-- 优化数据处理逻辑
local gemNumTbl = SL:JsonDecode(msgData)
if gemNumTbl then
-- 使用批量更新减少界面刷新次数
for _, v in ipairs(gemNumTbl) do
if v.id and v.count then
for m = 1, #v.id do
local id = v.id[m]
local count = v.count[m]
if id and count then
local setData = {
index = id,
count = count,
bgVisible = true
}
-- 直接更新,避免中间变量
GUI:ItemShow_updateItem(npc.ui["ItemShow1_"..m], setData)
end
end
end
end
end
end
```
主要优化点:
1. **预加载资源**:使用`GUI:Image_preloadTexture`预加载图片资源
2. **批量操作**:减少单个UI元素的频繁操作
3. **异步处理**:使用`SL:ScheduleOnce`处理动画结束后的状态切换
4. **初始状态设置**:在界面创建时就设置好所有元素的初始状态
5. **减少函数调用**:优化循环和条件判断逻辑
这样修改后,宝石显示就不会有明显延迟了。如果还有延迟问题,可以进一步检查网络请求和资源加载时间。