Bonjour,
Je suis sur un projet de jeu d'aventure en 3d genre les chevaliers de baphomets.
Je préfère ne pas en parler car je risque de ne jamais le mener au bout comme tous mes projets.
Enfin passons, j'utilise beaucoup les fichiers xml. Jusqu'à maintenant je ne faisais que les lire. Mais je me suis attaqué au menu et je veux sauvegarder ma config. Mais la c'est le drame.
Donc avant je lisais les fichiers xml sans problème et je les creait avec l'éditeur de texte.
Maintenant mon programme en cree un tres bien, je le lis tres bien avec mon navigateur internet. Mais irrlicht ne semble pas réussir à le lire : xml->read() renvoie 0.
Le fichier xml créé par irrlicht est au format UTF16 ou UTF32 alors que celui que j'avais créé à l'éditeur de texte en UTF8, c'est la seul différence.
Mais je vois pas pourquoi irrlicht ne lirais pas de l'UTF32.
Je vous passe les fonctions concerné :
Lecture :
IXMLReader* xmlConfig = device->getFileSystem()->createXMLReader(pathConfig.c_str()); if (xmlConfig) log(stringc("Finded config file ") + pathConfig + " reading it..."); else { log(stringc("Can't find config file ") + pathConfig + " quitting..."); return 1; } while(xmlConfig && xmlConfig->read()) { log(stringc("startmenu ")); if (xmlConfig->getNodeType()==EXN_ELEMENT) { if (core::stringw("device") == xmlConfig->getNodeName()) { dr = E_DRIVER_TYPE(xmlConfig->getAttributeValueAsInt(L"driver")); } else if (core::stringw("dimension") == xmlConfig->getNodeName()) { dim = dimension2d<s32>(xmlConfig->getAttributeValueAsInt(L"width"),xmlConfig->getAttributeValueAsInt(L"height")); } else if (core::stringw("pixel") == xmlConfig->getNodeName()) { bits = xmlConfig->getAttributeValueAsInt(L"bits"); } else if (core::stringw("fullscreen") == xmlConfig->getNodeName()) { fullscreen = xmlConfig->getAttributeValueAsInt(L"fs"); } else if (core::stringw("stencilbuffer") == xmlConfig->getNodeName()) { stencilbuffer = xmlConfig->getAttributeValueAsInt(L"sb"); } else if (core::stringw("vsync") == xmlConfig->getNodeName()) { vsync = xmlConfig->getAttributeValueAsInt(L"vs"); } else if (core::stringw("local") == xmlConfig->getNodeName()) { lang = xmlConfig->getAttributeValueAsInt(L"lang"); } else if (core::stringw("main") == xmlConfig->getNodeName()) { pathMain = xmlConfig->getAttributeValue(L"file"); } else if (core::stringw("startmenu") == xmlConfig->getNodeName()) { log(stringc("startmenu ") + xmlConfig->getAttributeValue(L"file")); pathStart = xmlConfig->getAttributeValue(L"file"); } } } xmlConfig->drop();
Ecriture:
int startmenu::saveConfig() { IXMLWriter* xmlConfig = device->getFileSystem()->createXMLWriter(pathConfig.c_str()); if (!xmlConfig) return 1; xmlConfig->writeXMLHeader(); xmlConfig->writeElement(L"config"); xmlConfig->writeLineBreak(); xmlConfig->writeElement (L"device", true, L"driver", stringw(dr).c_str()); xmlConfig->writeLineBreak(); xmlConfig->writeElement (L"dimension", true, L"width", stringw(dim.Width).c_str(), L"height", stringw(dim.Height).c_str()); xmlConfig->writeLineBreak(); xmlConfig->writeElement (L"pixel", true, L"bits", stringw(bits).c_str()); xmlConfig->writeLineBreak(); xmlConfig->writeElement (L"fullscreen", true, L"fs", stringw(fullscreen).c_str()); xmlConfig->writeLineBreak(); xmlConfig->writeElement (L"stencilbuffer", true, L"sb", stringw(stencilbuffer).c_str()); xmlConfig->writeLineBreak(); xmlConfig->writeElement (L"vsync", true, L"vs", stringw(vsync).c_str()); xmlConfig->writeLineBreak(); xmlConfig->writeLineBreak(); xmlConfig->writeElement (L"main", true, L"file", stringw(pathMain).c_str()); xmlConfig->writeLineBreak(); xmlConfig->writeElement (L"local", true, L"lang", stringw(lang).c_str()); xmlConfig->writeLineBreak(); xmlConfig->writeLineBreak(); xmlConfig->writeElement (L"startmenu", true, L"file", stringw(pathStart).c_str()); xmlConfig->writeLineBreak(); xmlConfig->writeClosingTag(L"config"); xmlConfig->writeLineBreak(); xmlConfig->writeLineBreak(); xmlConfig->drop(); return 1; }
Dark calculator
P.S. : J'ai aussi des problèmes avec les xml créé par irrfonttool avec la version linux tandis que j'ai pas de problème avec ceux crée sous wine avec la version win32-visualcpp
P.P.S. : Oui j'ai oublié de préciser que je suis sous linux debian avec irrlicht 1.5, a mon avis le problème vient de cette version de irrlicht et de linux
Hors ligne
Bon je me répond,
J'ai réussi à corriger le bug en allant modifier le code source d'Irrlicht.
Apparemment se serai dut au fait que je suis sous linux en version 64 bits.
En fait si je ne me trompe pas le reader xml utilisais des long int pour lire le fichier se qui sous x86 correspond bien à des nombres 32bits alors que sous x86_64 cela donne des 64bits, il fallait donc utiliser de l'int tous court qui est à 32bits sur les 2 architectures. J'ai donc changé les occurences qu'il fallait dans la fonction de lecture du xml mais je suis pas sur que tout soit bien corrigé car il reste des typedef char 32 unsigned long se qui donne char32 = u64 : se qui dois amener à d'autres erreurs.
Enfin moi ca marche impec je lis et écris des xml sans problème, je suis heureux!
J'aurais bien rapporté le bug mais je ne sais pas où le faire : sur le forum en, par mail, ou sur un bugtracker ?
Enfin je vais chercher et au pire poster sur le forum officiel.
Bonne journée à tous.
dark calculator
P.S. : Les fonts xml crée avec le font tool remarche aussi du coup.
[edit] J'ai trouver le post, concernant mon bug sur le forum officiel[/edit]
Dernière modification par dark calculator (11-01-2009 17:30:17)
Hors ligne
Je m'attaque aussi au xml avec lecture et écriture. Je suis aussi sous linux, c'est assez galère le format d'enregistrement en effet et je me demande si je vais pas passer par l'ecriture d'un fichier simple avec une extension xml.
Hors ligne