Cocos2d-x Lua 阅读Csv文件,使用数据更方便
在我的书或出售之前,我的源代码,有Csvshadow文件。
也许这是偏见。我与工作将是最长的轮廓Csv,所以,我会帮助不大喜欢它的游戏。
Csv文件,非常格式easy,也就是说,一个数据线,字段之间用逗号分隔,策划也能够方便地使用Excel进行编辑。
Csv格式的文件。解析起来也非常easy,所以自己动手写写非常快~(小若:我就喜欢拿来主义,你怎么着)
近期在用Lua写游戏,对于技能、怪物等配置,我还是选择用Csv~
不得不说,Lua等脚本语言,在某些方面是C++没法比的,这次我就用Csv来表达这种心情~
笨木头花心贡献,哈?花心?不,是用心~
转载请注明,原文地址:http://www.benmutou.com/archives/1634
文章来源:笨木头与游戏开发
一份Csv配置文件
我们来看看这样一份Csv文件,如图:
ID,Name,Des,Model
ID,名字,描写叙述,图片模型
1,广告,www.benmutou.com,csv.png
2,否认,呵呵。广告什么的,我才不会加,good.png
(小若:这是图吗?是哪里是图啊!
)
当然。这样好像不够清晰,我们来这样看看:
这是非常easy的一个Csv文件:
第一行是英文名字,非常重要,由于在代码里我们要通过这个名字来获取相应的字段内容。
第二行是中文名字,没什么作用,主要是给那些小白看的。比方旁白什么的。(小若:你的比方能不能不要这么有针对性?)
第三和第四行才是真正的内容,通常我都会给第一个字段设定为ID。这样能够依据ID轻松获取到相应行的内容。
Cocos Code IDE
OK,在读取Csv文件之前,略微提一下这个IDE。它是Cocos2d-x官方出的一个IDE。专门针对Cocos2d-x+Lua、Cocos2d-x+JS。但不支持Cocos2d-x+C++。
尽管眼下这个IDE还是RC版本号,我是比較喜欢尝鲜的人。Cocos2d-x3.0版本号我也是从Alpha玩起的~
就那句什么,“有坑才有成长”。我是这么觉得的~
本文也是基于Cocos Code IDE来解说,所以略微提一下,IDE能够到官网下载。随便看看入门指引,几分钟的事情。
然后创建一个项目。
字符串切割
好了,项目创建完之后,默认有个main.lua和GameScene.lua,我们只须要在main.lua里做做測试就能够了
Csv是用逗号切割的,所以,字符串切割功能,不可缺少。Lua似乎没有提供这个功能,幸好,这非常easy。
在mian.lua里main函数前面加入一个函数:
function split(str, reps)
local resultStrsList = {};
string.gsub(str, '[^' .. reps ..']+', function(w) table.insert(resultStrsList, w) end );
return resultStrsList;
end
split有两个參数,str当然就是准备被切割的字符串了,reps又当然是分隔符了~
这里用到了string库的gsub函数。共三个參数:
1. str ,待切割的字符串
2.’[^' .. reps ..']+’,这一看就是那什么,正則表達式。这货我非常少用。所以每次用的时候就翻文档,用完就忘。
这里还比較简单,比方reps是逗号,那么,就变成 ‘[^,]+’ ,这个表达式的意思是:查找非逗号字符。而且多次匹配~
比方“heab,”。前面的heab都不是逗号,全部都匹配了,直到发现了第五个字符。它是逗号,停止匹配。于是终于匹配的字符串是“heab”。
(来自2014.09.17的说明:这里事实上不是正則表達式。而是Lua里的“模式”。跟正則表達式不全然一样,但这里的解释仍然是行得通的,所以不用操心。)
3.每次切割完的字符串都能通过回调函数获取到,w參数就是切割后的一个子字符串,把它保存到一个table
OK,就这么简单,这样就能得到一个table。table里保存了全部被切割的子字符串。
測试一下,把默认的main函数的代码都删了,改成下面这个样子:
local function main()
local t = split("nihfao,hehe,hen", ","); for k, v in pairs(t) do
print(v);
end
end
然后按F11执行,输出下面日志:
[LUA-print] nihfao
[LUA-print] hehe
[LUA-print] hen
成功了~
真正的解析Csv
我们的重点来了,解析Csv文件。
我们不不过要解析。解析完,还要保存起来。方便以后取配置数据~
所以,为了以后更方便地读取数据,我想了一个好办法。
来看看代码,在mian函数的上面再加一个新函数:
function loadCsvFile(filePath)
-- 读取文件
local data = cc.FileUtils:getInstance():getStringFromFile(filePath); -- 按行划分
local lineStr = split(data, '\n\r'); --[[
从第3行開始保存(第一行是标题,第二行是凝视,后面的行才是内容) 用二维数组保存:arr[ID][属性标题字符串]
]]
local titles = split(lineStr[1], ",");
local ID = 1;
local arrs = {};
for i = 3, #lineStr, 1 do
-- 一行中。每一列的内容
local content = split(lineStr[i], ","); -- 以标题作为索引,保存每一列的内容,取值的时候这样取:arrs[1].Title
arrs[ID] = {};
for j = 1, #titles, 1 do
arrs[ID][titles[j]] = content[j];
end ID = ID + 1;
end return arrs;
end
是不是非常easy?(小若:简单个毛线啊。)
这可比在C++里解析要简单多了~
一句句来分析吧:
1.通过FileUtils的getStringFromFile函数读取文件。取得字符串内容
2.local lineStr = split(data, ‘\n\r’); 通过split函数,把文件内容按行切割。得到一个lineStr,它存放了每一行的内容
3.local titles = split(lineStr[1], “,”); 还记得我们的Csv文件吗?第一行内容是英文字母,它们非常重要
这里把文件的第一行内容用逗号切割。得到titles,它存放了第一行的每个字段。
这些字段有什么用呢?以后我们将通过这些字段来获取配置数据。
4.接着,新建一个table变量:local arrs = {}; 它将完整地保存解析后的Csv文件数据。
5.接下来有两个for循环。
先来看第一层循环:
for i = 3, #lineStr, 1 do
— 一行中,每一列的内容
local content = split(lineStr[i], “,”);
end
非常早之前我们说过了。Csv的第一行是英文字段、第二行是中文解释,第三行才開始是真正的内容~所以我们要从第三行開始。
我们知道。Lua的table下标是从1開始的。于是,i的初始值为3
lineStr里存放的是每一行的内容。所以,第一层的for循环是为了取出每一行的内容,然后按逗号切割。保存到content变量里。
接下来,看第二层循环:
– 以标题作为索引,保存每一列的内容,取值的时候这样取:arrs[1].Title
arrs[ID] = {};
for j = 1, #titles, 1 do
arrs[ID][titles[j]] = content[j];
end
arrs[ID] = {}是什么意思呢?这代表是一行的内容,arrs[ID]能够看做是一个数组,它保存了某一行的数据。
那么,arrs[ID]数组的下标自然就是我们的英文字母了(也就是之前一直说的,非常重要的第一行内容)。
逻辑有点乱,我们慢慢理解:
尽管content保存了每一行的内容。可是它不方面获取数据,由于它的下标是数字。
所以,我们要把content的内容一个个拷贝到arrs[ID]里。把数字下标全部换成英文字符串。
第二层for循环就是在做这么一件事情。
測试一下
好了,就这么解释肯定还有点混乱吧,来測试一下就知道我倒底在说什么了。
改动main函数内容为:
local function main()
local csvConfig = loadCsvFile("res/Mutou.Csv"); print(csvConfig[1].Name .. ":" .. csvConfig[1].Des);
print(csvConfig[2].Name .. ":" .. csvConfig[2].Des);
end
按F11执行。将输出下面日志:
[LUA-print] 广告:www.benmutou.com
[LUA-print] 否认:呵呵,广告什么的。我才不会加
首先,loadCsvFile会解析Csv文件,然后返回解析后的内容。
接着,我想获取ID为1的配置数据,比方,要获取它的Name字段属性,就非常easy了:csvConfig[1].Name 就能够了~
假设你对Lua的table比較生疏的话。你可能会无法理解本文的“精髓”(小若:由于根本就没有精髓啊!)
关于Lua的table。大家能够看看我的这篇文章。相信你会对table有一个初步的了解(足以看懂这篇文章)
巧说table的几种构造方式:http://www.benmutou.com/archives/627
后话
我个人是觉得这么做非常方便。我不是说这么解析非常方便,而是。解析之后,要获取字段值的时候,非常方便~
以后要给配置文件新增字段的话,对于解析和使用都全然没有影响,这是最舒服的地方。
当然了,这就要求我们的配置文件的第一行一定不能写错了。否则就不太好玩了。
假设是在C++里,可能就没法达到这么方便的程度了。尽管也能模仿,通过getValue(“key”)这种方式也行~
但无论怎么说,还是不如脚本来得自然~
尽管它方便,但对于全脚本开发手游。还是不太舒服,有些地方,脚本全然比不上C++(不是指执行效率)~
行,这么多~不要拉仇恨~
版权声明:本文博客原创文章。博客,未经同意,不得转载。
Cocos2d-x Lua 阅读Csv文件,使用数据更方便的更多相关文章
- 从Excel、CSV文件获取数据
#region 从Excel获取数据 /// <summary> /// 从Excel获取数据 /// </summary> /// <param name=" ...
- C++ 把数组数据存入 CSV 文件,以及读取 CSV 文件的数据
1. CSV-百度百科 2. 代码 #pragma once //Microsoft Visual Studio 2015 Enterprise #include<iostream> #i ...
- 用CSV文件读写数据的两种方式(转)
导读:有时候我们需要对收集的数据做统计,并在页面提供显示以及下载.除了对传统的excel存取之外,对CSV文件的存取也很重要.本文列出了这两种操作的详细代码. 代码: <?php $file = ...
- Lua读取CSV文件到table中
创建Lua函数载入CSV文件并保存到表中的函数: function GetLines(fileName) indx = 0 myLines ={} for line in io.line(string ...
- mysql 导入 csv文件中数据,只能导入第一行
用workbench导入csv数据,只能导入数据的第一行,也就是标注每一列的列名的那一行.但问题是,每次导入完成时,系统提示已经导入了500条记录(这个文件中的确有500条记录),可是刷新数据库后打开 ...
- java 关于xlsx(xls) 和 csv 文件的数据解析
1.适用于xlsx 和 xls <!--xlsx和xls文件pom依赖--> <dependency> <groupId>org.apache.poi</g ...
- TensorFlow从0到1之TensorFlow csv文件读取数据(14)
大多数人了解 Pandas 及其在处理大数据文件方面的实用性.TensorFlow 提供了读取这种文件的方法. 前面章节中,介绍了如何在 TensorFlow 中读取文件,本节将重点介绍如何从 CSV ...
- PHP读取CSV文件把数据插入到数据库,本地没有问题,阿里云测试服务器不行
原因是 本地windows和服务器linux编码不同,在代码中不要加编码转换的内容,而是把csv文件另存为utf-8文件上传就可以了,windows和Linux都就可以了. html代码: PHP端代 ...
- php阅读csv文件类
php处理csv文件类: http://www.php100.com/cover/php/540.html <?php define("CSV_Start", 0); def ...
随机推荐
- 运行safari提示:无法启动此程序,因为计算机中丢失 QTCF.dll
解决办法: 1.去百度搜索“QTCF.dll”,找到一个靠谱的下载地址获取到该dll文件: 2.将文件放到 安装目录:Safari\Apple Application Support 下边.
- POJ 2112 Optimal Milking (二分 + floyd + 网络流)
POJ 2112 Optimal Milking 链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C ...
- Bean Validation 技术规范特性概述
概述 Bean Validation 规范 Bean 是 Java Bean 的缩写.在 Java 分层架构的实际应用中,从表示层到持久化层.每一层都须要对 Java Bean 进行业务符合性验证,如 ...
- C语言easy忽视的细节(第四部分)
前言:本文的目的是记录C这些语言easy忽视的细节.我会每天花一点时间来阅读整理,坚持下去,今天是第一章.也许今天是下个月的第二,明年,今天是第几?--我坚信,,记性不如烂笔头.第四篇了.fight~ ...
- 移动端 像素渲染流水线与GPU Hack
什么是 像素渲染流水线 web页面你所写的页面代码是如何被转换成屏幕上显示的像素的.这个转换过程可以归纳为这样的一个流水线,包含五个关键步骤: 1.JavaScript:一般来说,我们会使用JavaS ...
- JAVA该队列中的数组,圆阵队列,链队列
/** * 文件名:QueueText.java * 时间:2014年10月22下午9:05:13 * 笔者:维亚康姆维修 */ package chapter3; /** * 类名:ArrayQue ...
- linux的自动化操作相关使用方法汇总(转)
linux系统的web网站在运营状态时,我们常需要对网站进行维护,例如查看资源剩余并做出响应.日志分割.数据整理,在特定状态执行特定任务等等,这些都会需要linux能实现自动执行某些任任务.本篇博文介 ...
- TDD和BDD
开发人员看测试之TDD和BDD 前言: 已经数月没有来园子了,写博客贵在坚持,一旦松懈了,断掉了,就很难再拾起来.但是每每看到自己博客里的博文的浏览量每天都在增加,都在无形当中给了我继续写博客的动 ...
- Android内置下拉刷新组件SwipeRefreshLayout
也许下拉刷新之前,你可能会使用一些第三方的开源库,例如PullToRefresh, ActionBar-PullToRefresh等待,但现在有的正式组成部分---SwipeRefreshLayout ...
- Navicat工具Oracle数据库复制 or 备用、恢复功能(评论都在谈论需要教)
GXPT它是一个分布式系统,该系统包括一个临时许可系统.基本系统.教学评价体系.考试系统,每个系统都有自己的oracle数据库.统,而评教系统的正常须要借助于权限系统和基础系统,详细的业务这里就不多解 ...