写一个物品拆分功能
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-04-17 20:47:35 |
👁️ 阅读: 7
根据浮生梦老师前端课程内容,我来帮你实现一个物品拆分功能。这个功能包括创建拆分界面、数量选择和确认拆分等步骤。
```lua
-- 创建拆分界面主函数
function CreateItemSplitUI()
-- 创建父节点
local parent = GUI:Win_Create("ItemSplitUI", 0, 0, 0, 0, false, false, true, false, false, false, 1)
-- 创建触摸层(用于点击空白处关闭)
local Panel_touch = GUI:Layout_Create(parent, "Panel_touch", 0, 0, 0, 0, false)
GUI:setAnchorPoint(Panel_touch, 0.5, 0.5)
GUI:setTag(Panel_touch, 9)
GUI:setTouchEnabled(Panel_touch, true)
-- 创建主面板
local Panel_1 = GUI:Layout_Create(parent, "Panel_1", 0, 50, 367, 268, false)
GUI:setAnchorPoint(Panel_1, 0.5, 0.5)
GUI:setTag(Panel_1, 8)
GUI:setTouchEnabled(Panel_1, true)
-- 背景图片
local img_bg = GUI:Image_Create(Panel_1, "img_bg", 0, 0, "res/public/public_bg4.png")
GUI:setContentSize(img_bg, 367, 268)
GUI:setTouchEnabled(img_bg, true)
-- 标题背景
local Image_9 = GUI:Image_Create(Panel_1, "Image_9", 184, 232, "res/public/public_titlebg.png")
GUI:setAnchorPoint(Image_9, 0.5, 0.5)
GUI:setContentSize(Image_9, 273, 27)
GUI:setTag(Image_9, 134)
-- 标题文字
local Text_title = GUI:Text_Create(Panel_1, "Text_title", 178, 231, 18, "#F2E7CE", "选择拆分数量")
GUI:Text_enableOutline(Text_title, "#111111", 2)
GUI:setAnchorPoint(Text_title, 0.5, 0.5)
GUI:setContentSize(Text_title, 108, 24)
GUI:setIgnoreContentAdaptWithSize(Text_title, true)
GUI:setTag(Text_title, 10)
-- 输入框背景
local Image_2 = GUI:Image_Create(Panel_1, "Image_2", 167, 104, "res/public/1900000668.png")
GUI:setAnchorPoint(Image_2, 0.5, 0.5)
GUI:setContentSize(Image_2, 100, 26)
GUI:setTag(Image_2, 11)
-- 物品图标背景
local Image_iconbg = GUI:Image_Create(Panel_1, "Image_iconbg", 96, 171, "res/public/1900000664.png")
GUI:setAnchorPoint(Image_iconbg, 0.5, 0.5)
GUI:setContentSize(Image_iconbg, 60, 60)
GUI:setTag(Image_iconbg, 127)
-- 数量输入框
local TextField = GUI:TextInput_Create(Panel_1, "TextField", 167, 104, 100, 26, 18)
GUI:TextInput_setPlaceHolder(TextField, "输入数量")
GUI:setAnchorPoint(TextField, 0.5, 0.5)
GUI:setTag(TextField, 12)
GUI:setTouchEnabled(TextField, true)
-- 确定按钮
local Button_ok = GUI:Button_Create(Panel_1, "Button_ok", 267, 49, "res/public/public_multi_leftbtn2.png")
GUI:Button_setScale9Slice(Button_ok, 15.000000953674, 14.999999046326, 11.000001907349, 10.999998092651)
GUI:Button_setTitleFontSize(Button_ok, 18)
GUI:Button_setTitleText(Button_ok, "确定")
GUI:setAnchorPoint(Button_ok, 0.5, 0.5)
GUI:setContentSize(Button_ok, 145, 43)
GUI:setTag(Button_ok, 17)
-- 物品名称
local Text_name = GUI:Text_Create(Panel_1, "Text_name", 144, 185, 18, "#F2E7CE", "物品名称")
GUI:Text_enableOutline(Text_name, "#111111", 2)
GUI:setAnchorPoint(Text_name, 0, 0.5)
GUI:setContentSize(Text_name, 54, 24)
GUI:setIgnoreContentAdaptWithSize(Text_name, true)
GUI:setTag(Text_name, 15)
-- 当前数量节点
local Node_curNum = GUI:Node_Create(Panel_1, "Node_curNum", 144, 159)
GUI:setTag(Node_curNum, 133)
-- 物品节点
local Node_goods = GUI:Node_Create(Panel_1, "Node_goods", 96, 172)
GUI:setTag(Node_goods, 16)
-- 计算按钮
local Button_calc = GUI:Button_Create(Panel_1, "Button_calc", 314, 106, "res/private/page_store_ui/quick_detail_ui/btn_calc.png")
return parent
end
-- 拆分功能管理类
ItemSplitPop = {}
-- 初始化拆分界面
function ItemSplitPop.Init(itemData, maxCount, closeCB)
ItemSplitPop._count = 1
ItemSplitPop._maxCount = maxCount
ItemSplitPop._itemData = itemData
ItemSplitPop._closeCB = closeCB
-- 创建UI
ItemSplitPop._ui = CreateItemSplitUI()
-- 设置物品信息
GUI:Text_setString(ItemSplitPop._ui.Text_name, itemData.Name or "")
-- 按钮事件
GUI:addOnClickEvent(ItemSplitPop._ui.Button_add, function()
if ItemSplitPop._count < ItemSplitPop._maxCount then
ItemSplitPop._count = ItemSplitPop._count + 1
ItemSplitPop.RefreshCount()
end
end)
GUI:addOnClickEvent(ItemSplitPop._ui.Button_reduce, function()
if ItemSplitPop._count > 1 then
ItemSplitPop._count = ItemSplitPop._count - 1
ItemSplitPop.RefreshCount()
end
end)
-- 确认拆分
GUI:addOnClickEvent(ItemSplitPop._ui.Button_ok, function()
if not SL:GetMetaValue("BAG_IS_FULL", true) then
SL:RequestSplitItem(ItemSplitPop._itemData, ItemSplitPop._count)
if ItemSplitPop._count == ItemSplitPop._maxCount and ItemSplitPop._closeCB then
ItemSplitPop._closeCB()
end
-- 关闭拆分界面
if not GUI:Win_IsNull(ItemSplitPop._ui) then
GUI:removeFromParent(ItemSplitPop._ui)
end
end
end)
-- 点击空白处关闭
GUI:addOnClickEvent(ItemSplitPop._ui.Panel_touch, function()
if not GUI:Win_IsNull(ItemSplitPop._ui) then
GUI:removeFromParent(ItemSplitPop._ui)
end
end)
ItemSplitPop.RefreshCount()
end
-- 刷新显示的数量
function ItemSplitPop.RefreshCount()
GUI:TextInput_setString(ItemSplitPop._ui.TextField, tostring(ItemSplitPop._count))
end
-- 在物品Tips中添加拆分按钮
function AddSplitButtonToItemTips(parent, itemData)
-- 检查物品是否可以拆分
if itemData.OverLap and itemData.OverLap > 1 then
local itemConfig = SL:GetMetaValue("ITEM_DATA", itemData.Index)
if itemConfig and itemConfig.OverLap and itemConfig.OverLap > 1 then
-- 创建拆分按钮
local splitBtn = GUI:Button_Create(parent, "btn_split", 100, 50, "res/public/public_multi_leftbtn2.png")
GUI:Button_setTitleText(splitBtn, "拆分")
GUI:Button_setTitleFontSize(splitBtn, 16)
GUI:addOnClickEvent(splitBtn, function()
-- 打开拆分界面
ItemSplitPop.Init(itemData, itemData.OverLap, function()
SL:print("拆分完成")
end)
end)
end
end
end
-- 使用示例
-- 在物品Tips中调用:
-- AddSplitButtonToItemTips(tipsPanel, currentItemData)
-- 或者直接打开拆分界面:
-- ItemSplitPop.Init(itemData, maxCount, function()
-- SL:print("拆分操作完成")
-- end)
```
这个拆分功能包括:
1. **创建拆分界面**:包含物品图标、名称、数量输入框和操作按钮
2. **数量调节**:支持增加和减少拆分数量
3. **拆分确认**:检查背包是否已满,然后调用`SL:RequestSplitItem`进行拆分
4. **集成到物品Tips**:可以在物品Tips中添加拆分按钮
注意:拆分前一定要检查背包空间,避免拆分后物品无法放入背包!
← 返回问答库