トップページ > 記事閲覧
DrawModiStringToHandleで文字が描画出来ない
名前:田中 日時: 2022/06/15 01:22

いつもお世話になっております。 DrawModiStringToHandleで[あ]を481回並べた文字列は問題なく描画されましたが、482回並べて描画したところ表示されません。 DrawStringToHandleはちゃんと描画されるのを確認しました。 #include "DxLib.h" #include <string> using namespace std; void Draw(int x, int y, int handle, string str, int width = 0) { if(width == 0) width = GetDrawStringWidthToHandle(str.c_str(), str.size(), handle); DrawBox(x, y, x + width / 2, y + 30, GetColor(0, 255, 0), TRUE); DrawModiStringToHandle(x, y, x + width, y, x + width, y + 30, x, y + 30, GetColor(255, 0, 0), handle, GetColor(255, 255, 255), FALSE, str.c_str()); } int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR, _In_ int) { // logを生成しない SetOutApplicationLogValidFlag(false); // ウィンドウモード ChangeWindowMode(true); if (DxLib_Init() == -1) return -1; string tmp1 = "", tmp2 = "", str = "あ"; int fontHandle = CreateFontToHandle(NULL, 30, 0, DX_FONTTYPE_ANTIALIASING_EDGE_8X8, -1, 2); //int fontHandle = CreateFontToHandle(NULL, 30, 0, DX_FONTTYPE_NORMAL, -1, 2); // 裏描画 SetDrawScreen(DX_SCREEN_BACK); // ここを481回ループさせると表示されて、482回ループさせると表示が消える for (int i = 0; i < 482; i++) { tmp1 += str; tmp2 += str; } while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) { Draw(0, 0, fontHandle, tmp1); Draw(0, 50, fontHandle, tmp2); Draw(0, 100, fontHandle, tmp1, 600); Draw(0, 150, fontHandle, tmp2, 600); DrawStringToHandle(0, 200, tmp1.c_str(), GetColor(255, 0, 0), fontHandle, GetColor(255, 255, 255)); DrawStringToHandle(0, 250, tmp2.c_str(), GetColor(255, 0, 0), fontHandle, GetColor(255, 255, 255)); DrawFormatString(0, 300, GetColor(255, 0, 0), "%d", tmp1.compare(tmp2)); } DxLib_End(); return 0; } 原因がわからず、お手数ですがご確認いただけると幸いです。
メンテ

Page: 1 |

Re: DrawModiStringToHandleで文字が描画出来ない ( No.1 )
名前:管理人 日時:2022/06/15 01:38

DrawModiStringToHandle は、まず文字列を MakeScreen などで作成できる『描画対象にできる画像』に対して描画を行い、 それを DrawModiGraph で変形描画する、という手順を踏んでいるのですが 482文字の場合は横幅が 16388pixel と、現状の一般的なグラフィックカードで作成できる最大画像サイズ( 最大テクスチャサイズ ) である 16384pixel を超えてしまっているため、内部で実行されている MakeScreen が失敗して、結果 DrawModiString も失敗して 何も描画されない、という状態になっています 申し訳ありませんが、481文字以内に納めるようにしてください m(_ _;m ( 尚、文字サイズを小さくすればそれだけ 16834pixel 以内に入る文字数も多くなります )
メンテ
Re: DrawModiStringToHandleで文字が描画出来ない ( No.2 )
名前:田中 日時:2022/06/16 19:50

そうだったんですね...... 開発中のプログラムで、自分でMakeScreenで作成した『描画対象にできる画像』に文字を書いて、 DrawModiGraphで描画した時は問題なかったのですが、 DrawModiStringToHandleでは描画がおかしくなる現象にあいました。 なので、テストプログラムを組んで、検証してたら上記の現象を見つけたんですけど、 原因が違いそうですね.....(´;ω;`) これから先、DrawModiStringToHandleを変形後の座標を計算する処理に変更する予定はありますでしょうか?
メンテ
Re: DrawModiStringToHandleで文字が描画出来ない ( No.3 )
名前:管理人 日時:2022/06/18 02:49

> これから先、DrawModiStringToHandleを変形後の座標を計算する処理に変更する予定はありますでしょうか? すみません、内部の文字描画コード自体に変形描画機能を実装しようとすると結構な量のコードを追加しなければ ならないので今のところ予定はありません DrawModiStringToHandle を使用されるとのことですが、どのくらい自由な変形をされる感じでしょうか? SetTransformTo2D という関数を使用すると拡大・回転くらいでしたらかなり自由に行なえて 且つ DrawModiStringToHandle のような文字数制限はありません // SetTransformTo2D を使用して縦2倍に拡大と回転をする文字列を描画するプログラム #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { float Angle = 0.0f ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; SetFontSize( 32 ) ; ChangeFontType( DX_FONTTYPE_ANTIALIASING_4X4 ); // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; // 回転値を進める Angle += DX_PI / 60 ; // 縦2倍行列と回転行列と平行移動行列を掛け合わせたものを 2D 描画変形行列としてセット MATRIX Matrix ; Matrix = MGetScale( VGet( 1.0f, 2.0f, 1.0f ) ) ; Matrix = MMult( Matrix, MGetRotZ( Angle ) ) ; Matrix = MMult( Matrix, MGetTranslate( VGet( 320, 240, 0 ) ) ) ; SetTransformTo2D( &Matrix ) ; // 文字列を描画 DrawString( 0, 0, "テスト文字列", GetColor( 255,255,255 ) ) ; // 行列の設定を解除 ResetTransformTo2D() ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } こちらの SetTransformTo2D での代用は難しいでしょうか? ( もし難しいようでしたら DrawModiStringToHandle の文字数制限が無いような処理の実装を考えてみます )
メンテ

Page: 1 |

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

   クッキー保存