DXライブラリとC言語で3Dゲーム制作。今回はフォントや大きさを指定して文字を表示する方法について。
文字のフォントや大きさを変更したい
DXライブラリで文字を表示する場合、DrawString() または DrawFormatString() を使うのが一番簡単だがこれだとフォントや文字の大きさなどの指定ができない。テスト段階のときは問題ないと思うが表に公開するとなると見栄えはやはり気になるところ。
文字を表示する際フォントや大きさを指定したい場合は CreateFontToHandle() でフォントや大きさなどを指定する。アンチエイリアスもつけることが可能だが処理が重いようなので低スペックでも遊べるゲームを目指す場合は乱用厳禁。
| 宣言 | int CreateFontToHandle(char *FontName, int Size, int Thick, int FontType); | |
| 概要 | 新しいフォントデータを作成 | |
| 引数 | char *FontName | 作成するフォント名 |
| int Size | フォントのサイズ | |
| int Thick | フォントの太さ | |
| int FontType | フォントのタイプ | |
| 戻り値 | 0以上 | フォントハンドル |
| -1 | エラー発生 | |
| 指定するフォントタイプ | |
| -1 | デフォルトフォント |
| DX_FONTTYPE_NORMAL | ノーマルフォント |
| DX_FONTTYPE_EDGE | エッジつきフォント |
| DX_FONTTYPE_ANTIALIASING | アンチエイリアスフォント |
| DX_FONTTYPE_ANTIALIASING_4X4 | アンチエイリアスフォント(4×4サンプリング) |
| DX_FONTTYPE_ANTIALIASING_8X8 | アンチエイリアスフォント(8×8サンプリング) |
| DX_FONTTYPE_ANTIALIASING_EDGE_4X4 | アンチエイリアス&エッジ付きフォント(4×4サンプリング) |
| DX_FONTTYPE_ANTIALIASING_EDGE_8X8 | アンチエイリアス&エッジ付きフォント(8×8サンプリング) |
指定が終わったら DrawStringToHandle() で文字を表示する。
| 宣言 | int DrawStringToHandle(int x, int ,y char *String, unsigned int Color, int FontHandle, …); | |
| 概要 | 書式付きの文字列を描画する | |
| 引数 | int x, y | 描画する文字列の座標 |
| unsigned int Color | 描画する文字列の色 | |
| char *FormatString | 描画する文字列のアドレス | |
| … | 描画する文字列で使う引数 | |
| 戻り値 | 0 | 成功 |
| -1 | エラー発生 | |
不要になったフォントハンドルは DeleteFontToHandle() で削除する。
| 宣言 | int DeleteFontToHandle( int FontHandle); | |
| 概要 | フォントデータを削除する | |
| 引数 | int FontHandle | 削除するフォントデータ |
| 戻り値 | 0 | 成功 |
| -1 | エラー発生 | |
使用できるフォントについて
使用できるフォントだがPC内に入ってるフォントデータを使用できる。なので環境依存となるのでそこには注意。
PC内のフォントデータを確認する場合はまずエクスプローラーを開き、ローカルディスク(Cドライブ)→Windows→Fontsと進むとフォントデータを確認できる。


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

サンプルコード
それではサンプルコード。フォントデータの作成や文字列の表示をする StringMng.cpp/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
StrignMng.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_Display() も新たに作成。FontNumberの値で使用するフォントを切り替えている。
StringMng_Draw() で文字列を描画しないのは他のファイルの ***_Draw() と機能を統一するため。
続けて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);
switch (NowSelect) {//現在の選択状態に従って処理を分岐
case eMenu_Game://ゲーム選択中なら
y = GAME_Y; //ゲームの座標を格納
break;
case eMenu_Config://設定選択中なら
y = CONFIG_Y; //設定の座標を格納
break;
default:
break;
}
StringMng_Display(GAME_X - 30, y, Color, "■", MSPGothic);
}
//略

コメント