Irrlicht - from Noob to Pro: Anwendungseinstellungen

Aus Wikibooks
Wechseln zu: Navigation, Suche
Wikibooks buchseite.svg Zurück zu "C++ Code von Lua aufrufen" | One wikibook.svg Hoch zu Seitenanfang |

hochtext="Inhaltsverzeichnis" | hochlink=Irrlicht - from Noob to Pro| vortext="Open Dynamics Engine"| vorlink=Irrlicht - from Noob to Pro:Open Dynamics Engine|}}

Anwendungseinstellungen[Bearbeiten]

Ein Spiel oder eine Anwendung generell sollte möglichst flexibel für den Anwender sein. Er sollte also darüber entscheiden können, welche Auflösung, die Anwendung besitzt oder welche Farbtiefe, welcher Renderer verwendet werden soll, ob die Anwendung im Vollbildmodus läuft und vieles mehr. Um dies nicht jedes mal wieder einstellen zu müssen, könnte man diese Informationen via XML in eine Datei speichern und diese zu Beginn des Programms laden lassen. Dazu erstellen wir uns eine Struktur, die alle wichtigen Daten enthält. Hierbei beschränke ich mich auf einige wenige, da sie nur das Prinzip verdeutlichen soll. Vom Programmierer können natürlich beliebig viele andere Informationen hinzugefügt oder weggelassen werden.

struct ApplicationSettings
{
  u32 winWidth, winHeight;
  bool fullscreen;
};

Wenn das Programm beendet wird, wird eine finalize-Funktion aufgerufen, die die Anwendungsdaten in XML exportiert.

bool finalize(void)
{
  //mySettings anpassen
 
  IWriteFile* file = device->getFileSystem()->createAndWriteFile("settings.xml");
 
  if(file)
  {
    IXMLWriter* writer = device->getFileSystem()->createXMLWriter(file);
 
    if(writer)
    {
      writer->writeXMLHeader();
      writer->writeLineBreak();
      writer->writeElement(L"config");
      writer->writeLineBreak();
 
      writer->writeElement(L"resolution", true, L"width", stringw(mySettings.winWidth).c_str(), L"height", stringw(mySettings.winHeight).c_str());
      writer->writeLineBreak();
      writer->writeElement(L"fullscreen", true, L"value", stringw(mySettings.fullscreen).c_str());
 
      writer->writeClosingTag(L"config");
 
      file->drop();
      writer->drop();
    }
    else
    {
      return false;
    }
  }
  else
  {
    return false;
  }
 
  return true;
}

Wir gehen von dieser XML-Datei aus:


<?xml version="1.0"?>

<config>
        <resolution width="640" height="480" />
        <fullscreen value="0" />
</config>

Diese können wir nun wieder laden, wenn das Programm gestartet wird. Dabei müssen wir zunächst einen NULL-Device erzeugen, da wir zum Laden der XML-Datei eine gültige Instanz des IrrlichtDevices brauchen. Diese können wir dann wieder freigeben und mit unseren geparsten Daten neuerzeugen.

bool initialize(void)
{
  device = createDevice(EDT_NULL);
 
  IXMLReader* reader = device->getFileSystem()->createXMLReader("settings.xml");
 
  if(reader)
  {
    while(reader->read())
    {
      switch(reader->getNodeType())
      {
        case EXN_ELEMENT:
          if(stringw("resolution") == reader->getNodeName())
          {
            mySettings.width = reader->getAttributeValueAsInt(L"width");
            mySettings.height = reader->getAttributeValueAsInt(L"height");
          }
 
          if(stringw("fullscreen") == reader->getNodeName())
          {
            // 0-> false, 1 -> true
            mySettings.fullscreen = reader->getAttributeValueAsInt(L"value") == 0 ? false : true;
          }
          break;	
      }
    }
  }
  else
  {
    return false;
  }
 
  return true;
}

So sieht nun ein Ausschnitt aus der aufrufenden Datei aus:

IrrlichtDevice* device;
ApplicationSettings mySettings;
 
if(!initialize())
{
  //Es sind keien Settings vorhanden, oder die Datei konnte nicht geladen werden
  //Also Standardwerte!
  device = createDevice(EDT_OPENGL, dimension2d<u32>(640,480), false);
}
else
{
  device = createDevice(EDT_OPENGL, dimension2d<u32>(mySettings.winWidth, mySettings.winHeight), mySettings.fullscreen);
}
 
//Programm ablaufen lassen
//Programm wird beendet
 
if(finalize())
{
  cout << "Daten wurden erfolgreich gespeichert" << endl;
}
else
{
  cout << "Daten konnten nicht gespeichert werden" << endl;
}