Lua里设计情节链

来源:互联网 发布:购物网站数据库设计 编辑:程序博客网 时间:2024/05/01 07:46
--[[ 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 thenfirst = 1last = 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 listManagerend


 -------------------------------------------------------------------------------------

 

--[[ 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 IDend--添加事件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 thenif nil ~= tVal.trigger thentVal.trigger(events.id_getID(), tVal.tTgrPar)endendend--处理事件function events.onEvent(tEventPar)local tEventPar = tEventPar or {}local tVal = cmdpars.temp_getFront()if nil ~= tVal thencmdpars.popFront()if nil ~= tVal.fun thentVal.fun(events.id_getID(), tVal.tFunPar, tEventPar)endendend--是否还有事件function events.bool_isEmpty()local val = cmdpars.bool_isEmpty()return valendreturn events                   --返回公开数据end--事件流的管理local et = {}local manager = {}function manager.events_newEvents(_ID)local event = events_newEvents(_ID)if nil ~= event thenet[event.id_getID()] = eventendreturn eventendfunction manager.events_getEvents(_ID)return et[_ID]endfunction manager.deleteEvents(_ID)et[_ID] = nilendreturn managerend


-------------------------------------------------------------------------------------

 

--[[ 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 thenet.onEvent()et.setEvent()endend--死亡回调函数function onDieCallBack(_tEventPar)local et = EVENT_MANAGER.events_getEvents(_tEventPar)if nil ~= et thenet.onEvent()et.setEvent()endend

 

 -------------------------------------------------------------------------------------

 

 

--[[ file name :    GameMain.lua author  :      Clark/陈泽丹 created :      8:13:2011 purpose :      客户端程序--]]module("GameMain", package.seeall)pakCallBack = require "GameCallBack"------------------------ 客户端 -----------------------------function map_newMap(_ID)local ID = _IDlocal map = {}--获得角色IDfunction map.id_getID()return IDend--杀狼事件function map.event_KillMonster()local tgr = falselocal et = {}function et.setEvent(eventID, tTgrPar)print("on EVENTS:", eventID, "| Map: ", map.id_getID(), " on ", tTgrPar[1])tgr = truepakCallBack.onDieCallBack(eventID)endfunction et.onEvent(eventID, tFunPar, tEventPar)print("do EVENTS:", eventID, "| Map: ", map.id_getID(), " -> ", tFunPar[1])tgr = falseendreturn etend--退出事件function map.event_Exit()local tgr = falselocal et = {}function et.setEvent(eventID, tTgrPar)print("on EVENTS:", eventID, "| Map: ", map.id_getID(), " on ", tTgrPar[1])tgr = truepakCallBack.onGotoCallBack(eventID)endfunction et.onEvent(eventID, tFunPar, tEventPar)print("do EVENTS:", eventID, "| Map: ", map.id_getID(), " -> ", tFunPar[1])tgr = falsemap.uninitScene()endreturn etendlocal EVENTS_1_ID = os.time() -- os.time()以秒为单位,并发度很高local EVENTS_2_ID = EVENTS_1_ID + 1--初始化function map.initScene()print("---------- initScene ----------")local et = nil--情节线1local ets1 = pakCallBack.EVENT_MANAGER.events_newEvents(EVENTS_1_ID)et = map.event_KillMonster()ets1.push(et.setEvent, {"Wolf die"}, et.onEvent, {"give A"})--情节线2local 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 mapendfunction main()map  = map_newMap(007)map.initScene()endmain()-------------------------------------------------------------


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