설치가 끝났으면 이제 SDL 2.0 의 사용법을 알아보자
그럼 먼저 화면을 띄워보자
창 띄우기 준비
SDL_Init
먼저 SDL 을 초기화 시켜야 SDL 을 사용가능하다. SDL을 초기화하는 방법은 아래와 같다.
function
SDL 을 초기화 시킨다.
#include <SDL2/SDL.h>
int SDLCALL SDL_Init(Uint32 flags);
C
복사
parameters
•
flags : 초기화 플래그
◦
아래 플래그 다 볼필요 없다.
◦
SDL_INIT_TIMER: timer subsystem
◦
SDL_INIT_AUDIO: audio subsystem
◦
SDL_INIT_VIDEO: video subsystem; automatically initializes the events
subsystem
◦
SDL_INIT_JOYSTICK: joystick subsystem; automatically initializes the
events subsystem
◦
SDL_INIT_HAPTIC: haptic (force feedback) subsystem
◦
SDL_INIT_GAMECONTROLLER: controller subsystem; automatically
initializes the joystick subsystem
◦
SDL_INIT_EVENTS: events subsystem
◦
SDL_INIT_EVERYTHING: all of the above subsystems
◦
SDL_INIT_NOPARACHUTE: compatibility; this flag is ignored
return value
•
0 on success or a negative error code on failure
example
#include <SDL2/SDL.h>
if (SDL_Init(SDL_INIT_EVENTS) != 0)
{
fprintf(stderr, "%s\n", (SDL_GetError()));
return (0);
}
C
복사
우리는 이벤트만 다룰것이기 때문에 일단 SDL_INIT_EVENTS 로 하였다.
SDL_CreateWindow
SDL 을 초기화했으면, 이제 윈도우 창을 만들어보자
function
SDL_Window * SDLCALL SDL_CreateWindow(const char *title,
int x, int y, int w,
int h, Uint32 flags);
C
복사
parameters
•
title : 윈도우 제목
•
x, y : 모니터 좌측 상단 기준 x, y 픽셀 만큼 떨어진곳에 윈도우 생성
◦
SDL_WINDOWPOS_CETERED : 화면 정중앙
◦
SDL_WINDOWPOS_UNDEFINED : 적당한 위치
•
w, h : 윈도우 가로 세로 크기
•
flags : 창의 속성 (테두리 없는 창, 크기 조절 등등)
◦
header 에 있는 내용 참고
return value
•
the window that was created or NULL on failure
example
#include <SDL2/SDL.h>
static const int width = 800;
static const int height = 600;
SDL_Window *window = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL);
if (window == 0)
{
fprintf(stderr, "%s\n", (SDL_GetError()));
return (0);
}
C
복사
SDL_CreateRenderer
윈도우 창을 만들었으면, 윈도우에 렌더링 작업을 할 렌더러를 만들어보자.
각 윈도우마다 렌더러가 있어야 창을 렌더링할 수 있다.
function
SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window * window,
int index, Uint32 flags);
C
복사
parameters
•
window : 렌더링할 윈도우
•
index : 렌더링 할 드라이버 설정, -1 넣으면 첫번째로 사용 가능한 드라이버 사용
•
flags : 렌더링 플래그
◦
header 에 있는 내용 참고
◦
SDL_RENDERER_ACCELERATED : 하드웨어 가속
◦
SDL_RENDERER_PRESENTVSYNC : 수직 동기화
return value
•
a valid rendering context or NULL if there was an error
example
#include <SDL2/SDL.h>
SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == 0)
{
fprintf(stderr, "%s\n", (SDL_GetError()));
return (0);
}
C
복사
진짜 창 띄우기
여기까지 하면 이제 창을 띄울 준비는 끝난것이다.
마지막으로 SDL_Delay(1000 * 5); 을 넣어서 창이 5초정도 유지 되게하고 꺼지게 해보자.
그리고 컴파일 해보면...! 안뜬다. ㅠ
왜 안떠요?
그러게요? 왜 안뜨는지 잘 모르겠다.
왜인지는 모르겠지만, 아래 코드처럼 해주면 된다...!
SDL_Event event;
SDL_PollEvent(&event);
SDL_Delay(1000 * 5);
C
복사
좀더 나은 방법
일반적으로 바로 꺼지게 하지 않게 하기 위해서 SDL_Event 를 쓴다.
자세한건 다음에 알아보고, 지금은 코드만 배끼자.
다음 코드를 넣어주면 기가막히게 잘 돌아간다.
bool quit = false;
SDL_Event event;
while(!quit){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
quit = true;
break;
}
}
SDL_Delay(1);
}
C
복사
야호!
메모리 해제
창을 다 띄우고 나서는 메모리를 해제해주자
만들어준 렌더러, 윈도우를 올바르게 삭제하고, 마지막으로 SDL 자체도 종료시킨다.
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
C
복사
최종 코드
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <SDL2/SDL.h>
// Window dimensions
static const int width = 800;
static const int height = 600;
int main()
{
if (SDL_Init(SDL_INIT_VIDEO) != 0)
{
fprintf(stderr, "%s\n", (SDL_GetError()));
return (0);
}
// Create an SDL window
SDL_Window *window = SDL_CreateWindow("Hello World", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL);
if (window == 0)
{
fprintf(stderr, "%s\n", (SDL_GetError()));
return (0);
}
// Create a renderer (accelerated and in sync with the display refresh rate)
SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == 0)
{
fprintf(stderr, "%s\n", (SDL_GetError()));
return (0);
}
bool quit = false;
SDL_Event event;
while(!quit){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
quit = true;
break;
}
}
SDL_Delay(1);
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return (0);
}
C
복사