My Game --文件读取数据

My Game --线段数据 中说到背景的绘制由贝赛尔曲线生成线段,用 DrawNode 画多边形,同时一张背景有两座山,一座山有两条以上贝赛尔曲线保存,用了嵌套的数据类:Bezier,LineLayer,BgLayerData 这个做也是为了方便从文件读取数据

把背景的数据放在文件里方便修改,也可以做个工具快速绘制背景,下面是这个背景的数据保存的XML文件:

 1 <RootLayer>
 2     <Layers>
 3         <layer>
 4             <Beziers>
 5                 <Bezier bx="0.375" by="0.000" ex="1.000" ey="0.500" c1x="0.750" c1y="1.000" c2x="0.850" c2y="0.875"/>
 6                 <Bezier bx="0.375" by="0.500" ex="1.000" ey="0.650" c1x="1.000" c1y="0.400" c2x="0.750" c2y="0.750"/>
 7                 <Bezier bx="0.375" by="0.125" ex="1.000" ey="0.375" c1x="0.800" c1y="0.130" c2x="0.700" c2y="0.375"/>
 8             </Beziers>
 9             <Colors>
10                 <color r="0.200" g="0.439" b="0.200" a="1"/>
11                 <color r="0.196" g="0.529" b="0.251" a="1"/>
12                 <color r="0.133" g="0.675" b="0.220" a="1"/>
13             </Colors>
14         </layer>
15         <layer>
16             <Beziers>
17                 <Bezier bx="0.000" by="0.125" ex="0.750" ey="0.000" c1x="0.250" c1y="0.750" c2x="0.375" c2y="0.750"/>
18                 <Bezier bx="0.000" by="0.250" ex="0.750" ey="0.500" c1x="0.375" c1y="0.250" c2x="0.375" c2y="0.500"/>
19             </Beziers>
20             <Colors>
21                 <color r="0.255" g="0.647" b="0.310" a="1"/>
22                 <color r="0.000" g="0.600" b="0.267" a="1"/>
23             </Colors>
24         </layer>
25     </Layers>
26 </RootLayer>

每个 Layer 下两组元素:贝赛尔曲线和对应的对应的颜色

Resources 下的 ResourcesManage 类读取文件内容,并生存相应的数据结构存储起来,方便使用

读取数据的代码:

BgLayerData * ResourcesManage::getBgLayerDataFromFile( std::string && fileName )
{
	tinyxml2::XMLDocument doc;
	doc.LoadFile( fileName.c_str( ) );
	auto elemRoot = doc.RootElement( );
	auto layers = elemRoot->FirstChildElement( "Layers" );
	auto elemLayer = layers->FirstChildElement( );
	while( elemLayer != 0 )
	{
		//auto elem = elemLayer->FirstChildElement( );
		auto bezier = elemLayer->FirstChildElement( "Beziers" );
		auto bz = bezier->FirstChildElement( );
		auto color = elemLayer->FirstChildElement( "Colors" );
		auto co = color->FirstChildElement( );
		auto layer = new LineLayer( );
		while( bz != 0 && co != 0 )
		{
			float bx = atof( bz->Attribute( "bx" ) );
			float by = atof( bz->Attribute( "by" ) );
			float ex = atof( bz->Attribute( "ex" ) );
			float ey = atof( bz->Attribute( "ey" ) );
			float c1x = atof( bz->Attribute( "c1x" ) );
			float c1y = atof( bz->Attribute( "c1y" ) );
			float c2x = atof( bz->Attribute( "c2x" ) );
			float c2y = atof( bz->Attribute( "c2y" ) );
			float r = atof( co->Attribute( "r" ) );
			float g = atof( co->Attribute( "g" ) );
			float b = atof( co->Attribute( "b" ) );
			float a = atof( co->Attribute( "a" ) );

			layer->AddBezier( bx, by, ex, ey, c1x, c1y, c2x, c2y, r, g, b, a );
			bz = bz->NextSiblingElement( );
			co = co->NextSiblingElement( );
		}
		if( !layer->isEmpty( ) )
		{
			_bgLayerData->AddLineLayer( layer );
		}
		elemLayer = elemLayer->NextSiblingElement( );
	}
	return _bgLayerData;
}

使用 tinyxml2 的 XMLDocument 读取文件,然后从读取的内容当中提取数据。首先找到根节点,再找到第一个“Layers”节点(也就这么一个,因为只有一个背景),“Layers”节点对应 BgLayerData 类;接下来找到第一个子节点“Layer”,“Layer”对应 LineLayer类,开始循环,从“Layer”中循环获取“Bezier”和“color”创建并添加到 LineLayer 中;循环递增条件是当前节点赋值为下一个节点,当节点为0时循环结束。通过两重循环把数据提取出来,下一步就可以使用了。

ResourcesManage 类原本设想会有许多任务,但目前只用到上面这个函数,其他的就先放那里,给将来做个参考。

时间: 2024-10-08 22:45:18

My Game --文件读取数据的相关文章

由已打开的文件读取数据---read

头文件:#include<unistd.h> 函数原型:ssize_t read(int fd,void *buf,size_t count); 参数说明:fd:文件描述符 buf:存放读取数据的缓冲区. count:读取的最大长度 返回值:成功则返回读取的字节数,失败则返回-1.

C#实现从EXCEL文件读取数据到SqlServer数据库

用第三方组件:NPOI组件实现 先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中添加引用.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写. 先创建一个实体类: [Table("Customer") ] public class Customer { [Key] public int Id { get; set; } public

springboot~openfeign从JSON文件读取数据

对openfeign不清楚的同学可以先看我这篇文章:springboot~openfeign从此和httpClient说再见 对于openfeign来说,帮助我们解决了服务端调用服务端的问题,你不需要关心服务端的URI,只需要知道它在eureka里的服务名称即可,同时你与服务端确定了服务方法的参数和返回值之后,我们可以在单元测试时mock这些服务端方法即可,真正做到了单元测试,而不需要与外界资源进行交互. 今天主要说一下在openfeign里读取JSON文件的问题,我们将测试所需要的数据存储到文

IOS学习笔记之获取Plist文件读取数据

@property(nonatomic,strong) NSArray *pic; //创建数组属性 @property(nonatomic,assign) int index; //创建索引属性 @property (strong, nonatomic) IBOutlet UIImageView *imageIcon; //列表上的UIImageView - (void)viewDidLoad {    [super viewDidLoad];    //首次加载时调用数据方法,让index显

[Python爬虫] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下笔记.方便以后查阅和大家学习. 中文编码问题的处理核心都是--保证所有的编码方式一致即可,包括编译器.数据库.浏览器编码方式等,而Python通常的处理流程是将unicode作为中间转换码进行过渡.先将待处理字符串用unicode函数以正确的编码转换为Unicode码,在程序中统一用Unicode字

[Python] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下笔记.方便以后查阅和大家学习.        中文编码问题的处理核心都是——保证所有的编码方式一致即可,包括编译器.数据库.浏览器编码方式等,而Python通常的处理流程是将unicode作为中间转换码进行过渡.先将待处理字符串用unicode函数以正确的编码转换为Unicode码,在程序中统一用U

【转载】java InputStream读取数据问题

原文链接:http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html 1. 关于InputStream.read()     在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读取读取一个字节,效率会非常低.     更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方

java InputStream读取数据问题

原文 1. 关于InputStream.read()     在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读取读取一个字节,效率会非常低.     更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节. 2. 关于InputStream类的available()方法    要一次读取多个字节时,经常用到InputS

java InputStream读取数据问题(转)

java InputStream读取数据问题 1. 关于InputStream.read()     在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读取读取一个字节,效率会非常低.     更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节. 2. 关于InputStream类的available()方法    要