トップページ > 記事閲覧
txtファイルを読み込み一文字ずつ描画
名前:マドハヴァディティア 日時: 2021/12/15 10:38

https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4410 上記スレッドを参考に、txtファイルを読み込み一文字ずつ描画(ノベルゲームのような動作) をさせたいのですが、一行のみしか表示されません。 以下ソースコードです。 #include "DxLib.h" #include <math.h> #include <iostream> #include <fstream> #include <string> #include <codecvt> void talk2(int x, int y, char t[], int nCount) { int n = nCount / 15; int color = DxLib::GetColor(255, 255, 255); for (int i = 0; i < n + 1 && t[i] != '\0'; i++) { int Size = DxLib::GetCharBytes(DX_CHARCODEFORMAT_SHIFTJIS, t + i); if (Size == 1) { DxLib::DrawFormatString(x, y, color, "%c", t[i]); x += 9; } else { DxLib::DrawFormatString(x, y, color, "%c%c", t[i], t[i + 1]); x += 17; i++; n++; } } } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(TRUE); SetGraphMode(800, 600, 32); if (DxLib::DxLib_Init() == -1) return -1; DxLib::SetDrawScreen(DX_SCREEN_BACK); int FileHandle; char text[256]; int count = 0; int draw_x = 10; //文字の座標 int draw_y = 10; // test.cpp ファイルを開く FileHandle = FileRead_open("file.txt"); while (FileRead_eof(FileHandle) == 0) { FileRead_gets(text, sizeof(text), FileHandle); while (!DxLib::ProcessMessage()) { DxLib::ClearDrawScreen(); talk2(draw_x, draw_y, text, count); DxLib::ScreenFlip(); if (++count > (50 + 3) * 30) count = 0; } draw_y += 20; } return DxLib::DxLib_End(); // ファイルを閉じる FileRead_close(FileHandle); } 何日か悩んだのですが思いつかなかったため、どなたか回答していただけると助かります。
メンテ

Page: 1 |

Re: txtファイルを読み込み一文字ずつ描画 ( No.1 )
名前:管理人 日時:2021/12/15 23:31

> while (!DxLib::ProcessMessage()) { > DxLib::ClearDrawScreen(); > talk2(draw_x, draw_y, text, count); > DxLib::ScreenFlip(); > if (++count > (50 + 3) * 30) count = 0; > } こちらが一行を表示するプログラムとなっていますが、行の終端まで表示しても whileループから抜けて次の行に進むようなプログラムになっていません 行の終端まで表示が終わったら while ループから抜けるようなプログラムに 変更すると、二行目以降も表示されるようになります
メンテ
Re: txtファイルを読み込み一文字ずつ描画 ( No.2 )
名前:マドハヴァディティア 日時:2021/12/16 12:19

管理人さんご回答ありがとうございます。 その流れは理解していたのですが、ループを抜ける方法が思いつきませんでした。 言葉足らずで申し訳ありません。 その方法を教えていただけると助かります。 追記 if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) { break; }などでループを抜ける方法を 試してみたのですが、2行目から全て高速で表示され落ちてしまいます。
メンテ
Re: txtファイルを読み込み一文字ずつ描画 ( No.3 )
名前:管理人 日時:2021/12/17 02:20

> その流れは理解していたのですが、ループを抜ける方法が思いつきませんでした。 行の終端まで表示が終わっているかを判定して、行の終端まで表示が終わっていたら break でループを抜けるようにすると二行目以降も表示されるようになります あと、件のスレッドのプログラムでは1行だけ表示するプログラムですが、 『DXライブラリ サンプルプログラム』のページに複数行表示するサンプルプログラムがありますので、 よろしければこちらを参考にされてみてください m(_ _)m <DXライブラリ サンプルプログラム> https://dxlib.xsrv.jp/dxprogram.html ↑ こちらのページの 『6.サウンドノベル風文字列描画基本』と 『20.サウンドノベル風文字列描画、テキストバッファ使用バージョン』 が1文字づつ複数行表示するサンプルプログラムとなっています
メンテ
Re: txtファイルを読み込み一文字ずつ描画 ( No.4 )
名前:マドハヴァディティア 日時:2021/12/17 10:33

上記スレッドを参考になんとか作ろうとしていたのですが 『20.サウンドノベル風文字列描画、テキストバッファ使用バージョン』を参考に作成にしたら すんなり解決致しました!ありがとうございます。 DXライブラリのサンプルプログラムページも何度も閲覧していたのですが完全に見落としていました。 一応最初のプログラムも今後のために解決したいのですが、 行の終端ということは、talk2でt[i]が\0になったらということで正しいでしょうか? talk2でt[i]が\0になったら終了フラグを立てて while (!DxLib::ProcessMessage()) のループの最後に終了フラグが立っていたら breakするという方法も試していたのですが一行しか表示されずにいました。
メンテ
Re: txtファイルを読み込み一文字ずつ描画 ( No.5 )
名前:管理人 日時:2021/12/18 14:58

問題が解決したようで何よりです > 一応最初のプログラムも今後のために解決したいのですが、 > 行の終端ということは、talk2でt[i]が\0になったらということで正しいでしょうか? はい、その通りです > talk2でt[i]が\0になったら終了フラグを立てて > while (!DxLib::ProcessMessage()) のループの最後に終了フラグが立っていたら > breakするという方法も試していたのですが一行しか表示されずにいました。 私もフラグを立てて二行目以降が表示されるようにしてみました 確かに二行目以降が表示されるようになったのですが、二行目が表示されているときは 一行目が表示されず、三行目が表示されているときは三行目以外表示されない、 という状態になりました #include "DxLib.h" #include <math.h> #include <iostream> #include <fstream> #include <string> #include <codecvt> bool flag; void talk2(int x, int y, char t[], int nCount) { int n = nCount / 15; int color = DxLib::GetColor(255, 255, 255); for (int i = 0; i < n + 1; i++) { if(t[i] == '\0') { flag = true; break; } int Size = DxLib::GetCharBytes(DX_CHARCODEFORMAT_SHIFTJIS, t + i); if (Size == 1) { DxLib::DrawFormatString(x, y, color, "%c", t[i]); x += 9; } else { DxLib::DrawFormatString(x, y, color, "%c%c", t[i], t[i + 1]); x += 17; i++; n++; } } } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(TRUE); SetGraphMode(800, 600, 32); if (DxLib::DxLib_Init() == -1) return -1; DxLib::SetDrawScreen(DX_SCREEN_BACK); int FileHandle; char text[256]; int count = 0; int draw_x = 10; //文字の座標 int draw_y = 10; // test.cpp ファイルを開く FileHandle = FileRead_open("D:\\Yam\\UserProgram\\マドハヴァディティアさん\\20211215\\file.txt"); while (FileRead_eof(FileHandle) == 0) { FileRead_gets(text, sizeof(text), FileHandle); flag = false; count = 0; while (!DxLib::ProcessMessage() && flag==false) { DxLib::ClearDrawScreen(); talk2(draw_x, draw_y, text, count); DxLib::ScreenFlip(); ++count; } draw_y += 20; } return DxLib::DxLib_End(); // ファイルを閉じる FileRead_close(FileHandle); } 二行目以降が表示された際にそれ以前の行も表示されるようにするには、 表示する行を都度 FileRead_gets で読み込むのではなく、表示処理が開始される前に 全ての行を FileRead_gets で読み込んでおいて、描画処理では表示する行数分だけ ループする( 二行目を表示中は一行目と二行目を表示、三行目を表示中は一行目と二行目も表示 )、 というような作りに大きく書き換える必要がありそうです
メンテ
Re: txtファイルを読み込み一文字ずつ描画 ( No.6 )
名前:マドハヴァディティア(解決) 日時:2021/12/21 09:59

何度も回答していただきありがとうございます。 表示する行を都度 FileRead_gets で読み込むという考えしかなかったため そちらの方法を参考に解決したいと思います。 ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存