トップページ > 記事閲覧
ファイルにあるbmp画像を読み込む
名前:名無し 日時: 2023/07/18 16:15

ファイルにあるbmp画像を読み込む いろいろな記事を調べてファイルにある画像や音を読みこむ処理を作ることができたのですが、 画像の読み込み処理がうまくいきません。 音は問題なく読み込めていて、 画像はLoadStateNo == 2の段階から進まずに無限ループしてしまいます。 LoadGraph後にWaitKey()を追加して1秒程度待つことで無限ループせず処理を終えることができましたが、 DxLib終了後にエラーが発生します。 何が原因で画像の読み込みがうまくいかないのでしょうか? #include <stdio.h> #include "DxLib.h" int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(true);//フルスクリーン解除(ウィンドウ化) SetUseDirectInputFlag(TRUE);//キー入力状態の取得にDirectInputを使用 SetDoubleStartValidFlag(1);//多重起動を許可 if (DxLib_Init() < 0)return-1;;//初期化系 SetDrawScreen(DX_SCREEN_BACK);//裏画面描画 SetTransColor(0, 255, 0);//画像の緑を透過色に指定 //--変数定義と初期設定-- #define PI 3.14159265359//円周率 #define Null -16777216//ステコンパラメーターを変更しない時に代用する値 #define tempMax 99//一時変数の個数 int i, ii , iii, iiii//ループ系 , temp0[tempMax];//一時変数 ; for (i = ii = iii = iiii = 0; i < tempMax; i++) {//temp初期化 temp0[i] = 0; } -- 省略 -- //フォントサイズ,太さ,描画タイプ #define FontSize 12 #define FontThickness 2 #define FontType DX_FONTTYPE_NORMAL SetFontSize(FontSize);//文字サイズ指定 SetFontThickness(FontThickness);//文字の太さ指定 ChangeFontType(FontType);//文字描画タイプ指定 -- 省略 -- #define SpriteNumMax 1 struct {//--画像の基本情報-- int GraphHandle, Scale_X, Scale_Y; }Sprite[SpriteNumMax]; -- 省略 -- #define SoundNumMax 2 #define PlaySndNumMax 99 int SoundHandle[SoundNumMax]; -- 省略 -- //--ファイル読み込み処理-- FILEINFO FileInfo; DWORD_PTR FindHandle; char Path[256];//パス結合先 int LoadFile = 0, LoadStateNo = 0; while (LoadFile<2) {//ファイルの読み込み中にNowLoadingを表示 if (!LoadFile) {//画像ファイル読み込み if (!LoadStateNo) {//ファイルの検索開始,最初のファイルの情報を取得 FindHandle = FileRead_findFirst("sprite\\*.bmp", &FileInfo); if (FindHandle != (DWORD_PTR)-1) {//ファイルが見つかった場合 i = 0;//配列番号指定リセット LoadStateNo++;//次の工程へ } else {//ファイルが無ければ検索終了 FileRead_findClose(FindHandle);//検索ハンドルの後始末 LoadFile++; } } if (LoadStateNo == 1) { sprintf_s(Path, sizeof(Path), "sprite\\%s", FileInfo.Name);//ディレクトリパスとファイル名を結合 SetUseASyncLoadFlag(TRUE);//ファイル読み込みを非同期で行う Sprite[i].GraphHandle = LoadGraph(Path);//結合したパスを指定 //Sprite[i].GraphHandle = LoadGraph("sprite\\000_mouse_cursor.bmp");//結合したパスを指定 //WaitKey(); LoadStateNo++;//次の工程へ } if (LoadStateNo == 2 && CheckHandleASyncLoad(Sprite[i].GraphHandle) != TRUE) {//現在のファイル読み込みが終了した if (FileRead_findNext(FindHandle, &FileInfo) >= 0 && i < SpriteNumMax) {//次のファイルを検索 i++; LoadStateNo = 1; } else {//ファイル検索終了 FileRead_findClose(FindHandle);//検索ハンドルの後始末 LoadFile++; LoadStateNo = 0; } } } if (LoadFile==1) {//音ファイル読み込み if (!LoadStateNo) {//ファイルの検索開始,最初のファイルの情報を取得 FindHandle = FileRead_findFirst("sound\\*.wav", &FileInfo); if (FindHandle != (DWORD_PTR)-1) {//ファイルが見つかった場合 i = 0;//配列番号指定リセット LoadStateNo++;//次の工程へ } else {//ファイルが無ければ検索終了 FileRead_findClose(FindHandle);//検索ハンドルの後始末 LoadFile++; } } if (LoadStateNo == 1) { sprintf_s(Path, sizeof(Path), "sound\\%s", FileInfo.Name);//ディレクトリパスとファイル名を結合 SetUseASyncLoadFlag(TRUE);//ファイル読み込みを非同期で行う SoundHandle[i] = LoadSoundMem(Path, PlaySndNumMax);//結合したパスを指定 LoadStateNo++;//次の工程へ } if (LoadStateNo == 2 && CheckHandleASyncLoad(SoundHandle[i]) != TRUE) {//現在のファイル読み込みが終了した if (FileRead_findNext(FindHandle, &FileInfo) >= 0 && i < SoundNumMax) {//次のファイルを検索 i++; LoadStateNo = 1; } else {//ファイル検索終了 FileRead_findClose(FindHandle);//検索ハンドルの後始末 LoadFile++; LoadStateNo = 0; } } } ClearDrawScreen(); DrawFormatString(0, 0, -1, "NowLoading"); DrawFormatString(0, FontSize, -1, "LoadFile:%d,LoadStateNo:%d", LoadFile, LoadStateNo); DrawFormatString(0, FontSize*2, -1, "FilePath:%s,Handle[%d]", Path,i); ScreenFlip(); } //--ファイル読み込み処理ここまで-- for (i = 0; i < SpriteNumMax; i++) {//画像の読み込み後に基本情報を格納 GetGraphSize(Sprite[i].GraphHandle, &Sprite[i].Scale_X, &Sprite[i].Scale_Y);//画像サイズXY } //--メイン処理-- while (!ProcessMessage() * !System.ProgramEnd) {//ゲームメインループ ClearDrawScreen();//描画初期化 -- 省略 -- }//メイン処理終了 for (i = 0; i < SoundNumMax; i++)DeleteSoundMem(SoundHandle[i]);//音メモリ開放 InitGraph();//画像ファイルのメモリ開放 InitSoundMem();//音ファイルのメモリ開放 DxLib_End();//Dx_Lib終了 return 0; }//WINAPI
メンテ

Page: 1 |

Re: ファイルにあるbmp画像を読み込む ( No.1 )
名前:管理人 日時:2023/07/18 23:56

SetUseASyncLoadFlag( TRUE ); を使用して 非同期読み込みを行う場合は定期的に ProcessMessage() を実行する必要があります ( サウンドの読み込みではたまたま呼ばなくても大丈夫になっていますが… ) なので、 while (LoadFile<2) {//ファイルの読み込み中にNowLoadingを表示 ↑ こちらの行の直後に if( ProcessMessage() < 0 ) { break; } ↑ このような ProcessMessage() を呼ぶ行を追加すれば、無限ループしなくなりますので よろしければお試しください m(_ _)m
メンテ
Re: ファイルにあるbmp画像を読み込む ( No.2 )
名前:名無し 日時:2023/07/19 19:52

無事読み込むことができました。ありがとうございます。 動かしてみたのですが、Run-Time Check Failure #2... というスタック破壊?が起きてエラーになってしまっているようです。 Sprite[i].GraphHandle = LoadGraph(Path);//結合したパスを指定 上記の記述が原因のようで、Sprite[i]になっている箇所をSprite[0]にして再度試してみましたが、 今度は画像ファイルの2番目にある画像が使われるようになってしまいました。 i = 0;をしているので問題ないと思っていたのですが何か見落としがあるのでしょうか?
メンテ
Re: ファイルにあるbmp画像を読み込む ( No.3 )
名前:管理人 日時:2023/07/19 23:51

> i = 0;をしているので問題ないと思っていたのですが何か見落としがあるのでしょうか? こちらの部分で i++ をしていますので if (FileRead_findNext(FindHandle, &FileInfo) >= 0 && i < SpriteNumMax) {//次のファイルを検索 i++; LoadStateNo = 1; } spriteフォルダの中の bmpファイルが 1つ以上あった場合は Sprite[i].GraphHandle = LoadGraph(Path);//結合したパスを指定 こちらの i が 1 になります
メンテ
Re: ファイルにあるbmp画像を読み込む ( No.4 )
名前:名無し 日時:2023/07/20 00:39

てっきりif文のi < SpriteNumMaxで対策できていると思っていました... 無事に問題が解決しました。 ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存