根据浮生梦老师前端课程内容,要实现根据配置表展示道具框,需要修改`MainTarget.clickMonDrop`函数和添加配置表处理逻辑。以下是完整的实现方案:
```lua
-- 在MainTarget.main函数中初始化配置表
local monDropList = SL:Require("game_config/monDropShow", true)
-- 修改clickMonDrop函数
function MainTarget.clickMonDrop()
if MainTarget._isShow then
MainTarget._isShow = false
GUI:setOpacity(MainTarget.UI.ShowBox, 255)
-- 使用淡出动画
local fadeOutAction = GUI:ActionSequence(
GUI:ActionFadeTo(0.8, 0),
GUI:CallFunc(function()
GUI:setVisible(MainTarget.UI.ShowBox, false)
-- 清空道具展示
MainTarget.clearDropItems()
end)
)
GUI:runAction(MainTarget.UI.ShowBox, fadeOutAction)
else
MainTarget._isShow = true
-- 根据当前目标获取配置
local target = SL:GetMetaValue("ACTOR_DATA", MainTarget._targetID)
if target then
local targetMonName = SL:GetMetaValue("ACTOR_NAME", target)
-- 查找配置
local config = nil
for i, cfg in ipairs(monDropList) do
if targetMonName == cfg.monName then
config = cfg
break
end
end
if config then
-- 创建道具展示
MainTarget.createDropItems(config.monShowItems)
end
end
GUI:setOpacity(MainTarget.UI.ShowBox, 0)
GUI:setVisible(MainTarget.UI.ShowBox, true)
-- 使用淡入动画
local fadeInAction = GUI:ActionFadeTo(0.8, 255)
GUI:runAction(MainTarget.UI.ShowBox, fadeInAction)
end
end
-- 创建道具展示函数
function MainTarget.createDropItems(itemList)
-- 先清空现有道具
MainTarget.clearDropItems()
-- 获取ShowBox容器
local showBox = MainTarget.UI.ShowBox
if GUI:Win_IsNull(showBox) then
return
end
-- 创建三个道具框(根据你的配置表结构)
for i = 1, math.min(3, #itemList) do
local itemID = itemList[i]
if itemID then
-- 创建布局容器
local layoutName = "drop_item_layout_" .. i
local layout = GUI:Layout_Create(showBox, layoutName, 0, 0, 40, 40, false)
-- 设置位置(根据你的UI布局调整)
local posX = (i - 1) * 45 + 20 -- 每个道具间隔5像素
local posY = 20
GUI:setPosition(layout, posX, posY)
-- 创建物品展示框
local itemShow = GUI:ItemShow_Create(layout, "drop_item_" .. i, 20, 20, {
index = itemID,
look = true,
bgVisible = false
})
GUI:setAnchorPoint(itemShow, 0.5, 0.5)
GUI:ItemShow_setIconGrey(itemShow, false) -- 设置图标不灰显
GUI:ItemShow_setItemTouchSwallow(itemShow, true) -- 设置触摸吞噬
-- 存储引用
MainTarget._dropItems = MainTarget._dropItems or {}
MainTarget._dropItems[i] = itemShow
end
end
end
-- 清空道具展示函数
function MainTarget.clearDropItems()
if MainTarget._dropItems then
for i, item in ipairs(MainTarget._dropItems) do
if not GUI:Win_IsNull(item) then
local parent = GUI:getParent(item)
GUI:removeFromParent(item)
if parent and not GUI:Win_IsNull(parent) then
GUI:removeFromParent(parent)
end
end
end
MainTarget._dropItems = {}
end
end
-- 在SelectTarget函数中添加配置检查
function MainTarget.SelectTarget(targetID)
MainTarget._targetID = targetID
local target = SL:GetMetaValue("ACTOR_DATA", MainTarget._targetID)
if not MainTarget._targetID or not target then
GUI:setVisible(MainTarget.UI.Node, false)
return
end
if not MainTarget._isShowTargetPanel then
GUI:setVisible(MainTarget.UI.Node, false)
return
end
GUI:setVisible(MainTarget.UI.Node, true)
-- 检查是否为配置表中的怪物
if SL:GetMetaValue("ACTOR_IS_MONSTER", target) then
local targetMonName = SL:GetMetaValue("ACTOR_NAME", target)
MainTarget._isOnlist = false
for i, config in ipairs(monDropList) do
if targetMonName == config.monName then
MainTarget._isOnlist = true
break
end
end
GUI:setVisible(MainTarget.UI.monDrop, MainTarget._isOnlist)
GUI:setVisible(MainTarget.UI.ShowBox, MainTarget._isShow and MainTarget._isOnlist)
-- 如果当前显示ShowBox且是配置表中的怪物,更新道具展示
if MainTarget._isShow and MainTarget._isOnlist then
local config = nil
for i, cfg in ipairs(monDropList) do
if targetMonName == cfg.monName then
config = cfg
break
end
end
if config then
MainTarget.createDropItems(config.monShowItems)
end
end
end
-- ... 其他原有代码 ...
end
```
**实现说明:**
1. **配置表结构**:配置表`monDropList`需要包含`monName`(怪物名称)和`monShowItems`(道具ID数组)字段
2. **道具展示逻辑**:
- 点击`monDrop`按钮时,检查当前目标是否在配置表中
- 如果在配置表中,根据`monShowItems`数组创建对应的道具展示框
- 每个道具框使用`GUI:ItemShow_Create`创建,设置对应的道具ID
3. **动画效果**:
- 使用`GUI:ActionFadeTo`实现淡入淡出效果
- 淡出时清空道具展示,淡入时重新创建
4. **内存管理**:
- 使用`MainTarget.clearDropItems()`清理旧的道具展示
- 通过`GUI:removeFromParent()`移除UI节点
5. **位置调整**:
- 道具框位置根据索引计算,每个间隔45像素(40宽+5间隔)
- 可根据实际UI布局调整位置参数
**注意事项**:
- 确保配置表路径正确:`game_config/monDropShow`
- 道具ID需要是有效的物品索引
- 如果F9界面已有三个固定位置的道具框,可以直接更新这些框的内容而不是创建新的
- 记得在适当的时候调用清理函数,避免内存泄漏
这样实现后,当玩家选中配置表中的怪物并点击掉落框按钮时,就会根据配置表显示对应的三个道具了。