こんばんは。
現在DxLibを用いてゲーム制作をしています。
制作中とある処理を実装したところ、以下の現象が発生しましたので報告させていただきます。
処理内容:
描画したい文字列の横幅が定数MAX_WIDTHより大きい場合、DrawModiString関数でMAX_WIDTHの横幅まで文字列を圧縮して描画する。
そうでない場合、DrawString関数で描画する。
(今回はどちらともToHandle付きの物を使用)
現象:
DrawModiString関数において、アルファベット小文字のqやg、jなどの下にはみ出ている文字が、下にはみ出ている部分だけ描画されない。
この現象が発生するコード(テスト用で新たに作成):
#include "DxLib.h"
#define TEST_STR_NUM 2
#define TEST_MAX_WIDTH 500
#define TEST_STR_SIZE 48
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1)return 0;
SetDrawScreen(DX_SCREEN_BACK);
SetDrawMode(DX_DRAWMODE_BILINEAR); //念のため見やすく
int fontHandle = 0;
fontHandle = CreateFontToHandle("Meiryo UI", TEST_STR_SIZE, 1, DX_FONTTYPE_ANTIALIASING); //フォントは適当
const char* testStr = "これがQの小文字→q g←これがGの小文字";
int strWidth = 0;
strWidth = GetDrawStringWidthToHandle(testStr, -1, fontHandle); //負の値を渡して文字列全体の長さを取得
while (ProcessMessage() == 0) {
ClearDrawScreen();
if (TEST_MAX_WIDTH < strWidth) {
//横幅が定数より大きい場合圧縮して描画(白文字)
//縦幅はフォントサイズとほぼ同じなので、TEST_STR_SIZEを指定
DrawModiStringToHandle(0, 0, TEST_MAX_WIDTH, 0, TEST_MAX_WIDTH, TEST_STR_SIZE, 0, TEST_STR_SIZE, GetColor(255, 255, 255), fontHandle, GetColor(128, 128, 128), 0, testStr);
}
else {
//横幅が定数以下の場合は普通に描画(水色文字)
DrawStringToHandle(0, 0, testStr, GetColor(128, 255, 255), fontHandle);
}
ScreenFlip();
}
DeleteFontToHandle(fontHandle);
DxLib_End();
return 0;
}
C言語質問掲示板の方で質問しましたが、ソースコード単体では問題を解決できないとの結論に至り、
あちらの掲示板の回答者から「こっちの掲示板に行った方がいいよ」と案内されました。
(マルチポストに該当しそうですが、こちらで報告させていただきます。なお、あちらでは解決とさせていただきました。)
私が間違っているところがあるかもしれませんが、よろしくお願いします。