広告あり

【DXライブラリ】フォントや大きさを指定して文字を表示する

DXライブラリとC言語で3Dゲーム制作。今回はフォントや大きさを指定して文字を表示する方法について。

文字のフォントや大きさを変更したい

DXライブラリで文字を表示する場合、DrawString()またはDrawFormatString()を使うのが一番簡単だがこれだとフォントや大きさなどの指定ができない。開発段階のときは問題ないと思うが表に公開するとなると見栄えはやはり気になるところ。

文字を表示する際フォントや大きさを指定したい場合は CreateFontToHandle() でフォントや大きさなどを指定する。アンチエイリアスもつけることが可能だが処理が重いようなので低スペックでも遊べるゲームを目指す場合は乱用厳禁。

宣言:int CreateFontToHandle(char *FontName, int Size, int Thick, int FontType);
引数:char *FontName 作成するフォント名(NULLにするとデフォルトのフォント)
   int Size フォントのサイズ(およそドット数。-1にするとデフォルトの大きさ)
   int Thick フォントの太さ(0~9。-1にするとデフォルトの太さ)
   int FontType フォントのタイプ
          -1:デフォルト
          DX_FONTTYPE_NORMAL:ノーマルフォント
          DX_FONTTYPE_EDGE:エッジつきフォント
          DX_FONTANTIALIASING:アンチエイリアスフォント
          DX_FONTANTIALIASING_4X4:アンチエイリアスフォント4*4
          DX_FONTANTIALIASING_8X8:アンチエイリアスフォント8*8
          DX_FONTANTIALIASING_EDGE_4X4:アンチエイリアス+エッジ4*4
          DX_FONTANTIALIASING_EDGE_8X8:アンチエイリアス+エッジ8*8
戻り値:-1 失敗
    0以上 フォントハンドル

指定が終わったら DrawStringToHandle() で文字を表示する。

宣言:int DrawStringToHandle(int x, int ,y char *String, unsigned int Color, int FontHandle);
引数:int x, y 文字を表示する起点座標
   char *String 描画したい文字のポインタ
   unsigned int Color 描画する文字の色
   int FontHandle 描画に使用するフォントハンドル
戻り値:0 成功
    -1 失敗

不要になったフォントハンドルは DeleteFontToHandle() で削除する。

宣言:int DeleteFontToHandle(int FontHandle);
引数:int FontHandle 削除したいフォントハンドル
戻り値:0 成功
    -1 失敗

使用できるフォントの確認

使用できるフォントだがPC内に入ってるフォントデータを使用できる

PC内のフォントデータを確認する場合はまずエクスプローラーを開き、ローカルディスク(Cドライブ)→Windows→Fontsと進むとフォントデータを確認できる。

もしくはWordなどの文章作成ソフト、Excelなどの表計算ソフトから確認する。下はLibreOfficeのCalc。

フォントは環境依存になるため、windowsで標準搭載されているフォントを使うのが無難。

実装

それでは実装。今回も新たにStringMng.cpp/hを追加する。なお今回のファイル名にはMngがついているが以前紹介した管理部的な処理はしていない。これはstring.hがすでに存在しているので間違えないよう区別するためにつけた名前。いい名前が浮かばなかった

StringMng.h

#ifndef DEF_STRINGMNG_H

#define DEF_STRINGMNG_H

void StringMng_Initialize();
void StringMng_Update();
void StringMng_Draw();
void StringMng_Display(const int x, const int y, const unsigned int Color, const char* FormatString, const int FontNumber);
void StringMng_Finalize();

#endif

StringMng.cpp

#include "DxLib.h"
#include "StringMng.h"
#include "Define.h"

static int Font_MSPGothic, Font_MSPMintyou; //フォントハンドル

//初期化
void StringMng_Initialize() {
	Font_MSPGothic = CreateFontToHandle("MS Pゴシック", -1, -1, DX_FONTTYPE_NORMAL); //MSPゴシックのデフォルトサイズ・太さのフォントを作成
	Font_MSPMintyou = CreateFontToHandle("MS P明朝", -1, -1, DX_FONTTYPE_NORMAL); //MSP明朝クのデフォルトサイズ・太さのフォントを作成
}

//更新
void StringMng_Update() {

}

//描画
void StringMng_Draw() {

}

//他のファイルから文字を表示する用関数
//x, yは表示座標、Colorは文字の色、FormatStringは表示する文字、FontNumberはフォントハンドル
void StringMng_Display(const int x, const int y, const unsigned int Color, const char *FormatString, const int FontNumber) {
	switch (FontNumber) {
	case MSPGothic:
		DrawStringToHandle(x, y, FormatString, Color, Font_MSPGothic);
		break;
	case MSPMintyou:
		DrawStringToHandle(x, y, FormatString, Color, Font_MSPMintyou);
		break;
	default:
		DrawFormatString(x, y, Color, FormatString);
		break;
	}
}

//終了処理
void StringMng_Finalize() {
	DeleteFontToHandle(Font_MSPGothic);
	DeleteFontToHandle(Font_MSPMintyou);
}

String_Initialize() でMSPゴシックとMSP明朝のフォントハンドルを作成。文字を表示するのはString_Draw()ではなくString_Display()で行っている(他のファイルの***_Draw()と機能を統一するため)。FontNumberの値で使用するフォントを切り替えている。

続けてDefine.hにフォント関連の列挙体を追加。先ほどのString_Display()の引数FontNumberに該当するもの。

Define.h

//Define.hに以下を追

//フォントの列挙体
typedef enum {
	MSPGothic, //MSPゴシック
	MSPMintyou //MSP明朝
}Font_Type;

extern Font_Type font_type;

実際のフォントの読み込みのタイミングはゲーム起動直後にやる必要があるので System.cpp のSystem_Initialize() でフォントの読み込みを行う。そしてSystem_Finalize()にフォントの終了処理も追加する

System.cpp

//以下をインクルードに追加
#include "StringMng.h"

//中略

//DXライブラリなどの初期化
bool System_Intialize() {
    //中略

    //フォントの初期化
    StringMng_Initialize();

    return true;
}

//中略

//終了処理
void System_Finalize() {
    //中略

    //フォントの終了処理
    StringMng_Finalize();

    //中略
}

あとは文字を表示したい部分に StringMng_Display()関数を呼ぶ。StringMng.hとDefine.hをインクルードするのを忘れずに。

以下Menu.cppで文字表示を今回作成した関数に変更した例。

Menu.cpp

//以下をインクルードに追加
#include "StringMng.h"
#include "Define.h"

//中略

//描画
void Menu_Draw() {
    unsigned int Color;
    int y = GAME_Y;

    Color = GetColor(255, 255, 255);

    StringMng_Display(MENU_X, MENU_Y, Color, "メニュー画面です。", MSPMintyou);
    StringMng_Display(MENU_X, MENU_Y + 20, Color, "上下キーを押し、決定ボタンを押してください。", MSPMintyou);

    StringMng_Display(GAME_X, GAME_Y, Color, "ゲーム", MSPMintyou);
    StringMng_Display(GAME_X, CONFIG_Y, Color, "設定", MSPMintyou);

    //中略

    StringMng_Display(GAME_X - 30, y, Color, "■", MSPGothic);
}

//中略
\楽天ポイント4倍セール!/
楽天市場
\ポイント5%還元!/
Yahooショッピング

コメント

タイトルとURLをコピーしました