いつもお世話になっております。
SetUseASyncLoadFlagで非同期読み込み中にMV1LoadModelしたモデルをモデルA、読み込み完了をGetASyncLoadNumで待った後にモデルAのハンドルをMV1DuplicateModelで複製したものをモデルBとします。
このとき、モデルBをMV1DeleteModelするとモデルAまで破棄されているような挙動をバージョン3.24fで確認しております。
(モデルBをMV1DeleteModel後、モデルAをMV1DrawModelするとエラー・再度モデルAのハンドルでMV1DuplicateModelをしても正しく動作しない等)
MV1DeleteModelのリファレンスに記載のサンプルプログラムを非同期読み込みにした版を下記に掲載いたします。
モデルhoge.mv1につきましては、手持ちのmv1いずれも同様の挙動でしたので、恐れ入りますがお手元のモデルにて代用いただけますでしょうか。
お手数をおかけしますが、ご確認いただけますと幸いです。
================================
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(1); // ウィンドウモードで起動
SetGraphMode(600, 400, 32); // ウィンドウサイズ
// DXライブラリの初期化
if (DxLib_Init() < 0)
{
// エラーが発生したら直ちに終了
return -1;
}
// 描画先を裏画面に変更
SetDrawScreen(DX_SCREEN_BACK);
// 非同期読み込み
SetUseASyncLoadFlag(true);
// 3Dモデルの読み込み
int ModelHandle = MV1LoadModel("hoge.mv1");
// 非同期読み込みが終わるまで待機
while (GetASyncLoadNum() > 0) ProcessMessage();
//while (CheckHandleASyncLoad(ModelHandle)) ProcessMessage();
CreateDirLightHandle(VGet(0, -1, 0));
SetCameraNearFar(1, 1000);
SetCameraPositionAndTarget_UpVecY(VGet(0, 0, -2), VGet(0, 0, 0));
// 何かボタンが押されるかウインドウが閉じられるまでループ
while (ProcessMessage() == 0 && CheckHitKeyAll() == 0)
{
// 画面をクリア
ClearDrawScreen();
// 読み込んだデータと同じデータを使用するモデルハンドルを作成する
int DupeModelHandle = MV1DuplicateModel(ModelHandle);
// 画面に映るランダムな位置に3Dモデルを移動
MV1SetPosition(DupeModelHandle, VGet(GetRand(2)-1, 0, 0));
// 3Dモデルの描画
MV1DrawModel(ModelHandle);
// 3Dモデルの描画
MV1DrawModel(DupeModelHandle);
// 3Dモデルの削除
MV1DeleteModel(DupeModelHandle);
// 裏画面の内容を表画面に反映
ScreenFlip();
}
// モデルハンドルの削除
MV1DeleteModel(ModelHandle);
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
================================