重新封装 模块名字是menu 变量名字不要那么长 并且我传入一级菜单 二级菜单的tabl 你来创建就可以 大小就默认 他们的x , y 都在一列
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-02-27 01:34:44 |
👁️ 阅读: 15
我来帮你封装一个简洁的菜单模块。根据浮生梦老师前端课程内容,我会创建一个模块化的菜单系统:
```lua
-- menu.lua 菜单模块
local menu = {}
-- 创建菜单
-- @param parent: 父节点
-- @param menuName: 菜单名称
-- @param data: 菜单数据 {一级菜单 = {二级菜单1, 二级菜单2, ...}}
-- @param x: 起始x坐标
-- @param y: 起始y坐标
function menu:create(parent, menuName, data, x, y)
if not parent or not data then return nil end
-- 创建主容器
local main = GUI:Widget_Create(parent, menuName .. "_main", x, y, 200, 400)
-- 创建一级菜单列表
local list1 = GUI:ListView_Create(main, "list1", 0, 0, 100, 400, 1)
GUI:ListView_setItemsMargin(list1, 5)
-- 创建二级菜单列表
local list2 = GUI:ListView_Create(main, "list2", 105, 0, 95, 400, 1)
GUI:ListView_setItemsMargin(list2, 5)
-- 存储数据
main._data = data
main._list1 = list1
main._list2 = list2
main._currentIndex = nil
-- 创建一级菜单项
local index = 1
for key, subItems in pairs(data) do
local item = GUI:Button_Create(nil, "btn_" .. key, 0, 0, "res/public/1900000612.png")
GUI:Button_setTitleText(item, key)
GUI:setContentSize(item, 90, 30)
-- 点击事件
GUI:addOnClickEvent(item, function()
menu:onFirstMenuClick(main, index, key, subItems)
end)
GUI:ListView_pushBackCustomItem(list1, item)
index = index + 1
end
return main
end
-- 一级菜单点击事件
function menu:onFirstMenuClick(main, index, key, subItems)
if main._currentIndex == index then return end
main._currentIndex = index
-- 清空二级菜单
GUI:ListView_removeAllItems(main._list2)
-- 创建二级菜单项
for i, subKey in ipairs(subItems) do
local item = GUI:Button_Create(nil, "btn_sub_" .. subKey, 0, 0, "res/public/1900000612.png")
GUI:Button_setTitleText(item, subKey)
GUI:setContentSize(item, 85, 25)
-- 二级菜单点击事件
GUI:addOnClickEvent(item, function()
SL:print("选择了: " .. key .. " -> " .. subKey)
end)
GUI:ListView_pushBackCustomItem(main._list2, item)
end
end
-- 获取一级菜单列表
function menu:getFirstList(widget)
return widget and widget._list1
end
-- 获取二级菜单列表
function menu:getSecondList(widget)
return widget and widget._list2
end
-- 设置菜单位置
function menu:setPosition(widget, x, y)
if widget then
GUI:setPosition(widget, x, y)
end
end
-- 设置菜单大小
function menu:setSize(widget, width, height)
if widget then
GUI:setContentSize(widget, width, height)
if widget._list1 then
GUI:setContentSize(widget._list1, 100, height)
end
if widget._list2 then
GUI:setContentSize(widget._list2, width - 105, height)
GUI:setPosition(widget._list2, 105, 0)
end
end
end
-- 设置背景
function menu:setBackground(widget, imagePath)
if widget then
GUI:ScrollView_setBackGroundImage(widget, imagePath)
end
end
return menu
```
**使用示例:**
```lua
-- 1. 引入模块
local menu = require("menu")
-- 2. 创建父节点
local parent = GUI:Win_Create("GMMain", 0, 0, 0, 0, false, false, true, false, false, false, 1)
-- 3. 定义菜单数据
local data = {
["系统设置"] = {"声音", "画面", "控制"},
["角色管理"] = {"创建", "删除", "改名"},
["物品操作"] = {"添加", "删除", "修改"},
["GM命令"] = {"等级", "金币", "经验"}
}
-- 4. 创建菜单
local myMenu = menu:create(parent, "myMenu", data, 100, 100)
-- 5. 设置大小(可选)
menu:setSize(myMenu, 250, 300)
-- 6. 设置背景(可选)
menu:setBackground(myMenu, "res/public/1900000610.png")
```
**特点:**
1. 模块化设计,代码简洁
2. 变量名简短易懂
3. 一级菜单和二级菜单垂直排列
4. 默认大小,可自定义
5. 支持点击事件
6. 提供常用操作方法
这样封装后,你只需要传入数据表就能创建完整的菜单系统,使用起来非常方便!
← 返回问答库