プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

【DxLib】3D作りたいしロード画面作りたいしなんなら非同期でやりたい

構成


No.1 目的
No.2 cppのコード







  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;
}