您的位置:首页 > 其它

应要求,放出读取XML文件相关的源码

2009-12-20 18:52 155 查看
地形类的源码里面关联了其他类的一些东西,其实就是XML读取的帮助类而已

TLBBFileBuffer这个类就是一个内存缓冲而已,简单说就是一个uchar的数组... 用来把2进制文件一次性读取到内存中而已.

我的代码里面只把XML类型的文件读取到内存里面,其他文件比如heightmap等,并没有用这个类来读取

TLBBFileBuffer这个类没什么东西,原理就是: DataStreamPtr mStreamPtr = ResourceGroupManager::getSingleton().openResource( name.c_str(), TLBB_RESOURCE_GROUP);

size_t mSize = mStreamPtr->size(); uchar* mBuffer = new uchar[mSize]; mStreamPtr->read(mBuffer, mSize);

然后所有二进制文件的数据,都保存在mBuffer里面载入XML文件的时候:

// 载入地形XML文件

TiXmlDocument doc;

TLBBFileBuffer fileBuffer(filename);

doc.Parse((char*)fileBuffer.GetBuffer());

GetBuffer()其实返回的就是上面的mBuffer,一个内存数组而已, doc.Parse这个函数可以直接从内存里面解析XML文件, 而Utils工具类,只是一些帮助函数而已,会XML的,自己都可以写头文件:



/*
**************************************************************************************************************
@fileName Utils.h  
@remarks TinyXML解析的帮助函数
@author LYN 2009.9.26
***************************************************************************************************************
*/

#ifndef _TLBBUTILS_H_
#define _TLBBUTILS_H_

#include "TLBB.h"

/* TLBBUtils类
@remarks 工具类, 把tinyXML元素转换成相应的数据类型
*/
class TLBBUtils
{
public:

	/* 获得字符串*/
	static String GetStringAttribute(TiXmlElement* element, const char* name);

	/* 获得bool值*/
	static bool	GetBoolAttribute(TiXmlElement* element, const char* name);

	/* 获得Vector3*/
	static Vector3 GetVector3Attribute(TiXmlElement* element, const char* name);

	/* 获得Quaternion*/
	static Quaternion GetQuatAttribute(TiXmlElement* element, const char* name);

	/* 获得ColourValue*/
	static ColourValue GetColourValueAttribute(TiXmlElement* element, const char* name);

	/* 获得Real*/
	static Real	GetRealAttribute(TiXmlElement* element, const char* name);

	/* 获得int*/
	static int GetIntAttribute(TiXmlElement* element, const char* name);

	/* 转换描述light类型的字符串到LightTypes枚举*/
	static Light::LightTypes ConvertLightString(const String& lighttype);

	/* 转换描述sky类型的字符串到TLBB_SKY_TYPE枚举*/
	static TLBB_SKY_TYPE ConvertSkyString(const String& skytype);

	/* 获得场景类型*/
	static TLBB_NODE_TYPE GetNodeType(TiXmlElement* element);

	/* 获得地形类型*/
	static TLBB_TERRAIN_TYPE GetTerrainType(TiXmlElement* element);

	/* 获得对象类型*/
	static TLBB_OBJ_TYPE GetObjType(TiXmlElement* element);

	/* UTF8到多字节*/
	static void Utf8ToAscii(char* szUtf8, char* outAscii);
};

#endif


#include "stdafx.h"
#include "Utils.h"

//--------------------------------------------------------------------------------------------------------------
String TLBBUtils::GetStringAttribute(TiXmlElement* element, const char* name)
{
	const char* value = element->Attribute(name);
	if (value != NULL)
	{
		return value;
	}
	else 
	{
		return StringUtil::BLANK;
	}
}

//--------------------------------------------------------------------------------------------------------------
Vector3 TLBBUtils::GetVector3Attribute(TiXmlElement* element, const char* name)
{
	const char* value = element->Attribute(name);
	Vector3 vec;
	if (value != NULL)
	{
		String str = value;
		size_t pos = str.find_first_of(' ', 0);
		size_t pos2 = str.find_first_of(' ', pos+1);
		String x = str.substr(0, pos);
		String y = str.substr(pos+1, pos2);
		String z = str.substr(pos2+1, str.length());
		vec.x = StringConverter::parseReal(x);
		vec.y = StringConverter::parseReal(y);
		vec.z = StringConverter::parseReal(z);
	}
	return vec;
}

//--------------------------------------------------------------------------------------------------------------
Quaternion TLBBUtils::GetQuatAttribute(TiXmlElement* element, const char* name)
{
	const char* value = element->Attribute(name);
	Quaternion quat;
	if (value != NULL)
	{
		String str = value;
		size_t pos = str.find_first_of(' ', 0);
		size_t pos2 = str.find_first_of(' ', pos+1);
		size_t pos3 = str.find_first_of(' ', pos2+1);

		quat.w = StringConverter::parseReal(str.substr(0, pos));
		quat.x = StringConverter::parseReal(str.substr(pos+1, pos2));
		quat.y = StringConverter::parseReal(str.substr(pos+2, pos3));
		quat.z = StringConverter::parseReal(str.substr(pos3+1, str.length()));
	}
	return quat;
}

//--------------------------------------------------------------------------------------------------------------
ColourValue TLBBUtils::GetColourValueAttribute(TiXmlElement* element, const char* name)
{
	const char* value = element->Attribute(name);
	ColourValue color;
	if (value != NULL)
	{
		String str = value;
		size_t pos = str.find_first_of(' ', 0);
		size_t pos2 = str.find_first_of(' ', pos+1);
		String x = str.substr(0, pos);
		String y = str.substr(pos+1, pos2);
		String z = str.substr(pos2+1, str.length());
		color.r = StringConverter::parseReal(x);
		color.g = StringConverter::parseReal(y);
		color.b = StringConverter::parseReal(z);
	}
	return color;
}

//--------------------------------------------------------------------------------------------------------------
Real TLBBUtils::GetRealAttribute(TiXmlElement* element, const char* name)
{
	const char* value = element->Attribute(name);
	Real v = -1;
	if (value != NULL)
	{
		String str = value;
		v = StringConverter::parseReal(str);
	}
	return v;
}

//--------------------------------------------------------------------------------------------------------------
int	TLBBUtils::GetIntAttribute(TiXmlElement* element, const char* name)
{
	const char* value = element->Attribute(name);
	int v = 0;
	if (value != NULL)
	{
		String str = value;
		v = StringConverter::parseInt(str);
	}
	return v;
}

//--------------------------------------------------------------------------------------------------------------
Light::LightTypes TLBBUtils::ConvertLightString(const String& lighttype)
{
	if (lighttype == "directional")
	{
		return Light::LT_DIRECTIONAL;
	}
	else
	{
		return Light::LT_POINT;
	}
}

//--------------------------------------------------------------------------------------------------------------
bool TLBBUtils::GetBoolAttribute(TiXmlElement* element, const char* name)
{	
	const char* value = (char*)element->Attribute(name);
	bool b = false;

	if (value != NULL)
	{
		String str= value;
		b = StringConverter::parseBool(str);
	}
	return b;
}	

//--------------------------------------------------------------------------------------------------------------
TLBB_SKY_TYPE TLBBUtils::ConvertSkyString(const String& skytype)
{
	if (skytype == "SkyDome")
	{
		return TYPE_SKYDOME;
	}
	else if (skytype == "SkyBox")
	{
		return TYPE_SKYBOX;
	}
	else if (skytype == "SkyPlane")
	{
		return TYPE_SKYPLANE;
	}
	else
	{
		return (TLBB_SKY_TYPE)-1;
	}
}

//--------------------------------------------------------------------------------------------------------------
TLBB_NODE_TYPE TLBBUtils::GetNodeType(TiXmlElement* element)
{
	String type = element->Value();
	if (type == "Scene")
	{
		return NODE_SCENE;
	}	
	else if (type == "Terrain")
	{
		return NODE_TERRAIN;
	}
	else if (type == "Object")
	{
		return NODE_OBJECT;
	}	
	else 
	{
		return NODE_UNKNOWN;
	}
}

//--------------------------------------------------------------------------------------------------------------
TLBB_TERRAIN_TYPE TLBBUtils::GetTerrainType(TiXmlElement* element)
{
	String type = element->Value();
	if (type == "scale")
	{
		return TERRAIN_SCALE;
	}	
	else if (type == "centre")
	{
		return TERRAIN_CENTRE;
	}	
	else if (type == "heightmap")
	{
		return TERRAIN_HEIGHTMAP;
	}	
	else if (type == "gridInfo")
	{
		return TERRAIN_GRIDINFO;
	}
	else if (type == "lightmap")
	{
		return TERRAIN_LIGHTMAP;
	}
	else if (type == "textures")
	{
		return TERRAIN_TEXTURES;
	}
	else if (type == "pixmaps")
	{
		return TERRAIN_PIXMAPS;
	}
	else if (type == "materials")
	{
		return TERRAIN_MATERIALS;
	}
	else 
	{
		return TERRAIN_UNKNOWN;
	}
		
}

//--------------------------------------------------------------------------------------------------------------
TLBB_OBJ_TYPE TLBBUtils::GetObjType(TiXmlElement* element)
{
	String type = element->Value();
	if (type != "Object")	
	{
		return OBJ_UNKNOWN;
	}	
	type = TLBBUtils::GetStringAttribute(element, "type");

	if (type == "Enviroment")
	{
		return OBJ_ENVIRONMENT;
	}
	else if (type == "Light")
	{
		return OBJ_LIGHT;
	}
	else if (type == "SkyDome")
	{
		return OBJ_SKYDOME;
	}
	else if (type == "StaticEntity")
	{
		return OBJ_STATICENTITY;
	}
	else if (type == "Model")
	{
		return OBJ_MODEL;
	}
	else if (type == "ParticleSystem")
	{
		return OBJ_PARTICLESYSTEM;
	}
	else if (type == "TerrainLiquid")
	{
		return OBJ_TERRAINLIQUID;
	}
	else 
	{
		return OBJ_UNKNOWN;
	}
		
}

//------------------------------------------------------------------------------------------------------------------
void TLBBUtils::Utf8ToAscii(char* szUtf8, char* outAscii)
{
	// 得到UTF8编码的字符串长度
	int nLen = MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, NULL, NULL);
	LPWSTR lpwsz = new WCHAR[nLen];
	MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, lpwsz, nLen);
	int nLen1 = WideCharToMultiByte(CP_ACP, 0, lpwsz, nLen, NULL, NULL, NULL, NULL);

	LPSTR lpsz  = new CHAR[nLen1];
	WideCharToMultiByte(CP_ACP, 0, lpwsz, nLen, lpsz, nLen1, NULL, NULL);

	strncpy(outAscii, lpsz, nLen1);
	delete lpsz;
	delete lpwsz;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: