Bag = {}
function Bag.Init(isWin32)
-- 网格配置
Bag._ScrollHeight = isWin32 and 214 or 320 -- 容器滚动区域的高度
Bag._PWidth = isWin32 and 338 or 500 -- 容器可见区域 宽
Bag._PHeight = isWin32 and 214 or 320 -- 容器可见区域 高
Bag._IW
根据你的代码分析,问题在于装备数据显示逻辑。`Bag.GetEquipmentData()`函数中通过`SL:GetMetaValue("EQUIP_DATA", equipId)`获取装备数据,但获取到的`equipData`可能不包含`id`字段,导致插入`_equipmentList`失败。
另外,`Bag.UpdateEquipmentDisplay()`函数中装备图标显示逻辑存在矛盾:先设置可见又立即设置为不可见。
以下是完整的修复代码:
```lua
-- 修改装备列表为从服务器获取
Bag._equipmentList = {}
-- 新增:从服务器获取装备数据
function Bag.GetEquipmentData()
Bag._equipmentList = {}
local equipmentIds = {12256, 12257, 12258, 12259, 12267}
for _, equipId in ipairs(equipmentIds) do
-- 从服务器获取装备信息
local equipData = SL:GetMetaValue("EQUIP_DATA", equipId)
if equipData then
-- 直接使用装备ID作为标识
table.insert(Bag._equipmentList, {
id = equipId, -- 使用传入的装备ID
name = equipData.name or "未知装备",
icon = equipData.icon or "res/public/1900000612.png"
})
else
-- 如果服务器没有数据,使用默认数据
table.insert(Bag._equipmentList, {
id = equipId,
name = "装备ID:" .. equipId,
icon = "res/public/1900000612.png"
})
end
end
SL:Print("获取到装备数量:" .. #Bag._equipmentList)
-- 如果有装备更新事件,触发更新
if Bag.UpdateEquipmentDisplay then
Bag.UpdateEquipmentDisplay()
end
end
-- 修改:更新装备显示函数
function Bag.UpdateEquipmentDisplay()
if not Bag._equipmentSlots then
SL:Print("装备槽位未初始化")
return
end
for i = 1, 10 do
local slot = Bag._equipmentSlots[i]
if slot and slot.bg and not GUI:Win_IsNull(slot.bg) then
local equipmentData = Bag._equipmentList[i]
if equipmentData then
-- 有装备的情况
if slot.name and not GUI:Win_IsNull(slot.name) then
GUI:Text_setString(slot.name, equipmentData.name)
GUI:Text_setTextColor(slot.name, "#ffffff")
end
-- 设置装备图标
if slot.icon and not GUI:Win_IsNull(slot.icon) then
GUI:setVisible(slot.icon, true)
-- 加载装备图标
if equipmentData.icon and equipmentData.icon ~= "" then
GUI:Image_setTexture(slot.icon, equipmentData.icon)
end
end
else
-- 没有装备的情况
if slot.name and not GUI:Win_IsNull(slot.name) then
GUI:Text_setString(slot.name, "空")
GUI:Text_setTextColor(slot.name, "#808080")
end
if slot.icon and not GUI:Win_IsNull(slot.icon) then
GUI:setVisible(slot.icon, false)
end
end
end
end
end
-- 修改:初始化装备容器函数
function Bag.InitEquipmentContainer()
-- 获取装备滚动容器
Bag._equipmentScrollView = Bag._ui["ScrollView_equipment"]
if GUI:Win_IsNull(Bag._equipmentScrollView) then
SL:Print("装备滚动容器不存在")
return
end
-- 设置滚动方向为垂直
GUI:ScrollView_setDirection(Bag._equipmentScrollView, 1)
-- 设置容器内边距
GUI:ScrollView_setInnerContainerSize(Bag._equipmentScrollView, 80, 700)
-- 创建装备格子
Bag._equipmentSlots = {}
local slotWidth = 86
local slotHeight = 86
local startY = 800 - 180
local spacing = -20
for i = 1, 10 do
-- 创建格子背景
local slotBg = GUI:Image_Create(Bag._equipmentScrollView,
"equipment_slot_bg_" .. i,
0,
startY - (i-1) * (slotHeight + spacing),
"res/zhuansheng2.0/4.png")
-- 设置格子大小
GUI:setContentSize(slotBg, slotWidth, slotHeight)
-- 创建装备名称文本
local equipmentName = GUI:Text_Create(slotBg,
"equipment_name_" .. i,
0, -20,
12, "#ffffff", "空")
GUI:setAnchorPoint(equipmentName, 0.5, 0.5)
-- 创建装备图标
local equipmentIcon = GUI:Image_Create(slotBg,
"equipment_icon_" .. i,
0, 0,
"")
-- 设置装备图标大小
GUI:setContentSize(equipmentIcon, slotWidth - 30, slotHeight - 30)
GUI:setPosition(equipmentIcon, 5, 5)
GUI:setVisible(equipmentIcon, false)
-- 添加点击事件
GUI:addOnClickEvent(slotBg, function()
Bag.OnEquipmentSlotClick(i)
end)
-- 存储格子引用
Bag._equipmentSlots[i] = {
bg = slotBg,
icon = equipmentIcon,
name = equipmentName
}
end
-- 获取装备数据
Bag.GetEquipmentData()
end
-- 修改:装备穿戴函数
function Bag.WearEquipment(equipmentId, slotIndex)
if slotIndex and slotIndex >= 1 and slotIndex <= 10 then
-- 从服务器获取装备信息
local equipData = SL:GetMetaValue("EQUIP_DATA", equipmentId)
if equipData then
-- 更新装备列表
Bag._equipmentList[slotIndex] = {
id = equipmentId,
name = equipData.name or "未知装备",
icon = equipData.icon or "res/public/1900000612.png"
}
-- 更新显示
Bag.UpdateEquipmentDisplay()
SL:ShowSystemTips("装备穿戴成功:" .. (equipData.name or "未知装备"))
return true
else
-- 如果服务器没有数据,使用默认数据
Bag._equipmentList[slotIndex] = {
id = equipmentId,
name = "装备ID:" .. equipmentId,
icon = "res/public/1900000612.png"
}
Bag.UpdateEquipmentDisplay()
SL:ShowSystemTips("装备穿戴成功:ID=" .. equipmentId)
return true
end
end
return false
end
function Bag.main(page)
local parent = GUI:Attach_Parent()
local isWin32 = SL:GetMetaValue("WINPLAYMODE")
GUI:LoadExport(parent, isWin32 and "bag/bag_panel_win32" or "bag/bag_panel")
Bag._ui = GUI:ui_delegate(parent)
Bag._UI_ScrollView = Bag._ui["ScrollView_items"]
-- 初始化数据
Bag.Init(isWin32)
-- 新增:初始化装备滚动容器
Bag.InitEquipmentContainer()
-- 适配
GUI:setPositionY(Bag._ui["Panel_1"], isWin32 and SL:GetMetaValue("PC_POS_Y") or SL:GetMetaValue("SCREEN_HEIGHT") / 2)
-- 界面拖动
GUI:Win_SetDrag(parent, Bag._ui["Image_bg"])
-- 界面浮起
GUI:Win_SetZPanel(parent, Bag._ui["Image_bg"])
GUI:addOnClickEvent(Bag._ui["Button_close"], function()
SL:CloseBagUI()
end)
-- 存入英雄背包
local Button_store_hero_bag = Bag._ui["Button_store_hero_bag"]
GUI:addOnClickEvent(Button_store_hero_bag, function()
local changeStoreMode = not Bag._changeStoreMode
if changeStoreMode then
local isActiveHero = SL:GetMetaValue("HERO_IS_ACTIVE")
if not isActiveHero then
return SL:ShowSystemTips("英雄还未激活")
end
local isCallHero = SL:GetMetaValue("HERO_IS_ALIVE")
if not isCallHero then
return SL:ShowSystemTips("英雄还未召唤")
end
end
Bag._changeStoreMode = changeStoreMode
GUI:Button_setGrey(Button_store_hero_bag, changeStoreMode)
end)
GUI:setVisible(Button_store_hero_bag, SL:GetMetaValue("USEHERO"))
-- 初始化左侧背包页签
Bag.InitPage()
Bag.PageTo(page or 1)
Bag.OnUpdateGold()
Bag.RegisterEvent()
-- 注册装备数据更新事件
SL:RegisterLUAEvent("EQUIPMENT_DATA_UPDATE", "Bag", function(data)
Bag.GetEquipmentData()
end)
end
```
主要修改点:
1. `Bag.GetEquipmentData()`函数中,即使`SL:GetMetaValue("EQUIP_DATA", equipId)`返回的数据不包含`id`字段,也使用传入的`equipId`作为装备ID
2. 添加了默认数据处理逻辑,确保即使服务器没有返回数据也能显示装备
3. 修复了`Bag.UpdateEquipmentDisplay()`中的图标显示逻辑矛盾
4. 在`Bag.InitEquipmentContainer()`中添加了装备名称文本显示
5. 添加了调试打印,方便排查问题
这样修改后,无极剑魂·道天一心(ID=12267)应该能正常显示在右侧装备容器中了。