在之前lua學習:lua作配置文件里,我們學會了用lua作配置文件。
其實lua在游戲開發中可以作為一個強大的保存、載入游戲數據的工具。
1.載入游戲數據
比如說,現在我有一份表單:
data.xls

用什么工具解析這個Excel文件並將數據載入游戲?
我們可以使用Lua來完成這個工作。不過要先將表單保存為csv文件(數值用逗號隔開的文件)。
從表單中,我們可以得知第一行是鍵名,剩下的行是數值。我們可以用下面的lua函數載入該csv文件並保存到表中。
function GetLines(fileName) index = 0 myLines = {} for line in io.lines(string.format("%s%s", "./", fileName)) do index = index + 1 myLines[index] = line end return index, myLines --返回文件的行數和一個包括所有行的表 end
io.lines ([filename]):打開指定的文件filename為讀模式並返回一個迭代函數,每次調用將獲得文件中的一行內容,當到文件尾時,將返回nil,並自動關閉文件。
然后,可以再創建一個函數解析每行的字符,並創建表格保存該行的所有數據。
function GetValues(myString) num = 0 values = {} if myString ~= nil then while string.find(myString,",") ~= nil do i,j = string.find(myString,",") num = num + 1 values[num] = string.sub(myString,1, j-1) myString = string.sub(myString, j+1, string.len(myString)) end num = num + 1 --接着對第二行數據 values[num] = myString end return num, values end
string.find(s, pattern, pos):從源字符串s找到匹配pattern返回,pos參數可選, 表示起始位置,如果匹配不成功,返回nil。
string.sub():函數截取字符串s的從第i個字符到第j個字符之間的串。
在這個函數中,我們傳入字符。通過調用string.find()和string.sub,返回數值的個數和包含了所有數值的表。通過這兩個簡單的處理步驟可以讓用戶解析幾乎所有的csv文件,不論簡單還是復雜的文件。
我們可以寫個函數測試一下:
function LoadDatas() myCharacters = {} numLines, allLines = GetLines("data.csv") --讀第一行的鍵值 count, myLabels = GetValues(allLines[1]) --忽略第一行 for index = 2, numLines do count, charHold = GetValues(allLines[index]) myCharacters[index-1] = {} for index2 = 1, count do myCharacters[index-1][index2] = charHold[index2] end end --now print them for index = 1, 3 do for index2 = 1, table.getn(myLabels) do print(myLabels[index2], myCharacters[index][index2]) end end end
得到一個二維表:

2.保存游戲數據
我們可以利用lua內建的I/O功能來處理數據輸出。只要確保輸出的數據是采用合適的語法,就可以使用dofile()載入數據了。
function save() myFile = io.open("save_data.lua", "w") if myFile ~= nil then myFile:write("-- 游戲數據保存文件") myFile:write(string.char (10)) myFile:write(string.char (10)) myFile:write(string.format("%s%s", "-- 文件創建於: ", os.date())) myFile:write(string.char (10)) myFile:write(string.char (10)) myFile:write("myValue = 5") io.close(myFile) end end
3.載入保存的數據
利用dofile()操作就可以恢復游戲的數據了。
4.用lua處理log,篩取信息
其實也就是一些io,string操作,沒什么新的東西
把舊的log中想的篩取信息,寫到新的文件中,具體可以參加以下代碼:
function find_player() local logfile = assert(io.open("房間201.log","r")) --打開舊文件 local findfile = io.open("find_player.txt","w") --打開新文件 local text = logfile:read("*all") --讀入所有內容 for w in string.gmatch(text,".-,") do if string.find(w,"player userid = (%d+) level=(%d+) enter") ~= nil then --查找寫入相關內容到新文件 findfile:write(w) end if string.find(w,"player userid = (%d+) leave") ~= nil then findfile:write(w) end end logfile:close() --關閉文件 findfile:close() end find_player()
