トップページ > 記事閲覧
DrawModiString関数で特定文字だけ正常に描画されない不具合
名前:32Ryo 日時: 2023/05/23 20:25

こんばんは。 現在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言語質問掲示板の方で質問しましたが、ソースコード単体では問題を解決できないとの結論に至り、 あちらの掲示板の回答者から「こっちの掲示板に行った方がいいよ」と案内されました。 (マルチポストに該当しそうですが、こちらで報告させていただきます。なお、あちらでは解決とさせていただきました。) 私が間違っているところがあるかもしれませんが、よろしくお願いします。
メンテ

Page: 1 |

Re: DrawModiString関数で特定文字だけ正常に描画されない不具合 ( No.1 )
名前:手提鞄あたッしュ 日時:2023/05/24 09:02

[香車]東上☆あらし☆海美「 C言語質問掲示板の方でのやりとりは、これみみ。 dixq.net/forum/viewtopic.php?f=3&t=21612&sid=47c38ee9daddfa3aa4d7a26c24666c32 画像管理のヘッダーファイルを作りたい - ミクプラ(ja) 」
メンテ
Re: DrawModiString関数で特定文字だけ正常に描画されない不具合 ( No.2 )
名前:管理人 日時:2023/05/25 01:46

ご報告ありがとうございます 手元でも g や j の下側が描画されない現象を確認しました 修正版をこちらにアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 因みに想定の幅より描画の横幅が大きくなってしまった場合に縮めて描画する対応方法では DrawModiString を使用するより DrawExtendString を使用したほうが綺麗に描画されますので、 よろしければ DrawExtendString の使用を検討してみてください m(_ _)m ( 載せていただいたプログラムの DrawModiStringToHandle の行を DrawExtendStringToHandle(0, 0, (double)TEST_MAX_WIDTH / strWidth, 1.0, testStr, GetColor(255, 255, 255), fontHandle, GetColor( 128, 128, 128)); としていただくと DrawExtendStringToHandle でも指定の描画幅に文字列を収めることができます ) > 手提鞄あたッしュさん 元スレッドのご案内ありがとうございます m(_ _)m ただ、載せていただいたリンクは 32Ryoさんのご質問ではないかもしれません 元スレッドはこちらでしょうか (・・ <【DxLib】DrawModiString系関数のバグ(?)> https://dixq.net/forum/viewtopic.php?f=3&t=21613
メンテ
Re: DrawModiString関数で特定文字だけ正常に描画されない不具合 ( No.3 )
名前:32Ryo(解決) 日時:2023/05/25 21:14

管理人さん ご返信ありがとうございます。 お忙しい中バグ報告に対応していただきありがとうございます。 元スレッドは管理人さんのスレッドで合っています。 > DrawModiString を使用するより DrawExtendString を使用したほうが綺麗に描画されますので、よろしければ DrawExtendString の使用を検討してみてください m(_ _)m DrawExtendStringという関数があることを初めて知りました。試してみたところ、DrawModiStringより綺麗に描画されたので、今度からこちらを使用してみたいと思います。 お忙しい中ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存