*** 공부 방법 ***
1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처
hyrule.tistory.com
[ 다이얼로그 ]
- Save 버튼, Load 버튼을 만들어준다.
class CSceneEditDlg
< Save(), Load() >
- 세이브 & 로드 버튼을 눌렀을 때 작동할 함수를 만들어주고,
WinProc() 함수에서 버튼을 눌렀을 때 이 함수가 호출되도록 설정해 준다.
< Save() >
- 가장 먼저 CSceneEdit이 타일맵을 생성해서 들고있는지부터 확인한다.
- LoadTexture() 메소드의 코드와 비슷하므로, 일단 복사해 온다.
- OpenFile 구조체의 설정에서, 열 파일 확장자를 새 형식으로 지정해 준다.(TileMapFile\0*.tm 같은 걸로)
- GetOpenFileName() 함수 대신, GetSaveFileName() 함수를 사용하면 '저장하기' 창이 열린다.
-파일 이름을 자를 필요 없이 저장하기 창에서 받아온 경로를 멀티바이트로 바꿔서 들고있는다.
- 저장할 대상은 CTileMap 안의 데이터이다
-- m_Scene->GetTileMap()->Save(FullPath);
class CRef;
class CGameObject;
< void SaveFullPath(const TCHAR* FullPath), void LoadFullPath(const TCHAR* FullPath) >
< virtual void Save(FILE* File), virtual void Load(FILE* File) >
- CGameObject에 저장하는 메소드를 만든다.
- 저장이 필요한 게임오브젝트에 저장 메소드를 재정해서 구현해놓으면 저장할 수 있다.
- 아래의 Save와 Load 메소드는 상속받은 클래스에서 재정의하여 사용할 것이다.
< SaveFullPath(const TCHAR* FullPath) >
- { FILE* File } 지역변수를 생성하여 nullptr로 초기화
- 받아온 FullPath를 넣어 fopen_s() 함수 호출, 파일 오픈 방식은 "wb"(이진수 쓰기 모드)
- File에 주소가 할당되지 않았을 경우 return
- 이 단계에서 위에서 선언한 가상함수 Save()를 호출하여 재정의된 저장 시퀀스 실행
- 저장이 다 되었으면 fclose()를 통해서 파일 수정 종료
< LoadFullPath(const TCHAR* FullPath) >
- 위의 코드를 긁어와서 Save->Load로 변경
- 파일 오픈 방식 "wb" -> "rb"
< Save(FILE* File) >
- 이제 fwrite 노가다를 통해 각 게임오브젝트가 들고있는 변수들을 fwrite를 통해 저장해주면 된다.
-- 저장해야 할 변수들과, 저장하지 않아도 되거나 하면 안되는 변수들을 구분하는 것이 중요하다.
---ex) CRef를 저장할 때, 참조 카운트는 어차피 로드 과정에서 전부 계산되므로 저장할 필요가 없다.
- 자신의 부모 클래스가 있다면, 부모 클래스의 Save() 메소드도 호출해서 부모 클래스의 변수들도 반드시 저장해야 한다.
- 길이가 있는 문자열 같은 경우, 해당 문자열의 길이도 같이 저장해주어야 한다.
< Load(FILE* File) >
- Save의 코드를 긁어와서, fread로 바꿔 주면 된다. 저장된 순서대로 다시 읽어오면 된다.
- 밑의 예시를 보면, 저장한 순서 그대로 다시 읽어오는 것을 확인할 수 있다.
-- CTile의 Save, Load 코드이다.
void CTile::Save(FILE* File)
{
fwrite(&m_Option, sizeof(ETile_Option), 1, File);
fwrite(&m_Pos, sizeof(Vector2), 1, File);
fwrite(&m_Size, sizeof(Vector2), 1, File);
fwrite(&m_IndexX, sizeof(int), 1, File);
fwrite(&m_IndexY, sizeof(int), 1, File);
fwrite(&m_Index, sizeof(int), 1, File);
fwrite(&m_TileFrame, sizeof(int), 1, File);
fwrite(&m_StartFrame, sizeof(Vector2), 1, File);
fwrite(&m_EndFrame, sizeof(Vector2), 1, File);
bool Texture = false;
if (m_Texture)
Texture = true;
fwrite(&Texture, sizeof(bool), 1, File);
if (m_Texture)
m_Texture->Save(File);
}
void CTile::Load(FILE* File)
{
fread(&m_Option, sizeof(ETile_Option), 1, File);
fread(&m_Pos, sizeof(Vector2), 1, File);
fread(&m_Size, sizeof(Vector2), 1, File);
fread(&m_IndexX, sizeof(int), 1, File);
fread(&m_IndexY, sizeof(int), 1, File);
fread(&m_Index, sizeof(int), 1, File);
fread(&m_TileFrame, sizeof(int), 1, File);
fread(&m_StartFrame, sizeof(Vector2), 1, File);
fread(&m_EndFrame, sizeof(Vector2), 1, File);
bool Texture = false;
fread(&Texture, sizeof(bool), 1, File);
if (Texture)
m_Texture = m_Scene->GetSceneResource()->LoadTexture(File);
}
class CSceneEdit;
< LoadTileMap(FullPath) >
- 타일맵이 없으면, 새로 타일맵을 동적할당하고, CTileMap 안의 LoadFullPath() 메소드를 호출한다.
class CTexture
- 텍스처의 경우 어떤 텍스처를 로드했는지 알기 위해서는 경로가 필요하므로,
텍스처의 정보를 담고 있는 ImageInfo 구조체에 경로를 저장하기 위한 문자열 변수 3개를 추가해 준다.
{ TCHAR FileName[MAX_PATH] }
{ TCHAR FullPath[MAX_PATH] }
{ std::string PathName; }
< LoadTexture() >
- return 문에서 LoadTextureFullPath(FullPath)를 하던 것을
bool Result = LoadTextureFullPath(FullPath)로 바꿔 주고, Result를 return하도록 바꿔 준다.
- return 하기 전에, Result에 True가 반환되었으면 ImageInfo() 구조체의 FileName에 파일 이름을 저장한다.
- Result에 true가 반환되었으면 m_vecImagInfo의 맨 뒤에 방금 추가되었을 것이므로 m_vecImageInfo.back()에 FileName을 저장해 준다.
-- 마찬가지로 PathName도 저장해 준다.
< LoadTexture() > 한번에 여러장을 로드하는 오버로드 함수도 마찬가지로 추가해준다.
< void Save(FILE* File) >
- 텍스처 관련 정보를 저장하는 메소드.
- 자신의 부모 클래스인 CRef의 Save()를 먼저 호출하고, 자신의 정보를 저장한다.
< void Load(FILE* File) >
class CTextureManager
< CTexture* LoadTexture(FILE* File) >
- 위에서 저장한 정보를 가지고 와서 텍스처를 로드하는 메소드
- 일단 새 텍스처를 동적 할당한다.
- 인자로 들어온 File을 그대로 CTexture::Load(FILE* File) 메소드에 집어넣어서 로딩을 시도한다.
- 로드되고 나서 만약 같은 이름으로 로드된 텍스처가 있을 경우 도로 삭제하고
기존에 같은 이름으로 존재하던 텍스처 주소를 리턴한다.
* CResource에서도 같은 메소드를 만들고, LoadTexture에 전달해주는 메소드를 만든다.
CSceneResource에도 같은 메소드를 만들되, 자신의 m_vecTexture에 추가되어 있는지 확인하는 과정을 추가해야 한다.
class CTileMap;
< Save(), Load() >
- 마찬가지로 여기에도 Save와 Load 함수를 재정의해 준다.
- StartX/Y, EndX/Y는 타일맵 구성시 자동으로 계산되므로 저장할 필요가 없다.
일단 중간 저장(기능이 완전하게 구현된 것이 아니라 테스트 불가능)
빌드는 성공
'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글
76. 타일맵 에디터 7: Save & Load 2 - 문제 해결 (0) | 2022.06.15 |
---|---|
75. 타일맵 에디터 6: 빈 타일, 배경화면 설정 (0) | 2022.06.14 |
73. 타일맵 에디터 4: 기타 기능 추가. (0) | 2022.06.14 |
72. 타일맵 에디터 3: 스프라이트 텍스처의 프레임 좌표 지정 (0) | 2022.06.14 |
71. 타일맵 에디터2: 타일에 텍스처 지정 (0) | 2022.06.13 |