--[[ file name . GameList.lua author . Clark/陈泽丹 created . 8.13.2011 purpose . 双向队列 --]] module("GameList", package.seeall) --双向队列 function list_newList() local first = 1 local last = 0 local list = {} local listManager = {} function listManager.pushFront(_tempObj) first = first - 1 list[first] = _tempObj end function listManager.pushBack(_tempObj) last = last + 1 list[last] = _tempObj end function listManager.temp_getFront() if listManager.bool_isEmpty() then return nil else local val = list[first] return val end end function listManager.temp_getBack() if listManager.bool_isEmpty() then return nil else local val = list[last] return val end end function listManager.popFront() list[first] = nil first = first + 1 end function listManager.popBack() list[last] = nil last = last - 1 end function listManager.clear() while false == listManager.bool_isEmpty() do listManager.popFront() end end function listManager.bool_isEmpty() if first > last then first = 1 last = 0 return true else return false end end function listManager.d_getSize() if listManager.bool_isEmpty() then return 0 else return last - first + 1 end end return listManager end
-------------------------------------------------------------------------------------
--[[ file name : GameEvents.lua author : Clark/陈泽丹 created : 8:13:2011 purpose : 故事情节线 --]] module("GameEvents", package.seeall) pakList = require "GameList" function manager_newEventManager() --事件流 function events_newEvents(_ID) local ID = _ID or os.time() local cmdpars = pakList.list_newList() --隐藏数据 local events = {} --公开数据 function events.id_getID() return ID end --添加事件 function events.push(_trigger, _tTgrPar, _fun, _tFunPar) local t = { trigger = _trigger, tTgrPar = _tTgrPar or {}, fun = _fun, tFunPar = _tFunPar or {}} cmdpars.pushBack(t) end --清空事件 function events.clear() cmdpars.clear() end --创建事件 function events.setEvent() local tVal = cmdpars.temp_getFront() if nil ~= tVal then if nil ~= tVal.trigger then tVal.trigger(events.id_getID(), tVal.tTgrPar) end end end --处理事件 function events.onEvent(tEventPar) local tEventPar = tEventPar or {} local tVal = cmdpars.temp_getFront() if nil ~= tVal then cmdpars.popFront() if nil ~= tVal.fun then tVal.fun(events.id_getID(), tVal.tFunPar, tEventPar) end end end --是否还有事件 function events.bool_isEmpty() local val = cmdpars.bool_isEmpty() return val end return events --返回公开数据 end --事件流的管理 local et = {} local manager = {} function manager.events_newEvents(_ID) local event = events_newEvents(_ID) if nil ~= event then et[event.id_getID()] = event end return event end function manager.events_getEvents(_ID) return et[_ID] end function manager.deleteEvents(_ID) et[_ID] = nil end return manager end
-------------------------------------------------------------------------------------
--[[ file name : GameCallBack.lua author : Clark/陈泽丹 created : 8:13:2011 purpose : 系统回调函数 --]] module("GameCallBack", package.seeall) pakEvents = require "GameEvents" EVENT_MANAGER = pakEvents.manager_newEventManager() --直接跳转函数 function onGotoCallBack(_tEventPar) local et = EVENT_MANAGER.events_getEvents(_tEventPar) if nil ~= et then et.onEvent() et.setEvent() end end --死亡回调函数 function onDieCallBack(_tEventPar) local et = EVENT_MANAGER.events_getEvents(_tEventPar) if nil ~= et then et.onEvent() et.setEvent() end end
-------------------------------------------------------------------------------------
--[[ file name : GameMain.lua author : Clark/陈泽丹 created : 8:13:2011 purpose : 客户端程序 --]] module("GameMain", package.seeall) pakCallBack = require "GameCallBack" ------------------------ 客户端 ----------------------------- function map_newMap(_ID) local ID = _ID local map = {} --获得角色ID function map.id_getID() return ID end --杀狼事件 function map.event_KillMonster() local tgr = false local et = {} function et.setEvent(eventID, tTgrPar) print("on EVENTS:", eventID, "| Map: ", map.id_getID(), " on ", tTgrPar[1]) tgr = true pakCallBack.onDieCallBack(eventID) end function et.onEvent(eventID, tFunPar, tEventPar) print("do EVENTS:", eventID, "| Map: ", map.id_getID(), " -> ", tFunPar[1]) tgr = false end return et end --退出事件 function map.event_Exit() local tgr = false local et = {} function et.setEvent(eventID, tTgrPar) print("on EVENTS:", eventID, "| Map: ", map.id_getID(), " on ", tTgrPar[1]) tgr = true pakCallBack.onGotoCallBack(eventID) end function et.onEvent(eventID, tFunPar, tEventPar) print("do EVENTS:", eventID, "| Map: ", map.id_getID(), " -> ", tFunPar[1]) tgr = false map.uninitScene() end return et end local EVENTS_1_ID = os.time() -- os.time()以秒为单位,并发度很高 local EVENTS_2_ID = EVENTS_1_ID + 1 --初始化 function map.initScene() print("---------- initScene ----------") local et = nil --情节线1 local ets1 = pakCallBack.EVENT_MANAGER.events_newEvents(EVENTS_1_ID) et = map.event_KillMonster() ets1.push(et.setEvent, {"Wolf die"}, et.onEvent, {"give A"}) --情节线2 local ets2 = pakCallBack.EVENT_MANAGER.events_newEvents(EVENTS_2_ID) ets2.push(et.setEvent, {"tiger die"}, et.onEvent, {"give B"}) et = map.event_Exit() ets2.push(et.setEvent, {"exiting"}, et.onEvent, {"exited"}) --启动情节线 ets1.setEvent() ets2.setEvent() end --结束 function map.uninitScene() print("---------- uninitScene ----------") pakCallBack.EVENT_MANAGER.deleteEvents(EVENTS_1_ID) end return map end function main() map = map_newMap(007) map.initScene() end main() -------------------------------------------------------------
result:
>lua -e "io.stdout:setvbuf 'no'" "Main.lua"
---------- initScene ----------
on EVENTS: 1313262659 | Map: 7 on Wolf die
do EVENTS: 1313262659 | Map: 7 -> give A
on EVENTS: 1313262660 | Map: 7 on tiger die
do EVENTS: 1313262660 | Map: 7 -> give B
on EVENTS: 1313262660 | Map: 7 on exiting
do EVENTS: 1313262660 | Map: 7 -> exited
---------- uninitScene ----------
>Exit code: 0