Win32 API/기초

Win32 API 기초 : Resource (1)

시플마 2024. 7. 13. 07:15

오브젝트를 단순히 원형이나 사각형이 아닌,

이미지를 통해 표현하려고 합니다.

 

이렇게 오브젝트의 겉모습 역할을 하는

이미지를 Texture라고 합니다.

 

이러한 Texture나 Sound 같은 프로그램에서

사용하는 외부 요소를 Resource라고 합니다.

 

Texture를 구현하기 위해 우선 Resource 필터를 만들고

그 안에 CRes 클래스를 만듭니다.

 

wstring형 멤버 m_strKey는

Texture의 키-값을 나타내는 문자열입니다.

 

해당 Resource만의 고유한 ID라고 생각하면 됩니다.

 

 

wstring형 멤버 m_strRelativePath는

상대 경로입니다.

 

만약 어떤 게임을 다운로드했습니다.

 

"Aatrox.ko_KR.wad.png"라는 

Texture가 존재한다고 해 봅시다.

 

해당 Texture가 있는 곳까지의

전체 경로를 '절대 경로',

게임 파일 내부에 존재하여

바뀌지 않는 경로를 

'상대 경로'라고 합니다.

 

위 경로에서 

"Riot Games"부터 "Aatrox.ko_KR.wad.png"까지를

상대 경로로 볼 수 있을 겁니다.

 

 

게임을 어디에 설치하느냐에 따라

"Riot Games"라는 폴더의 위치는 바뀔 수 있습니다.

 

C 드라이브가 아닌 D 드라이브에 설치하면

"D: ..."이라는 경로로 시작하겠죠.

 

하지만 "Riot Games"라는 폴더 아래의 경로는

일정할 겁니다. 이런 경로를 상대 경로라고 하는 것이죠.

 

 

9 ~ 10번째 줄에서 각 멤버의 값을 반환해 주는

Get 함수를 구현하였습니다.

 

반환형 앞에 const 키워드가 붙었으므로

반환받은 멤버의 값을 수정할 수 없을 것이고,

레퍼런스이므로 복사가 발생하지 않고

바로 참조하게 됩니다.

 

참조를 통해 복사 비용을 아끼고 실수로 

키-값과 상대 경로를 수정하지 않도록 

방지하는 것이죠.

 

 

12 ~ 13번째 줄에서 각 멤버의 값을 설정해 주는

Set 함수를 구현하였습니다.

 

인자가 const wstring형 레퍼런스이므로

인자로 받은 문자열을 직접 참조하지만,

값을 수정하지는 못할 겁니다.

 

마찬가지로 복사 비용을 아끼고

실수로 값을 수정하지 않도록 방지합니다.

 

 

 


 

 

 

Resource 필터 안에 Texture 필터를 만들고

CRes 클래스를 상속받은 CTexture 클래스를 만듭니다.

 

만약 별 텍스처를 가진 오브젝트가 있고

프로그램에 같은 텍스처를 가진 오브젝트가 3개 등장한다고 합시다.

 

그럼 굳이 세 개의 텍스처를 관리할 필요 없이 

한 개의 별 텍스처를 메모리에 올리고 

오브젝트들이 메모리에 올라간 텍스처를

가져다가 사용하면 되겠죠?

 

이것을 가능하게 하려면

DC와 BITMAP이 필요합니다.

 

메모리에 올린 별 텍스처를

CTexture 클래스의 멤버 m_hdc를 통해

m_hBit에 저장된 비트맵에 그립니다.

 

이때 비트맵의 크기는 코어 매니저에서

CreateCompatibleBitmap 함수를 통해서 만든,

memDC가 관리하는 비트맵과는 다르게

Texture 해상도와 같은 크기로 구성해야 합니다.

 

Texture 해상도와 같은 크기로 구성된 비트맵에

그려진 별 텍스처를 memDC를 통해 

메인 윈도우 해상도와 같은 크기를 가진 비트맵에

다시 그려주고, 이후 메인 윈도우의 DC를 통해

다 그려진 별 텍스처를 메인 윈도우에 그립니다.

 


강의 출처 : https://www.youtube.com/watch?v=uTfsJ9nqsMQ