刚踏进游戏行业时,看到大神们写的窗口管理器觉得很是牛逼,后面自己也逐渐的踏上了这条路。到目前为止写了不少窗口管理器了,不同游戏需求也不一样。
简版窗口管理器,适合棋牌类,没有窗口模版和父子窗口(标签)
版本:cocos2dx+lua v3.16
配置读取,适合给策划配置。好吧,目前没策划,自己动手,丰衣足食。
WindowData.lua
local WindowData = {
--[[
[winId] = { -- 样例
layerName = 窗口文件路径,
isOpenGestureCloseWindowFunc = 是否开启手势关闭窗口功能,
isCloseWhenClickOutside = 点击窗口外面是否关闭窗口(默认点击窗口外关闭),
openWindowActionType = 打开窗口时的动画类型(查看Const.lua文件中的类型),
closeWindowActionType = 关闭窗口时的动画类型,
isOnlyOneWindow = 窗口是否只能存在一个,
isCacheWindow = 窗口是否缓存,
// 具体需要哪些控制数据自己添加
},
--]]
}
return WindowData
WindowConfig.lua
local WindowData = require("app.data.WindowData")
local WinCfg = {}
-- 窗口的Z轴
WinCfg.Z_ORDER_NORMAL = 1 -- 普通窗口
WinCfg.Z_ORDER_CONFIRM_BOX = 2 -- 确认框
WinCfg.Z_ORDER_ALERT = 7 -- 警告框
WinCfg.Z_ORDER_NET_LOCK = 8 -- 网络锁
WinCfg.Z_ORDER_NET_RECONNECT = 9 -- 网络掉线重连窗口
local Z_ORDERS = nil -- Z轴配置,具体查看WinCfg:getZOrder函数
local CFGS = {}
local count = 0
local function getCount()
count = count + 1
return count
end
--[[
-- 函数说明: 增加一个窗口配置
-- 参数说明: winId: 窗口ID
-- 参数说明: layerName: 窗口文件路径
]]
local function addCfg(winId, layerName)
winId = winId or getCount()
local winCfg = {}
winCfg.winId = winId
winCfg.layerName = layerName
-- 读取配置文件(本来这里是放到窗口模版里面动态读取的,简版嘛,不需要太复杂的功能)
local DATA = WindowData[winId]
if(DATA ~= nil) then
winCfg.isOpenGestureCloseWindowFunc = DATA.isOpenGestureCloseWindowFunc
winCfg.isCloseWhenClickOutside = DATA.isCloseWhenClickOutside
winCfg.openWindowActionType = DATA.openWindowActionType
winCfg.closeWindowActionType = DATA.closeWindowActionType
winCfg.isOnlyOneWindow = DATA.isOnlyOneWindow
winCfg.isCacheWindow = DATA.isCacheWindow
if((layerName == nil) or (layerName == "")) then -- 首选当前文件的配置
winCfg.layerName = DATA.layerName
end
end
CFGS[winId] = winCfg
return winId
end
--[[
-- 函数说明: 获取窗口配置
-- 参数说明: winId: 窗口ID
]]
function WinCfg:getCfg(winId)
return winId and CFGS[winId] or nil
end
--[[
-- 函数说明: 获取窗口的Z轴
]]
function WinCfg:getZOrder(winId)
if(not Z_ORDERS) then
Z_ORDERS = {
[WinCfg.PANEL_CONFIRM_BOX] = WinCfg.Z_ORDER_CONFIRM_BOX, -- 确认框
[WinCfg.PANEL_ALERT] = WinCfg.Z_ORDER_ALERT, -- 警告框
[WinCfg.PANEL_NET_LOCK] = WinCfg.Z_ORDER_NET_LOCK, -- 网络锁
[WinCfg.PANEL_NET_RECONNECT] = WinCfg.Z_ORDER_NET_RECONNECT, -- 网络掉线重连
}
end
return winId and Z_ORDERS[winId] or WinCfg.Z_ORDER_NORMAL
end
-- 命名规则: 一级窗口使用[PANEL_***]的形式,二级窗口使用[LAYER_***]的形式(目前还没有二级窗口的需求,所以都使用PANEL_***)
-- 窗口ID规则: 1(保留字段)*100000 + 场景类型(公用类型=0)*10000 + 本场景下的模块索引*100 + 窗口索引
--=============================================================
--========================= 公用窗口 ===========================
--=============================================================
WinCfg.PANEL_CONFIRM_BOX = addCfg(100001) -- 确认框
WinCfg.PANEL_ALERT = addCfg(100002) -- 警告框
WinCfg.PANEL_NET_LOCK = addCfg(100003) -- 网络锁
WinCfg.PANEL_NET_RECONNECT = addCfg(100004) -- 网络掉线重连
--=============================================================
--========================= 登录窗口 ===========================
--=============================================================
WinCfg.PANEL_STOP_SERVICE_BULLETIN_PANEL = addCfg(200001) -- 停服公告
return WinCfg
难得清闲,先下班了...