トップページ > 記事閲覧
MV1LoadModelFromMemについて
名前:Tir 日時: 2024/09/24 17:23

お世話になります。 MV1LoadModelFromMemを試そうと思い過去スレのサンプル(関数のセキュリティにより変更した部分もあります)を試したところ成功したのですが、 サンプルのファイル読み込みの部分をDXライブラリのファイル読み込み関数に置き換えたところエラーが発生してしまいます 何か問題があるのでしょうか? // ファイルを読み込む関数 int LoadFile(const TCHAR* FilePath, void** FileImageAddr, int* FileSize) { /*     //サンプルの読み込み処理・上手くいく FILE* fp; ファイルを開く fopen_s(&fp,FilePath, "rb"); // 失敗したら -1 を返す if (fp == NULL) return -1; // ファイルのサイズを取得 fseek(fp, 0L, SEEK_END); *FileSize = ftell(fp); fseek(fp, 0L, SEEK_SET); // メモリの確保 DxAllocとnew charどちらでも可 // *FileImageAddr = DxAlloc(*FileSize); *FileImageAddr = new char[*FileSize]; // ファイルの読み込み fread(*FileImageAddr, *FileSize, 1, fp); // ファイルを閉じる fclose(fp); */     //ファイル読み込みをDXライブラリのファイル読み込み関数に変更。上手くいかない int FileHandle; FileHandle = FileRead_open(FilePath); FileRead_seek(FileHandle,0, SEEK_END); *FileSize = FileRead_tell(FileHandle); FileRead_seek(FileHandle, 0, SEEK_SET); // メモリの確保 DxAllocとnew charどちらも失敗 //*FileImageAddr = DxAlloc(*FileSize); *FileImageAddr = new char[*FileSize]; FileRead_read(*FileImageAddr, *FileSize, FileHandle); FileRead_close(FileHandle); //成功なら 0 を返す return 0; } どちらにせよ失敗するので関係ないと思いますが DXライブラリのファイル読み込み関数に変更に変更した場合 メモリ確保をDxAlloc関数で行うかnewで行うかでエラー発生場所が異なります。
メンテ

Page: 1 |

Re: MV1LoadModelFromMemについて ( No.1 )
名前:管理人 日時:2024/09/25 00:42

過去スレのサンプルは MV1LoadModelFromMem の実行前に SetUseASyncLoadFlag( TRUE ); が実行され 非同期ロードがONとなっていますので、同期読み込みを前提とした LoadFile の中身を単純に FileRead_系の関数に置き換えると正常に動作しません ( FileRead_open や FileRead_read は非同期読み込みに対応した関数なので… ) 簡単な解決策としては FileRead_open の前に SetUseASyncLoadFlag( FALSE ); を記述することで エラーが発生しなくなります よろしければお試しください m(_ _)m
メンテ
Re: MV1LoadModelFromMemについて ( No.2 )
名前:Tir 日時:2024/09/25 01:16

SetUseASyncLoadFlag( FALSE );を試しても上手くいきませんでした。 それと過去スレのサンプルは MV1LoadModelFromMem の実行前に SetUseASyncLoadFlag( TRUE ); が実行されとありますが 参考にしたサンプルにSetUseASyncLoadFlag( TRUE );の記述は見当たりませんでした。 以下はSetUseASyncLoadFlag(FALSE);を試した全文になります #include "DxLib.h" #include <stdio.h> #include <malloc.h> // ファイルを読み込む関数 int LoadFile(const TCHAR* FilePath, void** FileImageAddr, int* FileSize) { // FILE* fp; //// ファイルを開く // fopen_s(&fp,FilePath, "rb"); // // 失敗したら -1 を返す // if (fp == NULL) return -1; // // ファイルのサイズを取得 // fseek(fp, 0L, SEEK_END); // *FileSize = ftell(fp); // fseek(fp, 0L, SEEK_SET); //// メモリの確保 //// *FileImageAddr = DxAlloc(*FileSize); // *FileImageAddr = new char[*FileSize]; // // ファイルの読み込み // fread(*FileImageAddr, *FileSize, 1, fp); // // ファイルを閉じる // fclose(fp); SetUseASyncLoadFlag(FALSE); int FileHandle; FileHandle = FileRead_open(FilePath); FileRead_seek(FileHandle,0, SEEK_END); *FileSize = FileRead_tell(FileHandle); FileRead_seek(FileHandle, 0, SEEK_SET); //*FileImageAddr = DxAlloc(*FileSize); *FileImageAddr = new char[*FileSize]; FileRead_read(*FileImageAddr, *FileSize, FileHandle); FileRead_close(FileHandle); //成功なら 0 を返す return 0; } // ファイル読み込み用コールバック関数 int FileReadFunc(const TCHAR* FilePath, void** FileImageAddr, int* FileSize, void* FileReadFuncData) { return LoadFile(FilePath, FileImageAddr, FileSize); } // ファイル解放用コールバック関数 int FileReleaseFunc(void* MemoryAddr, void* FileReadFuncData) { // 確保したメモリの解放 //DxFree(MemoryAddr); delete[] MemoryAddr; return 0; } // WinMain 関数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int ModelHandle; void* FileImage; int FileSize; ChangeWindowMode(TRUE); // DXライブラリの初期化 if (DxLib_Init() < 0) { // エラーが発生したら直ちに終了 return -1; } //MV1SetLoadModelTextureLoad(false); //SetUseASyncLoadFlag(FALSE); // 3Dモデルファイルをメモリ上に読み込み LoadFile("DxChara.x", &FileImage, &FileSize); // メモリ上に読み込んだ3Dモデルファイルから3Dモデルを作成 ModelHandle = MV1LoadModelFromMem(FileImage, FileSize, FileReadFunc, FileReleaseFunc, NULL); // 画面に映る位置に3Dモデルを移動 MV1SetPosition(ModelHandle, VGet(320.0f, -300.0f, 300.0f)); // 3Dモデルの描画 MV1DrawModel(ModelHandle); // キーの入力待ち WaitKey(); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }
メンテ
Re: MV1LoadModelFromMemについて ( No.3 )
名前:管理人 日時:2024/09/25 04:40

SetUseASyncLoadFlag は関係が無かったとのことで、失礼しました m(_ _;m プログラムを改めて拝見したところファイルオープンに失敗した場合の処理が書かれていないようです FileHandle = FileRead_open(FilePath); の次の行に if( FileHandle == 0 ) return -1; という記述を追加していただければエラーは発生しなくなると思いますので、 よろしければお試しください m(_ _)m
メンテ
Re: MV1LoadModelFromMemについて ( No.4 )
名前:Tir(解決) 日時:2024/09/25 17:43

無事に読み込むことが出来ました。 まさか読み込み失敗までが処理の一部とは思わず盲点でした。
メンテ

Page: 1 |

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

   クッキー保存