------------------------------------------------ GameMap.lua ----------------------------------------------------- --[[ file name : GameMain.lua author : Clark/陈泽丹 created : 8:8:2011 purpose : 实现常量表功能, 类功能, 继承功能, 多态功能 --]] module("GameMap", package.seeall) -- "GameMap"为用户定义的包名,包名需与其所在的文件名同名。 调用本文件里语法: packMap = require"GameMap" function newConst( const_table ) --生成常量表功能 function Const( const_table ) local mt = { __index = function (t,k) return const_table[k] end, __newindex = function (t,k,v) print("*can't update " .. tostring(const_table) .."[" .. tostring(k) .."] = " .. tostring(v)) end } return mt end local t = {} setmetatable(t, Const(const_table)) return t end --[[ 常量表功能的使用举例: function NEW_CONST_DEFINE() --生成自定义常量表 local PAR_TABLE = { MAPNAME = "冰星", MONSTER = newConst({"哥斯拉", 1, 1}), --表项为常量的也需声明为常量表 } local t = newConst(PAR_TABLE) return t end --]] function newBaseMap(mapName, mapID) local objMap = { m_pMap = mapName, --创建地图 m_ID = mapID --记录地图ID } function objMap:deleteMap() --消毁地图 self.m_pMap = nil self.m_ID = nil end function objMap:showMap() if nil ~= self.m_pMap and nil ~= self.m_ID then print(self.m_pMap, self.m_ID) end end return objMap end -- 怪物地图类 function newMonsterMap(mapName, mapID) local objMap = newBaseMap(mapName, mapID) --继承 objMap.m_Monsters = {} function objMap:buildMonster(monsterName, posX, posY) --创建怪物 self.m_Monsters[#self.m_Monsters+1] = { m_Name = monsterName, m_posX = posX, m_posY = posY } end function objMap:deleteMonsterMap() --消毁地图 self:deleteMap() objMap.m_Monsters = nil end local funTemp = objMap.showMap --多态函数 function objMap:showMap() funTemp(self) if nil ~= self.m_Monsters then for i=1, #self.m_Monsters do print(self.m_Monsters[i].m_Name, self.m_Monsters[i].m_posX, self.m_Monsters[i].m_posY) end end end return objMap end
------------------------------------------------ GameMain.lua ----------------------------------------------------- packMap = require"GameMap" print("----------------------------------Game Main-----------------------------------") function NEW_CONST_DEFINE() --生成自定义常量表 local PAR_TABLE = { MAPNAME = "冰星", MAPID = 999, MONSTER1 = packMap.newConst({"哥斯拉", 1, 1}), --表项为常量的也需声明为常量表 MONSTER2 = packMap.newConst({"小强",2,2}), MONSTER3 = packMap.newConst({"史锐克",3,3}) } local t = packMap.newConst(PAR_TABLE) return t end --获得自定义常量表 CONST_MAP = NEW_CONST_DEFINE() --尝试更改表中变量 CONST_MAP.MAPNAME = "jjjj" CONST_MAP.MAPID = 777 CONST_MAP.MONSTER1[1] = "ccc" CONST_MAP.MONSTER2 = {"小强fff",33,44} map = packMap.newMonsterMap(CONST_MAP.MAPNAME, CONST_MAP.MAPID) map:buildMonster(CONST_MAP.MONSTER1[1], CONST_MAP.MONSTER1[2], CONST_MAP.MONSTER1[3]) map:buildMonster(CONST_MAP.MONSTER2[1], CONST_MAP.MONSTER2[2], CONST_MAP.MONSTER2[3]) map:buildMonster(CONST_MAP.MONSTER3[1], CONST_MAP.MONSTER3[2], CONST_MAP.MONSTER3[3]) map:showMap() map:deleteMonsterMap() map:showMap()
运行结果:
>lua -e "io.stdout:setvbuf 'no'" "GameMain.lua"
----------------------------------Game Main-----------------------------------
*can't update table: 003B9A40[MAPNAME] = jjjj
*can't update table: 003B9A40[MAPID] = 777
*can't update table: 003BAC98[1] = ccc
*can't update table: 003B9A40[MONSTER2] = table: 003B7E48
冰星 999
哥斯拉 1 1
小强 2 2
史锐克 3 3
>Exit code: 0