*** 공부 방법 ***
1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처
hyrule.tistory.com
- 지난번에 Save & Load 기능의 대부분은 구현했었다.
- 이제 직접 저장, 불러오기를 반복하면서 문제가 생기는 부분을 수정해 줄 차례이다.
- 타일맵을 하나 생성해서 대충 편집한 다음 타일맵을 저장하고, 다시 불러오기를 해보았다.
< 첫 번째 오류 >
- Scene에 nullptr이 들어가있다.
- 이전 호출 스택을 확인해보니,
- m_Scene이 없다.
- 다음 호출 스택에서 문제를 발견했다.
Tile이 새로 동적할당 되었는데, 타일맵주소와 씬 주소가 등록되지 않았었다. 이 주소를 등록해 준다.
< 두 번째 오류 >
- Render 여부와 충돌 여부는 로딩이 되는데, 가장 중요한 텍스처가 로드되지 않았다.
- 원인은 CTexture의 저장 과정에 있었다.
- 저장할 때, 이미지 정보를 담아두는 구조체인 ImageInfo를 통으로 저장하는데,
- 이 정보를 받아서 로드해주는 메소드가 없었기 때문이다.
- 파일 로드 용으로 사용할 수 있는 다음의 메소드들을 추가해 주었다.
private:
//파일로부터 로드할 때 사용하는 메소드.
//이미지파일 1개
bool LoadTexture(ImageInfo* Info, const TCHAR* FileName,
const std::string& PathName = TEXTURE_PATH);
bool LoadTextureFullPath(ImageInfo* Info, const TCHAR* FullPath);
//이미지파일 여러개
bool LoadTexture(std::vector<ImageInfo*>* vecInfo, const std::vector<std::wstring>& vecFileName,
const std::string& PathName = TEXTURE_PATH);
bool LoadTextureFullPath(std::vector<ImageInfo*>* vecInfo, const std::vector<std::wstring>& vecFullPath);
- 통짜로 저장했던 ImageInfo 구조체에 대한 정보를 받아서 파일을 로드한다.
CRef::Load(File);
fread(&m_TextureType, sizeof(ETextureType), 1, File);
int Count = 0;
fread(&Count, sizeof(int), 1, File);
for (int i = 0; i < Count; ++i)
{
ImageInfo* Info = new ImageInfo;
m_vecImageInfo.push_back(Info);
fread(&Info->ColorKeyEnable, sizeof(bool), 1, File);
fread(&Info->ColorKey, sizeof(COLORREF), 1, File);
fread(&Info->FileName, sizeof(TCHAR), MAX_PATH, File);
fread(&Info->FullPath, sizeof(TCHAR), MAX_PATH, File);
int Length = 0;
fread(&Length, sizeof(int), 1, File);
char PathName[256] = {};
fread(PathName, sizeof(char), Length, File);
Info->PathName = PathName;
}
//이미지 파일이 1장인 Sprite 형태일 떄
if (m_vecImageInfo.size() == 1)
{
//만약 이름이 존재하면 파일 이름을 사용.
if (lstrlen(m_vecImageInfo[0]->FileName) > 0)
LoadTexture(m_vecImageInfo[0], m_vecImageInfo[0]->FileName, m_vecImageInfo[0]->PathName);
else//만약 이름이 존재하지 않으면 저장되어 있는 FullPath를 사용하여 로드.
LoadTextureFullPath(m_vecImageInfo[0], m_vecImageInfo[0]->FullPath);
}
//이미지 파일이 여러장인 Frame 형태일 때
else
{
//마찬가지로 파일명이 존재할 때
if (lstrlen(m_vecImageInfo[0]->FileName) > 0)
{
//파일 이름을 저장할 벡터 생성
std::vector<std::tstring> vecFileName;
size_t Size = m_vecImageInfo.size();
for (size_t i = 0; i < Size; ++i)
{
//벡터에 파일명 각각 불러와서 저장
vecFileName.push_back(m_vecImageInfo[i]->FileName);
}
//LoadTexture 메소드에 경로를 인자로 넣고 호출하여 나머지 과정 완료.
LoadTexture(&m_vecImageInfo, vecFileName, m_vecImageInfo[0]->PathName);
}
else
{
std::vector<std::tstring> vecFileName;
size_t Size = m_vecImageInfo.size();
for (size_t i = 0; i < Size; ++i)
{
vecFileName.push_back(m_vecImageInfo[i]->FullPath);
}
LoadTextureFullPath(&m_vecImageInfo, vecFileName);
}
}
- 코드를 이렇게 바꿔 주었는데도, 타일 텍스처는 여전히 로드되지 않았다.
- 문제점은 이 부분이었다.
-- CRef에 저장된 m_Name을 통해 텍스처를 찾고 있었는데,
개별 텍스처를 Load할 때, CRef에 있는 m_Name을 설정해 주지 않아서 발생하는 문제였다.
-- 모든 텍스처 로드 함수에서 이름을 지정해 주도록 설정한다.
- 이제 텍스처는 로드가 되었는데, 우클릭 드래그로 카메라가 움직이지 않았다. 그래서 창에 현재 카메라의 위치를 표시해 보았다.
- 어떠한 원인으로 인해 카메라의 위치가 0, 0으로 고정되고 있다.
- 카메라의 아무 위치에 중단점을 잡아서, 현재 카메라 클래스의 설정값을 확인해보았더니 문제를 발견할 수 있었다.
카메라가 이동할 수 있는 최대 제한 범위를 설정해주는 WorldResolution이, 화면 사이즈만큼만으로 잡혀 있었던 것이 문제였다.
- 세이브 파일로 로드하는 과정에서, WorldResolution을 설정해 주는 과정이 빠져 있었다.
-- 해당 코드를 추가해 주었더니 세이브 파일을 통한 로딩 과정도 정상적으로 작동하는 것을 확인하였다.
- 일단 여기서 중간 저장
'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글
78. 바닥 충돌 체크 (0) | 2022.06.16 |
---|---|
77. 타일맵 에디터 8: Save & Load 3 (0) | 2022.06.15 |
75. 타일맵 에디터 6: 빈 타일, 배경화면 설정 (0) | 2022.06.14 |
74. 타일맵 에디터 5: Save & Load (0) | 2022.06.14 |
73. 타일맵 에디터 4: 기타 기능 추가. (0) | 2022.06.14 |