발전하는 춘배
[원고, SDL3] 4. 윈도우 오목 게임 만들기 - SDL써서 그래픽 띄우기, 클릭이벤트 써먹기 본문
일단 GPT한테 부탁해서 "오목"이라는 600*600픽셀 윈도우를 띄워달라고 해봤다.
1편에서 떴던 오류가 또 뜨길래 구글링해봤더니
https://stackoverflow.com/questions/79636679/sdl-init-fails-without-returning-an-error
SDL_Init() fails without returning an error?
When I try to execute this SDL3 program: // g++ -Wall -Ofast main.cpp -Iinclude -Iinclude/SDL3 -Linclude/SDL3 -lSDL3 -o build/program #define SDL_MAIN_HANDLED #include <iostream> #include <...
stackoverflow.com
바로 찾았다.
SDL 초기화하는 코드부분이 문제였는데
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
std::cerr << "SDL_Init Error: " << SDL_GetError() << std::endl;
return 1;
}
이게 gpt가 준 코드다.
스택오버플로우 답변에 따르면 SDL2에선 SDL_Init의 리턴값으로 0이 success를 의미하는데 SDL3에선 바뀌어가지고 true가 success false가 failure을 의미한는 boolean값을 return한단다. 아하 드디어 의문이 해결됐다. if문 조건을
!SDL_Init(SDL_INIT_VIDEO)
로 바꿨더니 지겹던 에러 대신 깜깜한 윈도우 창이 잘 떴다! SDL3 나온지가 얼마 안 돼서 GPT에 정보가 없는듯. SDL2 베이스로 설명하는 듯 싶다. 아니근데 gpt한테 https://wiki.libsdl.org/SDL3/APIByCategory 이 페이지 읽혀놓고 물어본건데 그냥 자기 아는걸로 설명해버리네 gpt 사용법을 내가 아직 잘 모르나보다.
일단 GPT형님의 손을 빌려서 윈도우 창에 오목판 띄우기 성공했다.
큰틀은 이렇다.
렌더러 객체 생성하고
SDL_SetRenderDrawColor(~~)로 펜색상 지정 -> SDL_RenderClear(renderer); 하면 배경색 색칠되고
펜색상 지정 후 SDL_RenderLine(~~)같이 뭐 그리면 그 색상으로 그려지느 것 같다.
bool SDL_RenderLine(SDL_Renderer *renderer, float x1, float y1, float x2, float y2);
문서 보니깐 x1,y1 ~ x2,y2까지 직선 그어주는 듯.
아 그리고 보니깐
SDL_RenderPresent(renderer); 이거 해줘야 여태까지 렌더한 것들을 실제로 스크린에 띄워준다.

결과물.
게임 로직은 다 짜놨으니깐 이제 Game.cpp에 있는 DisplayBoard() 부분만 잘 바꿔주면 되겠지?
지금은 일단 cout으로 출력하는 거였는데 이 스크린에 그림그려주는 걸로 바꾸면 될 듯하다.
그러려면 일단 인자로 렌더러를 넘기면 되겠지?
로 코드를 한참 (40분정도) 짜다 보니 구조적인 문제가 생겼다.
SDL에선 기본적으로 while (!quit) {...} 라는 메인루프 안에서 게임의 이벤트처리, 상태 업데이트, 렌더링이 이루어지는 구조가 좋다.
근데 내 지금 상태는 Game이란 객체를 생성함과 동시에 게임을 실행하는 방식이다. 그래서 구조적으로 약간의 수정이 필요하다.
일단 while (!quit){}에 들어가기 전에 Game 객체를 생성한다.
그리고 메인 루프는 다음과 같은 구조를 띤다.
while (!quit)
{
while (SDL_PollEvent(&e)) {
if (e.type == SDL_EVENT_QUIT) {
quit = true;
}
game.HandleEvent(e); // 이벤트 처리
}
게임 상태 업데이트
스크린 렌더링 업데이트 (화면 업데이트)
}
그니깐 일단 이벤트를 기다리고,
이벤트가 생기면 그거에 맞게 게임로직을 수행하고
화면에 뿌려주면 된다.
말은 쉬운데 음 어케해야할까

일단 gpt 도움받아서 어케든 마무리하긴했는데 문제가 여러개 있다.
1. 클릭하는 곳이랑 바둑알 놓아지는 곳이랑 좀 다르다.
-> 이건 gpt가 짜준 코드 보니깐 그럴 수밖에 없게 짜줬다. 좌표문제라 쉽게 수정가능할듯.
2. 몹시 깜빡거린다.
-> 이게 왜그런건지 모르겠다. 주의깊게 보면 바둑판은 안 깜빡거리는데 돌들만 단체로 깜빡거린다. 좀만 생각해보면 될 거 같긴 한데 머리가 아파진 관계로 내일 생각해보기로.
3. 게임 승리 판정 타이밍이 좀 늦다.
-> 5목 완성하고 그 다음 사람이 돌을 놔야 게임 승리 판정이 난다. 이것도 gpt 코드 보니깐 턴 종료 로직이랑 게임승리조건 판단 로직이랑 서순문제인것 같아서 쉽게 해결 가능할듯.
이거 3개만 일단 해결하면 될 듯하고 사실상 1번 3번은 구상이 끝나서 2번만 어케 잘 해결하면 될 것 같다.
느낀점:
- 확실히 gpt가 있으니깐 문서 열심히 안 읽어도 돼서 좋다. 일단 gpt한테 부탁하고 뭔가 막히면 그때 문서 찾아봐도 늦지 않은 듯. 그래도 문서가 기본이란 건 잊으면 안 된다. gpt는 도구일뿐.
- https://wiki.libsdl.org/SDL3/APIByCategory
SDL3/APIByCategory
The Simple Directmedia Layer Wiki
wiki.libsdl.org
API 보다보니깐 확실히 이름이 직관적인게 중요하단 생각이 들었다. 이름만 봐도 대충 아 이런 거 하겠구나 싶게 만들어야한다.
'.원고' 카테고리의 다른 글
| [원고, SDL3](完) 6. 윈도우 오목 게임 만들기 - 메뉴화면, 종료화면, 게임 상태의 표현, cmake 써먹어보기, 컴파일 옵션들 이해해보기 (3) | 2025.08.25 |
|---|---|
| [원고, SDL3] 5. 윈도우 오목 게임 만들기 - 버그해결 (3) | 2025.08.25 |
| [원고, SDL3] 3. 윈도우 오목 게임 만들기 - 클래스 파일 분할, 분할컴파일 (3) | 2025.08.24 |
| [원고, SDL3] 2. 윈도우 오목게임 만들기 기록 1 (0) | 2025.08.24 |
| [원고, SDL3] 1. C++로 게임 개발 기록 1 (0) | 2025.08.23 |
