-- 背包系统主模块
Bag = {}
-- 背包系统初始化函数
-- @param isWin32: 是否为PC端(true为PC端,false为移动端)
function Bag.Init(isWin32)
-- 背包UI尺寸配置
Bag._ScrollHeight = isWin32 and 428 or 320 -- 背包滚动区域高度(PC:214/移动:320)
Bag._PWidth = isWin32 and 338 or 500 -- 背包可视区域宽度(PC:338/移动:500)
Bag._PHeight = isWin32 and 428 or 320 -- 背包可视区域高度(PC:214/移动:320)
Bag._IWidth = isWin32 and 36 or 62.5 -- 物品格子宽度(PC:42.8/移动:62.5)
Bag._IHeight = isWin32 and 36 or 64 -- 物品格子高度(PC:40.6/移动:64)
-- 背包基础配置
Bag._Row = 8 -- 背包行数
Bag._Col = 10 -- 背包列数
Bag._PerPageNum = 80 -- 每页容量(Row * Col)
Bag._defaultNum = 80 -- 系统默认每页格子数
Bag._MaxPage = 1 -- 最大页数限制
Bag._codeInitGrid = true -- 是否需要代码动态生成格子线
-- 背包状态相关
Bag._changeStoreMode = false -- 是否切换到英雄背包存储模式
Bag._bagPage = 1 -- 当前开放页数
Bag._selPage = 1 -- 当前选中页签
-- Bag._openNum = SL:GetMetaValue("MAX_BAG") -- 背包开放总格子数
Bag._openNum = 80 -- 背包开放总格子数
-- UI资源路径
Bag._lockImg = "res/public/icon_tyzys_01.png" -- 锁定图标
Bag._baiTanImg = isWin32 and "res/public/word_bqzy_09_1.png" or "res/public/word_bqzy_09.png" -- 摆摊图标
Bag._bagPageBtns = {} -- 页签按钮缓存表
end
-- 背包主界面创建函数
-- @param page: 指定打开的页码
function Bag.main(page)
local parent = GUI:Attach_Parent()
local isWin32 = SL:GetMetaValue("WINPLAYMODE")
-- 加载UI布局文件
GUI:LoadExport(parent, isWin32 and "bag/bag_panel_win32" or "bag/bag_panel")
-- 获取UI引用
Bag._ui = GUI:ui_delegate(parent)
Bag._UI_ScrollView = Bag._ui["ScrollView_items"]
-- 初始化背包数据
Bag.Init(isWin32)
-- 界面位置适配
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()
end
-- 初始化背包页签
function Bag.InitPage()
-- 计算当前可开放的最大页数
Bag._bagPage = math.ceil(Bag._openNum / Bag._PerPageNum)
SL:Print("背包页数:" .. Bag._bagPage)
Bag._bagPage = math.max(Bag._bagPage, 1)
SL:Print("背包页数:" .. Bag._bagPage)
Bag._bagPage = math.min(Bag._bagPage, Bag._MaxPage)
SL:Print("背包页数:" .. Bag._bagPage)
-- 初始化页签按钮
for i = 1, Bag._MaxPage do
local pageBtn = Bag._ui["Button_page" .. i]
GUI:setVisible(pageBtn, false)
-- 多页时显示页签
if Bag._bagPage ~= 1 and i <= Bag._bagPage then
GUI:setVisible(pageBtn, true)
GUI:setTag(pageBtn, i)
Bag._bagPageBtns[i] = pageBtn
-- 页签切换事件
GUI:addOnClickEvent(GUI:getChildByName(pageBtn, "TouchSize"), function()
if Bag._selPage == i then return false end
Bag.PageTo(i)
if Bag.UpdateItems then
Bag.UpdateItems()
end
end)
end
end
local ybNum = SL:GetMetaValue("ITEM_COUNT", 2)
if Bag._ui.Text_ybNum then
GUI:Text_setString(Bag._ui.Text_ybNum, ybNum)
end
end
-- 切换背包页面
-- @param page: 目标页码
function Bag.PageTo(page)
if Bag._selPage == page then
return false
end
SL:SetMetaValue("BAG_PAGE_CUR", page)
Bag._selPage = page
Bag.SetPageBtnStatus()
end
-- 更新页签按钮状态
function Bag.SetPageBtnStatus()
for i = 1, Bag._bagPage do
local btnPage = Bag._bagPageBtns[i]
if btnPage then
local isPress = i == Bag._selPage and true or false
-- 1: true
-- 2: false
-- 3: false
-- 4: false
-- 设置按钮状态
GUI:Button_setBright(btnPage, not isPress) --选 中的页签是否高亮
GUI:setLocalZOrder(btnPage, isPress and Bag._bagPage + 1 or GUI:getTag(btnPage))
-- 更新页码文本样式
local pageText = GUI:getChildByName(btnPage, "PageText")
GUI:Text_setTextColor(pageText, isPress and "#f8e6c6" or "#807256")
GUI:setScale(pageText, isPress and 1 or 0.9)
end
end
end
-- 初始化背包格子线条
-- 该函数用于动态生成背包界面的网格线条效果
function Bag.InitGird()
local index = 0 -- 格子索引计数器
-- 双层循环遍历生成网格
-- i代表行数(从1到Row+1)
-- j代表列数(从1到Col+1)
for i = 1, Bag._Row + 1 do
for j = 1, Bag._Col + 1 do
-- 计算当前格子的坐标位置
-- x: 从左到右,每个格子宽度递增
-- y: 从上到下,每个格子高度递减
local x = (j-1) * Bag._IWidth
local y = Bag._ScrollHeight - (i-1) * Bag._IHeight
-- 生成竖线(除了最后一行都需要生成)
if i <= Bag._Row then
-- 创建竖线图片对象
local pGird1 = GUI:Image_Create(Bag._UI_ScrollView, "Grid_1_" .. index, x, y, "res/public/bag_gezi.png")
-- 设置锚点:
-- 第一列锚点为(0,0)
-- 其他列锚点为(0,1)
GUI:setAnchorPoint(pGird1, 0, j == 1 and 0 or 1)
-- 旋转90度形成竖线
GUI:setRotation(pGird1, 90)
index = index + 1
end
-- 生成横线(除了最后一列都需要生成)
if j <= Bag._Col then
-- 创建横线图片对象
local pGird2 = GUI:Image_Create(Bag._UI_ScrollView, "Grid_2_" .. index, x, y, "res/public/bag_gezi.png")
-- 设置锚点:
-- 第一行锚点为(0,1)
-- 其他行锚点为(0,0)
GUI:setAnchorPoint(pGird2, 0, i == 1 and 1 or 0)
index = index + 1
end
end
end
end
-- 重置背包初始参数
function Bag.ResetInitData()
local isWinMode = SL:GetMetaValue("WINPLAYMODE")
-- 获取配置的行列数
local bag_row_col = SL:GetMetaValue("GAME_DATA", "bag_row_col_max")
if isWinMode and bag_row_col then
local slices = string.split(bag_row_col, "|")
Bag._Row = tonumber(slices[2]) or 5
Bag._Col = tonumber(slices[1]) or 8
Bag._PerPageNum = Bag._Row * Bag._Col
-- 格子数超过默认值时隐藏页签
if Bag._PerPageNum > Bag._defaultNum then
for i = 1, Bag._MaxPage do
local pageBtn = Bag._ui["Button_page"..i]
GUI:setVisible(pageBtn, false)
end
end
end
-- 更新滚动容器尺寸
local pSize = GUI:getContentSize(Bag._UI_ScrollView)
GUI:ScrollView_setInnerContainerSize(Bag._UI_ScrollView, pSize)
Bag._ScrollHeight = pSize.height
Bag._PWidth = pSize.width
Bag._PHeight = pSize.height
Bag._IWidth = Bag._PWidth / Bag._Col
Bag._IHeight = Bag._PHeight / Bag._Row
-- 初始化格子
if Bag._codeInitGrid then
-- Bag.InitGird()
end
end
-- 更新金币显示
-- @param data: 金币数据
function Bag.OnUpdateGold(data)
SL:Dump(data, "DATA", 1)
if SL:GetMetaValue("WINPLAYMODE") then
if not data or (data.id == 1) then
local goldNum = SL:GetMetaValue("ITEM_COUNT", 1)
if Bag._ui.Text_goldNum then
GUI:Text_setString(Bag._ui.Text_goldNum, goldNum)
end
elseif data.id == 2 then
local ybNum = SL:GetMetaValue("ITEM_COUNT", 2)
if Bag._ui.Text_ybNum then
GUI:Text_setString(Bag._ui.Text_ybNum, ybNum)
end
end
end
end
-- 检查是否可以单击物品
-- @param data: 物品数据
function Bag.IsCanSingle(data)
return true
end
-- 检查是否可以双击物品
-- @param data: 物品数据
function Bag.IsCanDouble(data)
return true
end
-- 背包关闭处理
-- @param winID: 窗口ID
function Bag.OnClose(winID)
if winID and winID == "BagLayerGUI" then
Bag.UnRegisterEvent()
end
end
-- 注册事件监听
function Bag.RegisterEvent()
SL:RegisterLUAEvent(LUA_EVENT_MONEYCHANGE, "Bag", Bag.OnUpdateGold)
SL:RegisterLUAEvent(LUA_EVENT_CLOSEWIN, "Bag", Bag.OnClose)
end
-- 注销事件监听
function Bag.UnRegisterEvent()
SL:UnRegisterLUAEvent(LUA_EVENT_MONEYCHANGE, "Bag")
SL:UnRegisterLUAEvent(LUA_EVENT_CLOSEWIN, "Bag")
end