이젠, 우리는 저번시간에 배운 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, -1, 0);
if (m_pRenderer != 0) // renderer init success
{
std::cout << "renderer creation success\n";
// 파란색 화면.
SDL_SetRenderDrawColor(m_pRenderer, 0, 0, 255, 255);
}
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", 100, 100, 640, 480, false))
{
while (game->isRunning())
{
game->HandleEvents();
game->Update();
game->Render();
}
game->Clean();
}
return 0;
}
|
cs |
실행하면 다음과 같은 결과를 얻는다.
게임의 기본적임 메커니즘(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 |