본문 바로가기

WinAPI

[WinAPI] 게임 프레임워크 - 9. File Save, Load

게임 프레임워크에서는 Map을 Tile형으로 만들어 수정하고 저장, 불러올 수 있다.

 

if (KEYDOWN("Save"))
	{
		ShowCursor(TRUE);
		DialogBox(WINDOWINSTANCE, MAKEINTRESOURCE(IDD_DIALOG1),
			WINDOWHANDLE, CMapEditScene::DlgProc);

		ShowCursor(FALSE);

		//파일명 이용 저장
		char strFileName[MAX_PATH] = {};
		WideCharToMultiByte(CP_ACP, 0, m_strText, -1, strFileName,
			lstrlen(m_strText), 0, 0);

		m_pStage->SaveFromPath(strFileName);			
	}

 

MapEditScene::Input에서 Ctrl + S 를 누르면 실행되는 코드이다. KEYDOWN("SAVE")는 Ctrl + S와 매핑되어 있다. 먼저 DialogBox를 이용해서 파일명을 저장한다. 그리고 저장하기 위해 Stage의 SaveFromPath를 실행한다.

 

void CObj::SaveFromPath(const char* pFileName, const string& strPathKey)
{
	const char* pPath = GET_SINGLE(CPathManager)->FindPathMultiByte(DATA_PATH);

	string strFullPath;
	if (pPath)
		strFullPath = pPath;
	strFullPath += pFileName;

	SaveFromFullPath(strFullPath.c_str());

}

void CObj::SaveFromFullPath(const char* pFullPath)
{
	FILE* pFile = NULL;

	fopen_s(&pFile, pFullPath, "wb");

	if (pFile)
	{
		Save(pFile);
		fclose(pFile);
	}
}

 

데이터가 저장되는 경로 DATA_PATH에 파일을 저장한다. 실질적인 저장은 Save(pFile)에서 이루어진다.

 

void CObj::Save(FILE* pFile)
{
	//tag 정보 저장
	int iLength = m_strTag.length();
	fwrite(&iLength, 4, 1, pFile);

	//tag문자열 저장
	fwrite(m_strTag.c_str(), 1, iLength, pFile);
	//물리 사용 여부 저장
	fwrite(&m_blsPhysics, 1, 1, pFile);
	//위치 저장
	fwrite(&m_tPos, sizeof(m_tPos), 1, pFile);
	//크기 저장
	fwrite(&m_tSize, sizeof(m_tSize), 1, pFile);
	//ImageOffset 저장
	fwrite(&m_tImageOffset, sizeof(m_tImageOffset), 1, pFile);
	//Pivot 저장
	fwrite(&m_tPivot, sizeof(m_tPivot), 1, pFile);
	//Texture 저장
	bool bTexture = false;
	if (m_pTexture)
	{
		bTexture = true;
		fwrite(&bTexture, 1, 1, pFile);
		m_pTexture->Save(pFile);
	}
	else
	{
		fwrite(&bTexture, 1, 1,pFile);
	}

	iLength = m_ColliderList.size();

	fwrite(&iLength, 4, 1, pFile);
	list<CCollider*>::iterator iter;
	list<CCollider*>::iterator iterEnd = m_ColliderList.end();

	for (iter = m_ColliderList.begin(); iter != iterEnd; ++iter)
	{
		COLLIDER_TYPE eType= (*iter)->GetColliderType();
		fwrite(&eType, 4, 1, pFile);
		(*iter)->Save(pFile);
	}

	//애니메이션 저장

	bool bAnimation = false;
	if (m_pAnimation)
	{
		bAnimation = true;
		fwrite(&bAnimation, 1, 1, pFile);
		m_pAnimation->Save(pFile);
	}
	else
	{
		fwrite(&bAnimation, 1, 1, pFile);
	}
	
}

 

Object는 기본적으로 필요한 위치, 크기 등 기본 정보를 저장하고, ColliderList와 Animation에 대해서는 따로 내부 함수를 만들어 저장한다. Load 도 Save와 마찬가지로 fwrite와 fread를 바꾸어 동일한 방식으로 진행한다.