應要求,放出讀取XML檔案相關的源碼

來源:互聯網
上載者:User

地形類的源碼裡面關聯了其他類的一些東西,其實就是XML讀取的協助類而已

TLBBFileBuffer這個類就是一個記憶體緩衝而已,簡單說就是一個uchar的數組... 用來把2進位檔案一次性讀取到記憶體中而已.

My Code裡面只把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的,自己都可以寫標頭檔:

 

/*<br />**************************************************************************************************************<br />@fileName Utils.h<br />@remarks TinyXML解析的協助函數<br />@author LYN 2009.9.26<br />***************************************************************************************************************<br />*/</p><p>#ifndef _TLBBUTILS_H_<br />#define _TLBBUTILS_H_</p><p>#include "TLBB.h"</p><p>/* TLBBUtils類<br />@remarks 工具類, 把tinyXML元素轉換成相應的資料類型<br />*/<br />class TLBBUtils<br />{<br />public:</p><p>/* 獲得字串*/<br />static String GetStringAttribute(TiXmlElement* element, const char* name);</p><p>/* 獲得bool值*/<br />static boolGetBoolAttribute(TiXmlElement* element, const char* name);</p><p>/* 獲得Vector3*/<br />static Vector3 GetVector3Attribute(TiXmlElement* element, const char* name);</p><p>/* 獲得Quaternion*/<br />static Quaternion GetQuatAttribute(TiXmlElement* element, const char* name);</p><p>/* 獲得ColourValue*/<br />static ColourValue GetColourValueAttribute(TiXmlElement* element, const char* name);</p><p>/* 獲得Real*/<br />static RealGetRealAttribute(TiXmlElement* element, const char* name);</p><p>/* 獲得int*/<br />static int GetIntAttribute(TiXmlElement* element, const char* name);</p><p>/* 轉換描述light類型的字串到LightTypes枚舉*/<br />static Light::LightTypes ConvertLightString(const String& lighttype);</p><p>/* 轉換描述sky類型的字串到TLBB_SKY_TYPE枚舉*/<br />static TLBB_SKY_TYPE ConvertSkyString(const String& skytype);</p><p>/* 獲得情境類型*/<br />static TLBB_NODE_TYPE GetNodeType(TiXmlElement* element);</p><p>/* 獲得地形類型*/<br />static TLBB_TERRAIN_TYPE GetTerrainType(TiXmlElement* element);</p><p>/* 獲得物件類型*/<br />static TLBB_OBJ_TYPE GetObjType(TiXmlElement* element);</p><p>/* UTF8到多位元組*/<br />static void Utf8ToAscii(char* szUtf8, char* outAscii);<br />};</p><p>#endif

#include "stdafx.h"<br />#include "Utils.h"</p><p>//--------------------------------------------------------------------------------------------------------------<br />String TLBBUtils::GetStringAttribute(TiXmlElement* element, const char* name)<br />{<br />const char* value = element->Attribute(name);<br />if (value != NULL)<br />{<br />return value;<br />}<br />else<br />{<br />return StringUtil::BLANK;<br />}<br />}</p><p>//--------------------------------------------------------------------------------------------------------------<br />Vector3 TLBBUtils::GetVector3Attribute(TiXmlElement* element, const char* name)<br />{<br />const char* value = element->Attribute(name);<br />Vector3 vec;<br />if (value != NULL)<br />{<br />String str = value;<br />size_t pos = str.find_first_of(' ', 0);<br />size_t pos2 = str.find_first_of(' ', pos+1);<br />String x = str.substr(0, pos);<br />String y = str.substr(pos+1, pos2);<br />String z = str.substr(pos2+1, str.length());<br />vec.x = StringConverter::parseReal(x);<br />vec.y = StringConverter::parseReal(y);<br />vec.z = StringConverter::parseReal(z);<br />}<br />return vec;<br />}</p><p>//--------------------------------------------------------------------------------------------------------------<br />Quaternion TLBBUtils::GetQuatAttribute(TiXmlElement* element, const char* name)<br />{<br />const char* value = element->Attribute(name);<br />Quaternion quat;<br />if (value != NULL)<br />{<br />String str = value;<br />size_t pos = str.find_first_of(' ', 0);<br />size_t pos2 = str.find_first_of(' ', pos+1);<br />size_t pos3 = str.find_first_of(' ', pos2+1);</p><p>quat.w = StringConverter::parseReal(str.substr(0, pos));<br />quat.x = StringConverter::parseReal(str.substr(pos+1, pos2));<br />quat.y = StringConverter::parseReal(str.substr(pos+2, pos3));<br />quat.z = StringConverter::parseReal(str.substr(pos3+1, str.length()));<br />}<br />return quat;<br />}</p><p>//--------------------------------------------------------------------------------------------------------------<br />ColourValue TLBBUtils::GetColourValueAttribute(TiXmlElement* element, const char* name)<br />{<br />const char* value = element->Attribute(name);<br />ColourValue color;<br />if (value != NULL)<br />{<br />String str = value;<br />size_t pos = str.find_first_of(' ', 0);<br />size_t pos2 = str.find_first_of(' ', pos+1);<br />String x = str.substr(0, pos);<br />String y = str.substr(pos+1, pos2);<br />String z = str.substr(pos2+1, str.length());<br />color.r = StringConverter::parseReal(x);<br />color.g = StringConverter::parseReal(y);<br />color.b = StringConverter::parseReal(z);<br />}<br />return color;<br />}</p><p>//--------------------------------------------------------------------------------------------------------------<br />Real TLBBUtils::GetRealAttribute(TiXmlElement* element, const char* name)<br />{<br />const char* value = element->Attribute(name);<br />Real v = -1;<br />if (value != NULL)<br />{<br />String str = value;<br />v = StringConverter::parseReal(str);<br />}<br />return v;<br />}</p><p>//--------------------------------------------------------------------------------------------------------------<br />intTLBBUtils::GetIntAttribute(TiXmlElement* element, const char* name)<br />{<br />const char* value = element->Attribute(name);<br />int v = 0;<br />if (value != NULL)<br />{<br />String str = value;<br />v = StringConverter::parseInt(str);<br />}<br />return v;<br />}</p><p>//--------------------------------------------------------------------------------------------------------------<br />Light::LightTypes TLBBUtils::ConvertLightString(const String& lighttype)<br />{<br />if (lighttype == "directional")<br />{<br />return Light::LT_DIRECTIONAL;<br />}<br />else<br />{<br />return Light::LT_POINT;<br />}<br />}</p><p>//--------------------------------------------------------------------------------------------------------------<br />bool TLBBUtils::GetBoolAttribute(TiXmlElement* element, const char* name)<br />{<br />const char* value = (char*)element->Attribute(name);<br />bool b = false;</p><p>if (value != NULL)<br />{<br />String str= value;<br />b = StringConverter::parseBool(str);<br />}<br />return b;<br />}</p><p>//--------------------------------------------------------------------------------------------------------------<br />TLBB_SKY_TYPE TLBBUtils::ConvertSkyString(const String& skytype)<br />{<br />if (skytype == "SkyDome")<br />{<br />return TYPE_SKYDOME;<br />}<br />else if (skytype == "SkyBox")<br />{<br />return TYPE_SKYBOX;<br />}<br />else if (skytype == "SkyPlane")<br />{<br />return TYPE_SKYPLANE;<br />}<br />else<br />{<br />return (TLBB_SKY_TYPE)-1;<br />}<br />}</p><p>//--------------------------------------------------------------------------------------------------------------<br />TLBB_NODE_TYPE TLBBUtils::GetNodeType(TiXmlElement* element)<br />{<br />String type = element->Value();<br />if (type == "Scene")<br />{<br />return NODE_SCENE;<br />}<br />else if (type == "Terrain")<br />{<br />return NODE_TERRAIN;<br />}<br />else if (type == "Object")<br />{<br />return NODE_OBJECT;<br />}<br />else<br />{<br />return NODE_UNKNOWN;<br />}<br />}</p><p>//--------------------------------------------------------------------------------------------------------------<br />TLBB_TERRAIN_TYPE TLBBUtils::GetTerrainType(TiXmlElement* element)<br />{<br />String type = element->Value();<br />if (type == "scale")<br />{<br />return TERRAIN_SCALE;<br />}<br />else if (type == "centre")<br />{<br />return TERRAIN_CENTRE;<br />}<br />else if (type == "heightmap")<br />{<br />return TERRAIN_HEIGHTMAP;<br />}<br />else if (type == "gridInfo")<br />{<br />return TERRAIN_GRIDINFO;<br />}<br />else if (type == "lightmap")<br />{<br />return TERRAIN_LIGHTMAP;<br />}<br />else if (type == "textures")<br />{<br />return TERRAIN_TEXTURES;<br />}<br />else if (type == "pixmaps")<br />{<br />return TERRAIN_PIXMAPS;<br />}<br />else if (type == "materials")<br />{<br />return TERRAIN_MATERIALS;<br />}<br />else<br />{<br />return TERRAIN_UNKNOWN;<br />}</p><p>}</p><p>//--------------------------------------------------------------------------------------------------------------<br />TLBB_OBJ_TYPE TLBBUtils::GetObjType(TiXmlElement* element)<br />{<br />String type = element->Value();<br />if (type != "Object")<br />{<br />return OBJ_UNKNOWN;<br />}<br />type = TLBBUtils::GetStringAttribute(element, "type");</p><p>if (type == "Enviroment")<br />{<br />return OBJ_ENVIRONMENT;<br />}<br />else if (type == "Light")<br />{<br />return OBJ_LIGHT;<br />}<br />else if (type == "SkyDome")<br />{<br />return OBJ_SKYDOME;<br />}<br />else if (type == "StaticEntity")<br />{<br />return OBJ_STATICENTITY;<br />}<br />else if (type == "Model")<br />{<br />return OBJ_MODEL;<br />}<br />else if (type == "ParticleSystem")<br />{<br />return OBJ_PARTICLESYSTEM;<br />}<br />else if (type == "TerrainLiquid")<br />{<br />return OBJ_TERRAINLIQUID;<br />}<br />else<br />{<br />return OBJ_UNKNOWN;<br />}</p><p>}</p><p>//------------------------------------------------------------------------------------------------------------------<br />void TLBBUtils::Utf8ToAscii(char* szUtf8, char* outAscii)<br />{<br />// 得到UTF8編碼的字串長度<br />int nLen = MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, NULL, NULL);<br />LPWSTR lpwsz = new WCHAR[nLen];<br />MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, lpwsz, nLen);<br />int nLen1 = WideCharToMultiByte(CP_ACP, 0, lpwsz, nLen, NULL, NULL, NULL, NULL);</p><p>LPSTR lpsz = new CHAR[nLen1];<br />WideCharToMultiByte(CP_ACP, 0, lpwsz, nLen, lpsz, nLen1, NULL, NULL);</p><p>strncpy(outAscii, lpsz, nLen1);<br />delete lpsz;<br />delete lpwsz;<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.