そのため、最近、自分が取り組んでいるゲーム プロジェクト (Visual Studio 2010 と Ogre3D エンジンを使用して Windows 7 をターゲットにしている) のために Lua を独学で学ぶことにしました。ほぼ同時に、GUI システム用に選択したライブラリの実装を開始しました。クイック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 = "|ð/"
これに気づいたとき、私は最初、ポインターをリテラル文字列データとして解釈しようとしているのではないかと考えました。2 つの値はランタイムごとに変化しますが、常に 1 つの文字だけ互いにずれているだけです。これには 2 つの問題がありました。1 つ目は、Visual Studio が "" マークが付いた文字列であることを示していたこと、2 つ目は、作成されている Image オブジェクトがその文字列を問題なく取得しており、同じ const std::string& タイプを受け入れていたことです。引数として。次に、プロジェクトと Ogre がマルチバイト文字セットをオンにしてコンパイルされ、代わりに Unicode を使用する QuickGUI に問題があるのではないかと考えました。私は再コンパイルし、再実行しました-同じ問題。
この時点で、私は何をすべきかわかりません。呼び出し構文で確認できる問題ではありません。QuickGUI コード (ここで入手可能) を調べ、コンパイル設定を 2 倍、3 倍、4 倍チェックし、std の実装に関する潜在的なコンパイラ固有の問題を調査しました。 :string、そして全体的に、この問題でほぼ 1 週間にわたって私の頭を悩ませましたが、役に立ちませんでした。神の緑の大地で私の弦の値がこのように不規則に変化する理由について誰かが洞察を提供できるなら、私は最も感謝しています.