zoukankan      html  css  js  c++  java
  • 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>
    View Code

    每个 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;
    }
    

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

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

    作者:H·K
    出处:http://www.cnblogs.com/pythian/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    MySQL简介
    MySQL表及索引相关知识
    关系型和非关系型数据库
    IntelliSense: #error 指令: Please use the /MD switch for _AFXDLL builds————c++编程问题
    msvcrt是做什么的
    COLORREF的结构和用法
    虚函数这么用,只要有一个基类的指针就行了
    映射的磁盘(网络驱动器)无法显示svn图标
    as3 textfield 旋转文字有锯齿的问题
    cocos2dx中CCFileUtils::sharedFileUtils()>getFileData的内存释放问题
  • 原文地址:https://www.cnblogs.com/pythian/p/4625021.html
Copyright © 2011-2022 走看看