2014-12-20 52 views
0
bool win::checkIfFScreen(sf::RenderWindow &window) 
{ 
    TiXmlDocument doc; 
    TiXmlElement * fullscreen; 

    if(!doc.LoadFile("videoSettings.xml")) 
    { 
     fullscreen = new TiXmlElement("Window"); 
     fullscreen->SetAttribute("Fullscreen: ", 0); 
     doc.LinkEndChild(fullscreen); 
     fullscreen->Attribute("Fullscreen: "); 

     std::cout << typeid(*fullscreen->Attribute("Fullscreen: ")).name() << std::endl; 
     doc.SaveFile("videoSettings.xml"); 
     return false; 
    } 

    if(*(fullscreen->Attribute("Fullscreen: ")) == '0') 
     return false; 

    return true; 


} 

理念:TinyXML的不能比較屬性爲char

所以,我想約人的偏好存儲信息,如果他想爲遊戲是全屏或窗口。我創建了這個布爾函數來檢查是否存在「videoSettings.xml」文件並返回有關用戶偏好的信息。如果文件不存在,它將在全屏設置爲0時創建(基本上意味着遊戲將被窗口化並且用戶可以在遊戲設置中稍後改變它)。

不起作用部分:

if(*(fullscreen->Attribute("Fullscreen: ")) == '0') 
    return false; 

添加此兩行我有段錯誤後(核心轉儲)。

看來,該值存儲爲字符。

編輯: 這行解決了一切:)。

TiXmlHandle docHandle (&doc); 
TiXmlElement *child = docHandle.FirstChild("Window").ToElement(); 
if(child) 
    if(*child->Attribute("fullscreen") == '1') 
     return true; 
    else if(*child->Attribute("fullscreen") == '0') 
     return false; 

謝謝@frasnian。

+0

你確定首先你的代碼輸入第一個if case嗎?首先嚐試NULL情況,然後嘗試這種情況下,如果案例 – Thellimist

+0

@ user140345:很高興它幫助。但要注意的一點是,如果XML文檔中不存在屬性「全屏」,則對「Attribute」的調用將返回null。你會在你的'if(* child-> Attribute ...'test)中解引用一個nullptr,確保測試'Attribute()'的結果以確保它是一個有效的指針,然後將它解除值爲 – frasnian

回答

1

你的代碼有這樣的:

TiXmlElement * fullscreen; // not initialized to anything here 

if(!doc.LoadFile("videoSettings.xml"))  // LoadFile returns true on success 
{ 
    fullscreen = new TiXmlElement("Window"); // okay 
     ... 
    return false; 
} 

// question: if doc.LoadFile() succeeds, what is this going to do- 
if(*(fullscreen->Attribute("Fullscreen: ")) == '0') 
    return false; 

您正在使用fullscreen之後以任何初始化。

上編輯 針對在評論質疑:

如果加載文檔成功,你需要的東西,如獲得根元素:

TiXmlElement* root = doc.FirstChildElement("Whatever"); // root element name 
if (root){ 
    TiXmlElement* el = root->FirstChildElement("Window"); // etc, etc, 

當你走過的文檔層次結構到您的「Window」元素的任何位置,請使用TiXmlElement::Attribute()TiXmlElement::QueryAttribute()來獲取屬性的值(如果存在)。

比使用FirstChild/NextSibling等等(用TiXmlElementTiXmlNode繼承)更好的方法是使用句柄。查看與TiXmlHandle相關的TinyXML文檔 - 主文檔頁面有一個非常簡單的例子。

作爲便箋,應該刪除發佈代碼中屬性名稱後的冒號(即"fullscreen",而不是"Fullscreen:")。

另外,該線路:

fullscreen->Attribute("Fullscreen: "); 

後立即打電話LinkEndChild()沒有做任何事情。

+0

哦,我知道了,你知道嗎,如果有什麼東西可以從文件中獲得屬性? – user140345

+0

謝謝,我已經解決了! – user140345

+0

我忘了刪除這行fullscreen-> Attribute(「Fullscreen:」); 當我在這裏問問題時。我知道它沒有做任何事情。 :) – user140345