--[[
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