본문 바로가기

Win32 api

Win32 api 강의 54화.

- 타일맵 파일입출력 간단 구현.

// CScene_Tool.cpp
...
void CScene_Tool::SaveTileMap(const wstring& strRelativePath)
{
    wstring fullPath = CPathMgr::GetInstance()->GetContentPath();
    fullPath += strRelativePath;
    // FILE 은 C 표준 라이브러리의 파일 스트림 구조체.
    FILE* pFile = nullptr;
    _wfopen_s(&pFile, fullPath.c_str(), L"wb");
    if (pFile == nullptr)
    {
        // 파일 열기 실패
        return;
    }
    const vector<CObject*>& vecTile = GetObjByGroup(GROUP_TYPE::TILE);
    // 타일 개수 저장
    UINT tileCount = static_cast<UINT>(vecTile.size());
    fwrite(&tileCount, sizeof(UINT), 1, pFile);
    
    // 각 타일의 정보 저장
    for (CObject* obj : vecTile)
    {
        CTile* pTile = dynamic_cast<CTile*>(obj);
        if (pTile)
        {
            pTile->Save(pFile);
        }
    }
    fclose(pFile);
}

 

현재 타일, 타일맵 등의 체계를 잡아놓지 않아서, 간단하게 파일입출력 형태만 구현함.

참고로 입출력 모드에 b 는 바이너리를 뜻하며 바이트 그대로 읽고 쓰는 것을 말함. 텍스트가 아닌 데이터를 변환할 때 EOF 로 변환되는 등의 오류를 예방하고자 하는 목적.

 

파일입출력의 쓰기 과정의 단계를 크게 보면 단순하다.

  1. write 할 파일을 연다.
  2. 파일 스트림에 데이터를 원하는 포맷으로 저장한다.
  3. 파일을 닫는다.

열기도 마찬가지.

// CScene.cpp
...
void CScene::LoadTileMap(const wstring& strRelativePath)
{
    wstring fullPath = CPathMgr::GetInstance()->GetContentPath();
    fullPath += strRelativePath;
    // FILE 은 C 표준 라이브러리의 파일 스트림 구조체.
    FILE* pFile = nullptr;
    _wfopen_s(&pFile, fullPath.c_str(), L"rb");
    if (pFile == nullptr)
    {
        // 파일 열기 실패
        return;
    }

    UINT tileCount = 0;
    fread(&tileCount, sizeof(UINT), 1, pFile);
    ClearGroupObjects(GROUP_TYPE::TILE);

    for (UINT i = 0; i < tileCount; ++i)
    {
        CTile* pTile = new CTile();
        pTile->Load(pFile);
        AddObject(pTile, GROUP_TYPE::TILE);
    }
    fclose(pFile);
}

 

중요한 것은 내가 저장할 오브젝트, 객체들에게 virtual 함수로 Save, Load 를 구현하고

해당 객체에 맞게 데이터 저장 포맷을 올바르게 정의하는 것일 듯.

 

지금 Tile 객체는 그냥 Vector2 위치만 저장하도록 구현함.

// CTile.cpp
...
void CTile::Save(FILE* pFile)
{
    Vector2 pos = GetPos();
    fwrite(&pos, sizeof(Vector2), 1, pFile);
}

void CTile::Load(FILE* pFile)
{
    Vector2 pos = {};
    fread(&pos, sizeof(Vector2), 1, pFile);
    CTexture* pTileTexture = CResourceMgr::GetInstance()->LoadTexture(L"Tileset", L"texture\\Tile\\Tileset_Spring.bmp");
    SetPos(pos);
    SetTexture(pTileTexture);
}

 

아무래도 로드하는 과정에 생성자 또는 복사 생성자와의 연계를 신경써야 할 듯.

'Win32 api' 카테고리의 다른 글

Win32 api 강의 57 - 58화.  (0) 2025.09.29
Win32 api 강의 55 - 56화.  (0) 2025.09.29
Win32 api 강의 53화.  (0) 2025.09.26
Win32 api 강의 52화.  (0) 2025.09.26
Win32 api 강의 51화.  (0) 2025.09.25