C++클론코딩 무작정 따라서 만들어보기 1탄

Junghwan Kim·2023년 5월 24일
0
post-thumbnail

C++로 만들어진 프로그램중에 내가 따라서 만들어볼만한 프로그램이 있을까 찾아보던 찰나에 c++ bike racing game 이라는 프로젝트를 발견하게되었고 곧바로 비주얼 스튜디오를 키고서 해당 프로젝트를 띄워놓고 새 프로젝트를 만들어서 그대로 따라서 만들어보았다. 궁금해하신 분들을 위해 따로 프로젝트 링크를 남겨놓겠다.
https://github.com/surajpanker/Bike-racing-game
코드를 따라서치면서 SDL라이브러리도 설치해보고 헤더파일들도 구현해보고 하면서 대충 이 프로젝트가 어떤식으로 구성이 되어있고 하는지 짐작을 할수있었고 그렇게 코드를 따라서 치던 도중에 갑자기 SDL 라이브러리에 없는 함수가 있다고 에러가 뜨면서 문제상황에 직면을 하게되었다.
init.h 파일을 코딩하던도중 SDL_SetVideoMode 함수가 아예 SDL 라이브러리에 포함되어있지 않았던 것이다. 해결법을 찾기위해 구글링을 해보니 https://stackoverflow.com/questions/28400401/sdl-setvideomode-identifier-not-found
해결법이 나와있었고 해결법은 SDL_SetVideoMode 함수를 SDL2버전의 함수를 사용하여 비슷하게 돌아가게끔 구현을 하는것이였다. 윈도우 타이틀을 만들고 화면을 거기에 붙여넣으면 된다고 하길래 곧바로 구현에 들어가보았다.
다음 코드는 스택오버플로우에 나온 해결법인 SDL2버전으로 SetVideoMode함수를 구현한 코드이다.

if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "SDL video init failed: %s\n", SDL_GetError());
return 1;
}

// SDL_Surface *screenSurface = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_SWSURFACE);

SDL_Window window = NULL;
SDL_Surface
screenSurface = NULL;

window = SDL_CreateWindow("Sphere Rendering",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);

if (window == NULL) {
fprintf(stderr, "Window could not be created: %s\n", SDL_GetError());
return 1;
}

screenSurface = SDL_GetWindowSurface(window);

if (!screenSurface) {
fprintf(stderr, "Screen surface could not be created: %s\n", SDL_GetError());
SDL_Quit();
return 1;
}

// SDL_WM_SetCaption("Sphere Rendering", NULL);

이 코드에서 핵심은 바로 window와 screenSurface 변수였는데 window변수에 윈도우타이틀 그리고 창을 띄울 위치등등 정보를 집어넣고 screenSurface변수에는 GetWindowSurface함수를 호출하여 매개변수로 surface를 집어넣고 그값을 저장해주면 SetVideoMode 함수의 기능이 어느정도 구현이 된다는 것이다.
이를 토대로 init.h파일의 코드를 이렇게 수정해보았다.

if (SDL_Init(SDL_INIT_EVERYTHING == -1))
return false;

SDL_Window* window = NULL;
SDL_Surface* screenSurface = NULL;

window = SDL_CreateWindow("Bike racing", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);

if (window == NULL) {
	fprintf(stderr, "Window could not be created: %s\n", SDL_GetError());
	return 1;
}

screenSurface = SDL_GetWindowSurface(window);

if (screenSurface == NULL)
{
	return false;
}

if (TTF_Init() == -1)
{
	return false;
}

if (!screenSurface) {
	fprintf(stderr, "Screen surface could not be created: %s\n", SDL_GetError());
	SDL_Quit();
	return 1;
}

CreateWindow함수에서 타이틀명을 집어넣고 x,y값은 windowpos_undefined값을 넣어주고 width와 height자리엔 기존에 설정해놓은 값으로 넣어주는식으로 해서 코드를 수정해보았다. 그러나 에러를 없앤것도 잠시... 또다시 에러가 터졌다. 이번엔 SDL_DisplayFormat함수가 없다고 나오는것이였다. 이번에도 마찬가지로 구글링을 통해 해결법을 찾아내었다.
https://stackoverflow.com/questions/17518759/sdl-displayformat-not-declared-in-this-scope-using-sdl2

위의 링크에 달린 글을 참고하여 코드를 다음과같이 수정하였다.
optimized_image = SDL_ConvertSurfaceFormat(loaded_image,4,SDL_WINDOW_SHOWN);
숫자4를 할당해준 이유는 Uint32 pixel_format위치에 값을 할당해줘야 하는데 어떠한 값을 할당해줘야할지 몰라서 일단 무작정 4를 할당해주고 보았다... 그렇게 또 에러를 없애고나니 또 에러가 발생을 하였다.. 이번엔 SDL_SRCCOLORKEY함수가 구현이 안되어있어서 마찬가지로 다른함수를 호출하여 사용을 했어야 했고 구글링을 통해 마찬가지로 에러를 없앴다.
https://discourse.libsdl.org/t/sdl-1-2-to-sdl2-sdl-srccolorkey-sdl-srcalpha/24694/2

코드는 다음과같이 수정을 해보았다.
if (optimized_image != NULL)
{
SDL_SetColorKey(optimized_image, SDL_GetColorKey(screen, NULL), SDL_MapRGB(optimized_image->format, coll, col2, col13));
}

도무지 SDL_GetColorKey의 Uint32 *key자리에 어떤값을 줘야될지 몰라서 일단 NULL값을 할당해주고 보았다..

이외에도 SDL_Flip()이란 함수도 SDL2버전에선 다른함수를 호출해서 써야만하고 이런저런 에러들을 다 겪어보다보니 일단은 최대한 에러가 안터지게 코드를 수정하긴 했으나 이렇게 내가 수정하고 한 코드를 빌드했을때 정상적으로 게임이 돌아갈련지는 아직 의문이긴하다...하하하핳

구글링을 더 해보니 아래링크에 모든 해결법이 들어있었더라는..! ㄷㄷ
https://wiki.libsdl.org/SDL2/MigrationGuide
일단은 급한대로 코드를 수정하고 프로젝트를 디버그 해보았다. 역시나 아니나다를까 무수히 많은 에러들이 뻥뻥 터져버리고 말았다...

SDL라이브러리의 고질적인 호환문제 그리고 이외에도 내가 건드릴수 없는부분에서 오류가 터져나가다보니 머리가 백지장처럼 새하얘져버리는 것이다...
일단은 정상적인 게임실행창을 띄우는데엔 실패를 했으니 다음시간엔 코드를 분석하면서 그리고 미리 만들어진 게임 실행파일을 활용하여 코드를 분석해가면서 정리를 하는 시간을 가지면 될듯하다.

해당 프로젝트의 코드 깃허브 주소:https://github.com/wjgk0822/bike-game

profile
안녕하세요~

0개의 댓글