Search
Duplicate
🍏

SDL 2.0 을 알아보자 (2탄) - 화면 띄우기

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Graphics
Scrap
태그
9 more properties
설치가 끝났으면 이제 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
복사

Reference