在之前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. android项目 之 记事本(12) ----- 图片的等比例缩放及给图片加入边框

    本文是自己学习所做笔记.欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 在Android的UI开发中常常会遇到图片的缩放,就比方记事本,如今的图片都比較 ...

  2. STL中主要的算法(一)

    一.replace() 替换算法将指定元素值替换为新值,使用原型例如以下,将迭代器[first,last)中值为old_value的元素所有替换为new_value值. 函数原型: template  ...

  3. Head First SQL笔记

    看的时候总结了一下,如下: Chapter 1: 创建数据库 CREATE DATABASE database_name; 使用数据库 USE database_name; 创建表 CRATE TAB ...

  4. hdu acm 2154(多解取一解)

    //题目中结果有一条限制就是最后必须跳回A,如果我们的思想框在这个条件上就很容易卡住,因为这样的条件下的路径很难有规律的罗列,然而我们说这个图形中有三个区域,我们算出每个区域的第n-1次的种类数,然后 ...

  5. Unity 通过NGUI 完成单摄像机 制作地图

    本次思想主要是通过 Ngui的Scroll View 主要是UIPanel的Clipping属性的Alipha Clip 调节窗口大小,遮蔽地图试地图实现在屏幕的部分显示.此方法的好处是不用担心sha ...

  6. If the server requires more time, try increasing the timeout in the server editor

    双击服务器,在overview下的Timeouts中的Start选项,改成10000或者较大就可以了.防止服务器自启动频繁.

  7. Windows 配置JAVA的环境变量

    Java是由Sun公司开发的一种应用于分布式网络环境的程序设计语言,Java语言拥有跨平台的特性,它编译的程序能够运行在多种操作系统平台上,可以实现“一次编写,到处运行”的强大功能. 工具/原料 JD ...

  8. CSS 文章段落样式

    #adiv p { text-align: left; text-indent: 2em; line-height:25px; font-family:微软雅黑; font-size:medium; ...

  9. iter, yield与enumerate的实现

    模拟实现一个enumerate函数 def myEnumerate(seq, start=0): results = [] n = start for i in seq: results.append ...

  10. python 10 min系列三之小爬虫(一)

    python10min系列之小爬虫 前一篇可视化大家表示有点难,写点简单的把,比如命令行里看论坛的十大,大家也可以扩展为抓博客园的首页文章 本文原创,同步发布在我的github上 据说去github右 ...