Re: 画像からDXフォントを作りたい ( No.1 ) |
- 名前:管理人 日時:2017/02/14 00:22
DXフォントに含まれる文字には、1文字につき以下の情報が含まれています
・文字の画像の幅・高さ
・文字の画像データ
・文字の画像を文字の描画原点からどれだけズレた位置に描画するのか、の相対座標
・次の文字の描画原点となる相対座標
例えば『a』と『A』と『A』では文字の画像の面積が異なるので、1文字毎に
『文字の画像の幅・高さ』の情報や『文字の画像データ』が異なります
なので、LoadDivGraph 関数で読み込む画像ように、縦横に綺麗に文字が並んでいる
画像がDXフォントファイルの中に保存されているわけではありません
ところでご所望の機能ですが、
> あらかじめ作っておいた白黒の画像からDXフォントファイルを作る機能
具体的にはどのような機能でしょうか?
文字は漢字などを含めると数千文字ありますが、画像と文字との関連付けは
どのように行うイメージでしょうか?
|
Re: 画像からDXフォントを作りたい ( No.2 ) |
- 名前:玉子のもと 日時:2017/02/15 20:43
> 文字は漢字などを含めると数千文字ありますが
がっつり使うのではなく、補助的(スコアの表示等)に使えたらいいなと思っていますので、文字数はあまり考えていません。
DrawGraphでも対応できますが、色を変えるのは難しいですしソースコードも汚くなってしまいますので、
フォントとして扱えたらうれしいですです
> 画像と文字との関連付けはどのように行うイメージでしょうか?
"a.bmp", "b.bmp"といった画像をフォルダに用意しておいて、それをフォントファイルに纏めるというのをイメージしていましたが、
画像だけではなく、描画位置のオフセットを考えないといけないのですね……。
文字ごとに別々の画像ファイルにしておけば、画像の幅はそこから読み取れませんか?
描画位置のオフセットについては、必要なデータのcsvを用意して、それを読み込むというのはどうですか?
デフォルトは画像の横幅などに合わせて、対応するデータがあったらその値で上書きといった形ができるといいです
これでも、フォントを自作したり文字に合わせて画像を表示するよりは扱いやすいので……。
//以下csvの例(出来れば、次の描画位置は画像ファイルの幅を基準(0)にできるといいです)
文字, その文字の描画位置x, y, 次の文字の描画位置x, y
//例えば、以下のようにしたDXフォントを読み込み、文字列"aaa"と描画した結果は、a.bmpを三つ並べて描画した結果と等しくなる
a, 0, 0, 0, 0
|
Re: 画像からDXフォントを作りたい ( No.3 ) |
- 名前:管理人 日時:2017/02/16 00:59
ご返答ありがとうございます
スコア表示などの補助的なものですか…
各文字は全部等幅で、英数字くらいを表示できれば良い感じでしょうか?
もしそうでしたら、csvから読み込むといった大掛かりな機能は無くてもよさそうなので… (・・;
|
Re: 画像からDXフォントを作りた ( No.4 ) |
- 名前:玉子のもと 日時:2017/02/16 14:47
返信ありがとうございます
> 各文字は全部等幅で
せめて各画像の幅に合わせられるようにしていただきたいです。
……csvなら比較的簡易的な実装になるのではと思ったのですが、大掛かりになってしまうのですか……。
代わりに使う側の作業が泥臭くなりますが、機械的にパラメーターを設定するのには向いているのではないかなと
どうしてもと言うのでなければ、柔軟さが欲しいのですが、、、
> 英数字くらいを表示できれば良い感じでしょうか?
ユーザーの労力次第で文字数は増やせるほうがよいです。
文字数に制約が生まれるような実装をお考えなのですか?
|
Re: 画像からDXフォントを作りたい ( No.5 ) |
- 名前:yumetodo 日時:2017/02/17 22:07
そうなると、最初からフォントを作ってAddFontResourceExとかで読み込んでしまう方がいいかと・・・。
フリーのフォントをいじるようにすればそこまで大変ではないはず。
|
Re: 画像からDXフォントを作りたい ( No.6 ) |
- 名前:管理人 日時:2017/02/18 16:12
ご返答ありがとうございます
それなりの機能を実装するとなりますと、yumetodoさんも仰られていますがフォントファイルを
自作して普通のフォントの一つとして使用するという選択肢と被ってしまうので、
その場合エディタ等が充実している『フォントファイルを作成する』に軍配が上がってしまい、
機能を追加しても使う方がかなり限られることになってしまいます
なので、LoadDivGraph と同じ程度の手軽さで 1バイト文字のみのフォントハンドルが作成できる
機能であれば使う方もそこそこ居られるかもと思った次第です
あと、失念していたのですが『フォントハンドルに画像を文字の代わりに描画する』ための関数
AddFontImageToHandle がありました
// 指定の文字の代わりに描画するグラフィックハンドルを登録する
// FontHandle : 文字画像を登録するフォントハンドル
// Char : 文字の代わりに画像を描画する 1文字だけの文字列
// GrHandle : 文字の代わりに描画するグラフィックハンドル
// DrawX : 文字を描画する左上座標から、グラフィックハンドルの描画を行うオフセットX座標
// DrawY : 文字を描画する左上座標から、グラフィックハンドルの描画を行うオフセットY座標
// AddX : 次の文字を描画するオフセットX座標
int AddFontImageToHandle( int FontHandle, char *Char, int GrHandle, int DrawX, int DrawY, int AddX ) ;
例えば『a』という文字の画像を用意して、これをフォントハンドルを使用して文字『a』が描画される際に
フォントの文字『a』の代わりに用意した画像の『a』を描画させるようにしたい場合は
AddFontImageToHandle(
FontHandle, // フォントハンドル
"a", // 『この文字の代わりに画像を描画する』という文字の文字列
AGrHandle, // 代わりに描画する画像
0, // Xオフセット
4, // Yオフセット
16 // 次の文字の描画Xオフセット
) ;
このようにします
以前手元で英数字記号だけの 1文字 8x16 の等幅の文字の画像を AddFontImageToHandle を使用して
フォントハンドルに登録して使用するサンプルを作成していましたので、よろしければご覧ください
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int FontHandle ;
int CharGrHandle[ 16 ][ 16 ] ;
int i ;
int j ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 透過色を紫色に変更
SetTransColor( 255, 0, 255 ) ;
// 文字画像を読み込み
LoadDivGraph( "DefaultFont.bmp", 128, 16, 16, 8, 16, CharGrHandle[ 0 ] ) ;
// 文字画像登録用のフォントハンドルを作成( 登録する文字画像のみを使用するのでサイズなどは適当 )
FontHandle = CreateFontToHandle( NULL, 16, 0 ) ;
// 文字画像をフォントハンドルに登録する
for( i = 0 ; i < 8 ; i ++ )
{
for( j = 0 ; j < 16 ; j ++ )
{
TCHAR Char[ 2 ] ;
// 登録する1文字だけの文字列を作成
Char[ 0 ] = ( char )( j + i * 16 ) ;
Char[ 1 ] = 0 ;
// 文字画像を登録
AddFontImageToHandle( FontHandle, Char, CharGrHandle[ i ][ j ], 0, 0, 8 ) ;
}
}
// 登録した文字画像を使って文字列を描画
DrawStringToHandle( 0, i, "ABCDabcd", GetColor( 255,255,255 ), FontHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
サンプルで使用している DefaultFont.bmp もこちらにアップしました
https://dxlib.xsrv.jp/temp/DefaultFont.bmp
DXフォントファイルを作成する機能ではありませんが、こちらで代用できればと
思うのですがいかがでしょうか?
|
Re: 画像からDXフォントを作りたい ( No.7 ) |
- 名前:玉子のもと(解決) 日時:2017/02/18 21:22
返信ありがとうございます。
紹介いただいたAddFontImageToHandleを使えば、こちらのソースをほとんど改変せずにやりたかったことを実現できます。ありがとうございます。
また、お二方のおっしゃる通り、フォントを自作する方向も探ってみようと思います。
対応ありがとうございました。
|
Re: 画像からDXフォントを作りたい ( No.8 ) |
- 名前:玉子のもと 日時:2017/02/19 11:36
すみません、いったん解決した話題だったのですが、また一つお願いしたい事柄ができてしまいました。
CreateFontDataFile関数で、フォント名や太さをではなくフォントハンドルを渡せるようにはできないでしょうか
先の方法を使って画像をフォントハンドルに設定した後、それをファイルに保存することができれば、
あらかじめ別のプログラムでDXフォントファイルを作って置いてからゲームで読み込むことにより、
ゲームのフォルダ構成やソースコードを汚さずに実装できるのではと思ったのですが、、、
返信お待ちしています
|
Re: 画像からDXフォントを作りたい ( No.9 ) |
- 名前:管理人 日時:2017/02/20 01:22
> CreateFontDataFile関数で、フォント名や太さをではなくフォントハンドルを渡せるようにはできないでしょうか
仮に CreateFontDataFile 関数にフォントハンドルを渡せるようにしたとしても、AddFontImageToHandle で追加した情報は
保存されませんので、意味が無いと思います
AddFontImageToHandle はあくまで『本来のフォントの文字画像の代わりにグラフィックハンドルの画像を描画する機能』なので、
DXフォントファイルのデータとは構造が全く異なるグラフィックハンドルの情報を保存できるような仕様にはなっていません
「では AddFontImageToHandle で追加された画像の情報も保存されるようにDXフォントファイルの仕様を拡張すべきか?」
ということになりますが、こちらは前回と同じく
「そこまでして独自の文字画像を使ったDXフォントファイルを作るくらいならフォントファイルを作る選択肢を選ぶ人の方が多いのでは」
という推測になってしまいます
玉子のもとさんが気にかけるフォルダ構成やソースコードの綺麗さを考慮するとフォントファイルを自作するのが
最適解のように思います
|
Re: 画像からDXフォントを作りたい ( No.10 ) |
- 名前:玉子のもと(解決) 日時:2017/02/20 02:43
分かりました。
ありがとうございました。
|