在之前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()操作就可以恢复游戏的数据了。

lua学习:使用Lua处理游戏数据的更多相关文章

  1. Lua学习---编译生成lua和luac

    众所周知,Lua是一种强大的脚本语言,并且这种语言是用C语言实现的.为什么要学习这门语言?因为它可以增强我看C语言代码的功底. 我下的Lua版本是Lua5.3,关于Lua5.3的简介如下: http: ...

  2. Lua学习2 Lua小框架的搭建

    看了上一篇Lua环境搭建具体http://blog.csdn.net/liuwumiyuhuiping/article/details/9196435 为了方便学习. 具体新开始搭建一下学习的小框架. ...

  3. Lua学习三----------Lua数据类型

    © 版权声明:本文为博主原创文章,转载请注明出处 Lua数据类型 - Lua是动态类型语言,不需要为变量定义类型,只需要为变量赋值 - Lua有8中基本数据类型:nil.boolean.number. ...

  4. lua学习:lua中“类”的实现

    在之前的面试遇到考用lua实现类的题目.现在就补补这块知识点. 我们都知道Lua中的table是一个对象.拥有状态,拥有self,拥有独立于创建者和创建地的生命周期. 一个类就是一个创建对象的模具.L ...

  5. Lua学习十一----------Lua迭代器

    © 版权声明:本文为博主原创文章,转载请注明出处 Lua迭代器 - 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址 - Lu ...

  6. Lua学习十----------Lua数组

    © 版权声明:本文为博主原创文章,转载请注明出处 1.LUA数组 - 一维数组 - 多维数组 2.array.lua -- 一维数组 print("一维数组") array1 = ...

  7. Lua学习九----------Lua字符串

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua字符串 - ''单引号间的一串字符 - ""双引号之间的一串字符 - [[]]之间的一串字符 2.Lua转义字符 3.字 ...

  8. Lua学习八----------Lua运算符

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua运算符: - 算术运算符:+(加法).-(减法).*(乘法)./(除法-取整).%(除法-取余).^(乘幂).-(负号) - 关系运算符:= ...

  9. Lua学习七----------Lua函数

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua函数 - 完成指定的任务,这种情况下函数作为调用语句使用 - 计算并返回值,这种情况下函数作为赋值语句的表达式使用 - Lua函数可以返回多 ...

  10. Lua学习六----------Lua流程控制

    © 版权声明:本文为博主原创文章,转载请注明出处 Lua流程控制 - 通过程序设定一个或多个条件语句 - 在条件为true时执行指定程序代码,在条件为false时指定其他指定程序代码 - 控制结构语句 ...

随机推荐

  1. Google市场推广统计

    Google Play作为Android最大的应用市场,也存在这推广等常用的行为,那么如何统计呢,Google Analytics SDK或者其他的SDK都提供了方法,实际上是可以不需要任何sdk,完 ...

  2. Codeforce 424C Magic Formulas 找规律

    题目链接:http://codeforces.com/contest/424/problem/C 题意:求Q值 思路:找规律 显然能够得到一个矩阵 把这个矩阵画出来就能发现一个横向的规律和一个主对角线 ...

  3. 【Oracle】RAC添加新节点

    RAC添加节点: 环境: OS:OEL5.6 RAC:10.2.0.1.0 原有rac1,rac2两个节点.如今要添加rac3节点: 操作过程: 改动三个节点上的/etc/hosts文件 192.16 ...

  4. 设计模式入门之桥接模式Bridge

    Abstraction:抽象部分的父类,定义须要实现的接口.维护对实现部分的引用,从而把实现桥接到Implementor中去 Implementor:实现部分的接口 RefinedAbstractio ...

  5. Google Maps 学习笔记(二)地图天气预报服务 2014.06.04

    地图天气预报服务:一,获取天气预报信息:二,解析天气预报信息:三,在地图上加载天气预报信息: Yahoo!提供的天气预报服务采用流行的RSS输出结果,接口地址如下: http://weather.ya ...

  6. 记WebUtility.HtmlDecode将 转成特殊空格的问题

    在.net中 System.Web.HttpUtility.HtmlDecode(或者WebUtility.HtmlDecode) 方法会将   解码为特殊空格(Ascii值为,对应的值为:\u00A ...

  7. HTML元素的ID和Name属性的区别

    HTML元素的ID和Name属性的区别今天突然兴致来了,想深究下这两属性的具体区别最classical的答案:ID就像是一个人的身份证号码,而Name就像是他的名字,ID显然是唯一的,而Name是可以 ...

  8. 如何分割(split)string字符串

    使用String#split()方法 如下所示: String string = "004-034556"; String[] parts = string.split(" ...

  9. 获取执行计划——EXPLAN PLAN

    一般获取执行计划有四种途径:1.执行explain plan,查询结果输出表.2.查询动态性能视图,它显示缓存在库缓存中的执行计划(有时查不出结果是因为执行计划已经不在库缓存中).3.查询AWR或St ...

  10. python自学笔记(十一)关于函数及书写格式

    1.函数是抽象的第一步       1.1 有关高压锅     1.2 函数是抽象出来的结构,是总结,是方法     1.3 多用函数     2.如何定义函数        2.1 def是关键词, ...