Lua里设计情节链

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发Lua语言的PDF是一个可行的任务。首先,Lua是一种轻量级、高效的脚本语言,其设计的初衷是作为嵌入式脚本语言使用。虽然它的主要应用领域是游戏开发和嵌入式系统,但它也广泛用于其他领域,如Web应用、科学计算等。因此,开发Lua语言的PDF可以为Lua用户提供便捷的文档和参考资料。 要开发Lua语言的PDF,首先需要一个合适的PDF生成库。Lua提供了许多库和工具,可以用于PDF生成。例如,使用类似LuaTeX这样的工具,可以将Lua代码嵌入到TeX文档中,并通过指令生成PDF文件。此外,还有其他基于Lua的库,如luapdf、Lua-gnome等,也可用于开发Lua语言的PDF。 在开发Lua语言的PDF时,应考虑以下几个方面。首先,提供Lua语言的基础知识和语法介绍,以帮助初学者了解Lua的基本概念和用法。其次,应提供示例代码和实践案例,以帮助用户更好地理解Lua语言的应用。还可以提供一些高级特性和技巧,以帮助开发者提升Lua编程技能。 开发Lua语言的PDF还应考虑不同版本和扩展的兼容性。Lua语言在不同版本和扩展中可能存在一些差异,需要在文档中明确说明。同时,应提供相关的参考文献和接,以便用户深入了解Lua语言的更多细节。 总而言之,开发Lua语言的PDF可以为Lua开发者提供一个全面而方便的学习和参考资源。通过提供基础知识、示例代码和高级技巧,开发者可以更好地掌握Lua语言的应用。此外,考虑到不同版本和扩展之间的兼容性,也要提供相关的参考文献和接,以便用户进一步深入学习Lua语言的各个方面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值