在之前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. Ajax在html页面获取后台XML文件资源

    一.准备工具 站长吧ASP调试工具.exe,这个工具是为了快速建立asp环境,方便调试. 二.建立文件夹 1.建立网站根文件夹,名字随意,将站长吧ASP调试工具.exe复制到根文件夹: 2.建立xml ...

  2. EF查询视图只得到一条记录

    1.出错结果:数据库表视图有多条数据,在使用EF框架进行查询时却只得到一条数据(注:拦截EF得到的sql语句在数据库进行查询并没有任务问题). 2.出错原因:该视图中没有ID或者主键,EF查询时进行反 ...

  3. Flink - state管理

    在Flink – Checkpoint 没有描述了整个checkpoint的流程,但是对于如何生成snapshot和恢复snapshot的过程,并没有详细描述,这里补充   StreamOperato ...

  4. WebRTC is for Losers:WebRTC是输家

    该文章是引述,仅代表作者Dave Michels观点 WebRTC is for Losers WebRTC technology has fallen short on many of its pr ...

  5. CSS 包含选择器(九)

    一.包含选择器 包含选择器中前后两部分之间以空格隔开,根据左侧选择符指定的祖先元素,然后在该元素下寻找匹配右侧的选择侧符的下级元素 定义包含选择器时,必须保证在HTML结构中第一个对象能够包含第二个对 ...

  6. iOS - Xib

    前言 xib 文件可以被 Xcode 编译成 nib 文件,xib 文件本质上是一个 xml 文件,而 nib 文件就是编译后的二进制文件,该文件将视图等控件对象封装了起来,而在程序运行起来后,这些对 ...

  7. [React] Styling React Components With Aphrodite

    Aphrodite is a library styling React components. You get all the benefits of inline styles (encapsul ...

  8. 【HDOJ】4393 Throw nails

    水题,优先级队列. /* 4393 */ #include <iostream> #include <sstream> #include <string> #inc ...

  9. 虚拟机内存复用技术的比较(XEN系统)

    技术途径 业界就该问题定义为虚拟机内存复用(复用干嘛? 当然是为了跑更多的虚拟机呀!) :memory overcommit.围绕次问题主要有4种技术手段,下面简要介绍和分析: 1 气泡驱动(ball ...

  10. 任务四十:UI组件之日历组件(一)

    任务四十:UI组件之日历组件(一) 面向人群: 有一定基础的同学 难度: 中 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质量以及学习 ...