窗口管理器(一)

刚踏进游戏行业时,看到大神们写的窗口管理器觉得很是牛逼,后面自己也逐渐的踏上了这条路。到目前为止写了不少窗口管理器了,不同游戏需求也不一样。

简版窗口管理器,适合棋牌类,没有窗口模版和父子窗口(标签)

版本: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


难得清闲,先下班了...

你可能感兴趣的:(窗口管理器(一))