構成
No.1 目的
2Dゲームなら読み込みとか全然気にならないんですけど、3Dゲームの3Dモデルとかって読み込みに時間かかるんですよね。
で、それに対してロード画面というか非同期処理を施さないといわゆるフリーズした状態になっちゃうんです。たぶん。やったことないけど。
なので、ロード画面作ります。
タイトル通りDxLibの場合です。DxLibの非同期処理を用いたものでやります。
次の章でコードを載せていますが、正直言ってDxLibのリファレンス以上に特に弄る部分なんてないくらい単純です。
まぁやらないといけないこととしてはエラー時の対処ぐらいです。以下のコードでもやってませんね。書いてて気づきました。
No.2 cppのコード
ちょっとロードの部分は普通じゃないかもしれないけどそこは自由に。
#include "LoadDxLibThread.hpp"
/// ---------------------------------------------------------------------------------------
LoadDxLibThread::LoadDxLibThread(const int max, const std::vector<std::string> path, const std::vector<ELOADFILE> type, std::function<void(const int, const int, const int)> t_loadFunc)
{
std::vector<int>().swap(loadData);
std::vector<ELOADFILE>().swap(loadType);
num = 0;
end = false;
time = 0;
m_function = t_loadFunc;
loadData.resize(max);
loadType = type;
SetUseASyncLoadFlag(TRUE);
for (int i = 0; i < max; ++i)
{
switch (type.at(i))
{
// UI関係の画像のとき
case ELOADFILE::graph:
loadData.at(i) = LoadGraph(path.at(i).c_str());
break;
// 2D系SEのとき
case ELOADFILE::soundEffect:
loadData.at(i) = LoadSoundMem(path.at(i).c_str());
break;
// モデルデータのとき
case ELOADFILE::model:
loadData.at(i) = MV1LoadModel(path.at(i).c_str());
break;
// BGMのとき
case ELOADFILE::backGroundMusic:
SetCreateSoundDataType(DX_SOUNDDATATYPE_FILE);
loadData.at(i) = LoadSoundMem(path.at(i).c_str());
SetCreateSoundDataType(DX_SOUNDDATATYPE_MEMNOPRESS);
break;
// 3Dサウンドのとき
case ELOADFILE::sound3DEffect:
SetCreate3DSoundFlag(TRUE);
loadData.at(i) = LoadSoundMem(path.at(i).c_str());
SetCreate3DSoundFlag(FALSE);
break;
}
}
SetUseASyncLoadFlag(FALSE);
maxNum = GetASyncLoadNum();
}
/// ---------------------------------------------------------------------------------------
LoadDxLibThread::~LoadDxLibThread()
{
for (int i = 0; i < loadType.size(); ++i)
{
switch (loadType.at(i))
{
// UI関係の画像のとき
case ELOADFILE::graph:
DeleteGraph(loadData.at(i));
break;
// 2D系SEのとき
case ELOADFILE::soundEffect:
DeleteSoundMem(loadData.at(i));
break;
// モデルデータのとき
case ELOADFILE::model:
MV1DeleteModel(loadData.at(i));
break;
// BGMのとき
case ELOADFILE::backGroundMusic:
DeleteSoundMem(loadData.at(i));
break;
// 3Dサウンドのとき
case ELOADFILE::sound3DEffect:
DeleteSoundMem(loadData.at(i));
break;
default:
break;
}
}
std::vector<int>().swap(loadData);
std::vector<ELOADFILE>().swap(loadType);
}
/// ---------------------------------------------------------------------------------------
void LoadDxLibThread::Process()
{
m_function(time++, maxNum, maxNum - GetASyncLoadNum());
if (GetASyncLoadNum() == 0)
{
end = true;
}
}
/// ---------------------------------------------------------------------------------------
const std::vector<int> LoadThread::GetFile() const
{
return loadData;
}
/// ---------------------------------------------------------------------------------------
const bool LoadThread::GetEnd() const
{
return end;
}