ページ 11

フォントデータ(.otf)をロードする方法について

Posted: 2015年8月04日(火) 14:54
by 村人Cに昇格
いつもお世話になっております。
この度久々にゲームを作っていて、「フォントデータ」をロード(ユーザにインストールしてもらわずに)して文字列の描画を行うことにしました。
そこでこちらのトピックに過去ログが存在することを知りコードを使ってみたところ、うまくいかずに手こずっております。

.ttfフォントデータをCreateFontToHandleで使用する
http://dixq.net/forum/viewtopic.php?f=3&t=15532

書いたコードはこちらになります。

コード:

void FontLoad(void){
        LPCSTR hFont = ".¥¥DATE¥¥sample.otf";
	if (AddFontResourceEx(hFont, FR_PRIVATE, NULL) > 0) {
	}
	else {
		/*Error/*
		MessageBox(NULL, "読込失敗", "", MB_OK);
	}
	SetFontSize(30);
	ChangeFont("002 zou", DX_CHARSET_DEFAULT);
	DrawString(0, 0, "0123456789ABCDEF", GetColor(255, 255, 255));
}
フォントのロードには失敗します。
ですがファイルパスの誤りは何度も確認しましたがあっていました。
ブレイクポイントをLPCSTR hFontの行に設置してみたところ
”0xcccccccc <文字列の文字の読み取り中にエラーが発生しました。>”
と言われてしまいます。
他のフォントを試してもダメでした。
なぜだか原因がつかめずにいます。
ご回答、よろしくお願いします。

Re: フォントデータ(.otf)をロードする方法について

Posted: 2015年8月04日(火) 17:06
by amehirune
こんにちは。参考先のトピ主です。
私は未熟なので、このようなバグの原因はわかりません。ほかの方からの回答をお待ちください。

代わりにと言ったらなんですが、こちらに解決したコード(の改良版)を載せておきます。

コード:

	//フォント登録
	int FontSize,FontHandle;
	void *Buf;
	DWORD font_num;

	{
		//Sampleをロード
		font_num = 0;
		FontSize = FileRead_size( "dat/font/Sample.otf" );
		FontHandle = FileRead_open( "dat/font/Sample.otf" );
		Buf = malloc( FontSize );

		FileRead_read( Buf,FontSize,FontHandle );
		AddFontMemResourceEx( Buf, FontSize, NULL, &font_num );
	}
それと、今更ながらですが、私の環境では提示されたコードが正常実行しました。
パスの表記の仕方に問題があるのかもしれません。
私の場合、"dat/font/Sample.otf"としていました。
オフトピック
開発環境:VC++2008EE
OS:Windows10 Pro
物理メモリ:8GB

Re: フォントデータ(.otf)をロードする方法について

Posted: 2015年8月04日(火) 19:07
by みけCAT
LPCSTRの代わりにconst char*
AddFontResourceExの代わりにAddFontResourceExA
としたらどうなりますか?

Re: フォントデータ(.otf)をロードする方法について

Posted: 2015年8月04日(火) 20:33
by YuO
村人Cに昇格 さんが書きました:ですがファイルパスの誤りは何度も確認しましたがあっていました。
相対パスで書いてありますが,カレントディレクトリも含めて確認しましたか。
ありがちなのは,相対パスの起点となるカレントディレクトリが想定と異なる,というものです。
そもそも,カレントディレクトリはプログラム中で明示的に指定しない限りどこになるかわからないものなので,GetModuleFileName + PathRemoveFileSpec + PathAppend,場合によっては PathCanonicalize も使って絶対パスに変換し,それをAddFontResourceExに渡してみてはどうでしょうか。
村人Cに昇格 さんが書きました:ブレイクポイントをLPCSTR hFontの行に設置してみたところ
”0xcccccccc <文字列の文字の読み取り中にエラーが発生しました。>”
と言われてしまいます。
その行ではまだhFontへの代入が行われていないため,Visual C++のデバッガはとりあえず変数を0xCCで埋めます。
これは,未処理変数を使用しようとしていることを見つけやすくするための機能です。
ステップ実行を行い,次の行に実行行を移せば (=ブレイクポイントを設定した行を実行すれば),hFontに値が設定されるはずです。

Re: フォントデータ(.otf)をロードする方法について

Posted: 2015年8月05日(水) 01:23
by 村人Cに昇格
返信が大変遅くなりました。
申し訳ございません。

amehirune 様
こちらのコードでもロードできませんでした。
すごくわかりやすい綺麗なコードをせっかく掲載していただいたのに、申し訳ないです><;

みけCAT 様、YuO 様
LPCSTRの代わりにconst char*
AddFontResourceExの代わりにAddFontResourceExA
とした場合も出力結果に相違は発生しませんでした。

また、

パスを試しに
".¥¥DATE¥¥Sample.otf"
から
"DATE/Sample.otf"
にしたところ文字化けが発生してしまいました。
ですが”読込失敗”というメッセージボックスの表示はなくなりました。
これは読込には成功しているが表示する際に文字コードかなにかが原因で文字化けが発生していると考えてもよろしいのでしょうか?

フォントファイルの場所は以下のようになっております。

プロジェクトファイル
|_ 各種cppファイルやslnファイル
   |_ DATE
      |_ Sample.otf

Re: フォントデータ(.otf)をロードする方法について

Posted: 2015年8月05日(水) 07:56
by amehirune
では、以下の点を確認してみてください。

・DXライブラリが最新のものになっているか?
 プログラムをデバッグ実行した際などにログが出力されるはずです。
 もし最新のものになっていなければ、更新してみてください。
・CreateFontToHandle関数に渡しているフォント名が適切か?
 恐らくCreateFontToHandle関数を利用し、描写をしているのではないかと思います。
 その時のフォント名が、本来のものと異なっている可能性があります。
 注意してほしいのが、「.otfファイル名≠フォント名」ということです。
 .otfファイルをダブルクリックした際に開かれるウィンドウの上のほうに正式なフォント名の記載があります。
 一度ご確認ください。
・表示的に不可能文字を描写しようとしていないか?
 例えば、私の使っている「1Byte文字」では、全角文字は使用できません。
 そのように、あなたが使おうとしているフォントにも、不可能文字が存在することがあるかもしれません。
 テスト描写の際は、「1234567890aiueo」などと、簡単な文字列をお勧めします。

Re: フォントデータ(.otf)をロードする方法について

Posted: 2015年8月05日(水) 23:18
by 村人Cに昇格
解決いたしました!
amehirune 様のおっしゃるとおり、フォント名の誤表記並びに出力不可文字だったことが原因のようです。
テスト用に用意したフォントが日本語のみ対応のフォントで、それが原因で半角文字列が文字化けしてしまったようです。
試しに半角(本来使用したい)フォントで実行してみたところ正常に出力されました。
コード自体に不具合はなかったようです…

最後までお力添え、アドバイスなどをしていただき、amehirune 様並びにYuo 様、みけCAT 様のお三方に感謝いたします。
ありがとうございました!