所以我最近开始为我正在开发的游戏项目学习 Lua(使用 Visual Studio 2010 和 Ogre3D 引擎针对 Windows 7),同时我开始为我们的 GUI 系统实现选择的库,快速图形界面。我决定将字体加载外包给 lua 作为学习经验,并开始遇到错误。认为这是我对 lua 的缺乏经验,我花了几天时间研究问题可能是什么,但是在用纯 C++ 重现错误时,我遇到了同样的问题。
要启动 QuickGUI 的 FontManager,我首先创建皮肤效果管理器和资源管理器的实例,然后使用它们创建 QuickGUI::Core 对象,然后调用静态单例函数来获取指向 FontManager 对象的指针。然后,我通过向它传递一个带有请求的字体名称的字符串、一个表示 *.png 中呈现的字体的 Image 对象、一个用于确定基线的 int 以及描述个人的关联 XML 文件的名称来创建一个可用的字体人物。如下:
GUIResourceManager* mGuiResourceManager = new GUIResourceManager();
GUISkinEffectManager* skinEffectMgr = new GUISkinEffectManager();
QuickGUI::Core* GUICore = new QuickGUI::Core(mGuiResourceManager, skinEffectMgr);
QuickGUI::FontManager* fontMgr = QuickGUI::FontManager::getSingletonPtr();
fontMgr->createFont("TimesNewRoman.14", mGuiResourceManager->getImage("TimesNewRoman.14.png"), 10,"fonts/TimesNewRoman.14.xml");
下面是 QuickGUI::FontManager 类的相关函数:
Font* FontManager::createFont(const std::string& name, Image* i, unsigned int baseline, const std::string& fontXMLFile)
{
if(mFontMap.find(name) != mFontMap.end())
{
Log::exception("FontManager::createFont : A font with name \"" + name + "\" already exists!");
return NULL;
}
TiXmlDocument xmlDoc;
xmlDoc.LoadFile(fontXMLFile);
TiXmlElement* root = xmlDoc.LastChild()->ToElement();
Font* newFont = new Font(name,i,baseline,root);
mFontMap[name] = newFont;
return newFont;
}
QuickGUI 库使用 TinyXML 进行解析。我的程序在 xmlDoc.LastChild()->ToElement() 调用上崩溃,因为 xml 无效。经过调查,我在调试中发现了一些奇怪的东西:我的字符串不知何故没有进入 createFont() 函数。这些是我在上述函数开头设置断点后的参数值:
Font* FontManager::createFont(const std::string& name, Image* i, unsigned int baseline, const std::string& fontXMLFile)
name = "¤ð/"
i = 0x0308a738{mName="TimesNewRoman.14.png" mOgreImage=0x00ca3d28}
baseline = 10
fontXMLFile = "|ð/"
一旦我注意到这一点,我首先认为它可能试图将指针解释为文字字符串数据;这两个值从运行时更改为运行时,但它们始终仅由单个字符相互关闭。这样做有两个问题,首先,Visual Studio 表明它们是带有“”标记的字符串,其次,正在创建的 Image 对象的字符串很好,并且它接受了相同的 const std::string& 类型作为论据。然后我认为这可能是我的项目和 Ogre 在多字节字符集打开的情况下编译的问题,而 QuickGUI 具有 Unicode。我重新编译,重新运行 - 同样的问题。
在这一点上,我不知道该怎么办。这不是我的调用语法可以看到的问题,我查看了 QuickGUI 代码(可在此处获得),我已经双重、三重、四重检查了我的编译设置,调查了 std 实现的潜在编译器特定问题: :string,总体上在这个问题上打了我近一周的大脑,但无济于事。如果有人能够提供关于为什么在上帝的绿色地球上我的弦的价值会像这样不规律地变化的见解,我将不胜感激。