3 에서 설명한 SDL 라이브러리의 그림을 제어하는 부분을 수정하여

코드에서 재사용 할 수 있도록 싱글톤 클래스로 만든다.

 

 

<TextureManager.h>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#ifndef __TEXTUREMANAGER__
#define __TEXTUREMANAGER__
 
#include <string>
#include <SDL.h>
#include <map>
 
class TextureManager
{
public:
 
    ~TextureManager();
 
    // singleton 객체 가저오기
    static TextureManager* Instance();
 
    // 이미지 로드 함수
    bool Load(const std::string parFileName, const std::string parId, SDL_Renderer* parPRenderer);
 
    // 우리가 원하는 좌표와 크기로 이미지를 그린다.
    void Draw(const std::string parId, int parX, int parY, int parWidth, int parHeight, SDL_Renderer* parPRenderer,
        SDL_RendererFlip parFlip = SDL_FLIP_NONE);
    // 에니메이션을 위해서 프레임을 이용한다.
    void DrawFrame(const std::string parId, int parX, int parY, int parWidth, int parHeight, int parCurrentRow, int parCurrentFrame,
        SDL_Renderer* parPRenderer, SDL_RendererFlip parFlip = SDL_FLIP_NONE);
 
private:
    // 외부에서 생성하지 못하도록 private에 넣는다.
    TextureManager();
 
private:
 
    // static signleton 객체
    static TextureManager* s_pInstance;
 
    // 텍스처를 제어하기위해 Map을 사용한다.
    std::map<std::string, SDL_Texture*> m_textureMap;
 
};
 
 
#endif // !__TEXTUREMANAGER__
 
 
 
cs

 

<TextureManager.cpp>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "TextureManager.h"
#include "SDL_image.h"
 
TextureManager* TextureManager::s_pInstance = 0;
 
TextureManager::TextureManager():
    m_textureMap()
{
}
 
TextureManager::~TextureManager()
{
}
 
TextureManager* TextureManager::Instance()
{
    if (s_pInstance == nullptr)
    {
        s_pInstance = new TextureManager();
        return s_pInstance;
    }
    return s_pInstance;
}
 
bool TextureManager::Load(const std::string parFileName, const std::string parId, SDL_Renderer* parPRenderer)
{
    // 테스트를 위해서 임의로 init에서 그림을 생성하겠다.
    // surface 생성
    SDL_Surface* pTmpSurface = IMG_Load(parFileName.c_str());
 
    if (pTmpSurface == nullptr)
    {
        return false;
    }
 
    // surface를 이용해 texture 생성
    SDL_Texture* pTexture = SDL_CreateTextureFromSurface(parPRenderer, pTmpSurface);
    // 사용한 surface 해제
    SDL_FreeSurface(pTmpSurface);
 
    if (pTexture != nullptr)
    {
        // map에 저장
        m_textureMap[parId] = pTexture;
        return true;
    }
 
    // 여기에 도달한다면 문제가 있는거임.
    return false;
}
 
void TextureManager::Draw(const std::string parId, int parX, int parY, int parWidth, int parHeight, SDL_Renderer* parPRenderer, SDL_RendererFlip parFlip)
{
    SDL_Rect srcRect;
    SDL_Rect destRect;
 
    srcRect.x = 0;
    srcRect.y = 0;
    srcRect.w = destRect.w = parWidth;
    srcRect.h = destRect.h = parHeight;
    destRect.x = parX;
    destRect.y = parY;
    SDL_RenderCopyEx(parPRenderer, m_textureMap[parId], &srcRect, &destRect, 00, parFlip);
}
 
void TextureManager::DrawFrame(const std::string parId, int parX, int parY, int parWidth, int parHeight, int parCurrentRow, int parCurrentFrame,
    SDL_Renderer* parPRenderer, SDL_RendererFlip parFlip)
{
    SDL_Rect srcRect;
    SDL_Rect destRect;
    srcRect.x = parWidth * parCurrentFrame;
    srcRect.y = parHeight * (parCurrentRow - 1);
    srcRect.w = destRect.w = parWidth;
    srcRect.h = destRect.h = parHeight;
    destRect.x = parX;
    destRect.y = parY;
    SDL_RenderCopyEx(parPRenderer, m_textureMap[parId], &srcRect, &destRect, 00, parFlip);
}
 
cs

 

이제는, 이 클래스를 이용하여, 그림을 로드하고 드로우 할 수 있다.

 

추가로

Game class 에 Prepare 함수를 추가한다.

또한 지난 시간에 추가하였던 SDL_Rect 변수와 SDL_Texture, SDL_Renderer 변수를 제거한다.

( Init() 에서 추가하였던 부분도 삭제한다. )

 

Prepare()에 다음과 같이 추가한다.

 

Main 에서 Prepare()를 추가한다.

 

 

마지막으로 Render()에 draw 부분을 넣는다.

 

 

결과 화면은 다음과 같다.

 

 

출처: SDL Game Development  Shaun Ross Mitchell 

'C++ > SDL' 카테고리의 다른 글

3. SDL 에서 그림 그리기.  (0) 2021.03.01
2. SDL Init의 함수화 및 클래스화  (0) 2021.03.01
1. Hello SDL (SDL 초기화)  (0) 2021.03.01

+ Recent posts