이젠, 우리는 저번시간에 배운 SDL 초기화를 각 함수로 나누고 클래스화 시킬 수 있다.

 

다음과 같이 Game Class를 만들 수 있다.

 

 

<Game.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
#ifndef __GAME__
#define __GAME__
#include <SDL.h>
 
class Game
{
public:
    Game();
    ~Game();
 
    // 전체 파라미터를 받아서 초기화, 마지막 파라미터는 SDL_CreateWindow()의 Flag이다.
    bool Init(const char* parTitle, int parXPos, int parYpos, int parWidth, int parHeight, int parFlags);
    // 마지막 파라미터를 전체화면을 나타내는 bool값으로 바꾼 Init function.
    bool Init(const char* parTitle, int parXPos, int parYpos, int parWidth, int parHeight, bool parFullscreen);
 
 
    void Render();
    void Update();
    void HandleEvents();
    void Clean();
 
 
    // a function to access the private running variable
    bool isRunning();
 
private:
 
    SDL_Window* m_pWindow;
    SDL_Renderer* m_pRenderer;
 
    bool m_bRunning;
};
 
#endif // !__GAME__
 
cs

<Game.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "Game.h"
#include <iostream>
 
// 생성자와 소멸자는 C++ 기초임으로 설명하지 않는다.
// Constructor
Game::Game()
{
}
// Destructor
Game::~Game()
{
}
 
bool Game::Init(const char* parTitle, int parXPos, int parYpos, int parWidth, int parHeight, int parFlags)
{
    // attempt to initialize SDL
    if (SDL_Init(SDL_INIT_EVERYTHING) == 0)
    {
        std::cout << "SDL init success\n";
        // init the window
        m_pWindow = SDL_CreateWindow(parTitle, parXPos, parYpos,
            parWidth, parHeight, parFlags);
        if (m_pWindow != 0// window init success
        {
            std::cout << "window creation success\n";
            m_pRenderer = SDL_CreateRenderer(m_pWindow, -10);
            if (m_pRenderer != 0// renderer init success
            {
                std::cout << "renderer creation success\n";
                // 파란색 화면.
                SDL_SetRenderDrawColor(m_pRenderer, 00255255);
            }
            else
            {
                std::cout << "renderer init fail\n";
                return false// renderer init fail
            }
        }
        else
        {
            std::cout << "window init fail\n";
            return false// window init fail
        }
    }
    else
    {
        std::cout << "SDL init fail\n";
        return false// SDL init fail
    }
 
    std::cout << "init success\n";
    m_bRunning = true// everything inited successfully, start the main loop
    return true;
}
 
bool Game::Init(const char* parTitle, int parXPos, int parYpos, int parWidth, int parHeight, bool parFullscreen)
{
    int flags = 0;
    if (parFullscreen)
    {
        flags = SDL_WINDOW_FULLSCREEN;
    }
 
    return Init(parTitle, parXPos, parYpos, parWidth, parHeight, flags);
}
 
void Game::Render()
{
    SDL_RenderClear(m_pRenderer); // clear the renderer to the draw color
 
    // RenderClear 와 RenderPresent 사이에 렌더링 할 부분을 넣는다.
 
 
    SDL_RenderPresent(m_pRenderer); // draw to the screen
}
 
void Game::Update()
{
    // 이번 단원에서는 update할 것이 없다.
}
 
void Game::HandleEvents()
{
    SDL_Event event;
    if (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
            case SDL_QUIT:
                m_bRunning = false;
                break;
            default:
                break;
        }
    }
}
 
void Game::Clean()
{
    std::cout << "cleaning game\n";
    SDL_DestroyWindow(m_pWindow);
    SDL_DestroyRenderer(m_pRenderer);
    SDL_Quit();
}
 
bool Game::isRunning()
{
    return m_bRunning;
}
 
cs

 

<Main Fucntion>

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "Game.h"
 
int main(int argc, char* args[])
{
    // 게임 객체 생성
    Game* game = new Game();
 
    if (game->Init("SDL TEST"100100640480false))
    {
        while (game->isRunning())
        {
            game->HandleEvents();
            game->Update();
            game->Render();
        }
        game->Clean();
    }
    return 0;
}
cs

 

실행하면 다음과 같은 결과를 얻는다.

 

 

 

 

 

게임의 기본적임 메커니즘(mechanics)은 다음과 같다.

Game Mechanics

그래서 초기화 이후 반복문을 이용하여, Input, Update, Render를 반복한다.

 

 

 

다음은 SDL_CreateWindow(title, xpos, ypos, width, height, flags); 의 Flags이다.

 

 

출처: SDL Game Development  Shaun Ross Mitchell 

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

4. SDL TextureManager 만들기(Singleton, 이미지 그리기)  (0) 2021.03.03
3. SDL 에서 그림 그리기.  (0) 2021.03.01
1. Hello SDL (SDL 초기화)  (0) 2021.03.01

+ Recent posts