발전하는 춘배

[원고, SDL3] 4. 윈도우 오목 게임 만들기 - SDL써서 그래픽 띄우기, 클릭이벤트 써먹기 본문

.원고

[원고, SDL3] 4. 윈도우 오목 게임 만들기 - SDL써서 그래픽 띄우기, 클릭이벤트 써먹기

춘배0 2025. 8. 24. 22:10

일단 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 보다보니깐 확실히 이름이 직관적인게 중요하단 생각이 들었다. 이름만 봐도 대충 아 이런 거 하겠구나 싶게 만들어야한다.

반응형