게임 프레임워크에서는 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를 바꾸어 동일한 방식으로 진행한다.
'WinAPI' 카테고리의 다른 글
| [WinAPI] 게임 프레임워크 - 8. Animation (0) | 2022.02.03 |
|---|---|
| [WinAPI] 게임 프레임워크 - 7. Collision (0) | 2022.02.03 |
| [WinAPI] 게임 프레임워크 - 6. Render (0) | 2022.02.02 |
| [WinAPI] 게임 프레임워크 - 5. PathManager, 유니코드와 멀티바이트 (0) | 2022.02.02 |
| [WinAPI] 게임 프레임워크 - 4. Input (0) | 2022.02.02 |