본문 바로가기
-----ETC-----/C++로 배우는 게임 엔진 개발

[C++로 배우는 게임 엔진 개발] Day 3: 기본 프로젝트 구조 설정

by cogito21_cpp 2024. 8. 1.
반응형

기본 프로젝트 구조 설정

오늘은 기본 프로젝트 구조를 설정하고, 간단한 윈도우 창을 생성하는 방법을 학습합니다. 이를 통해 게임 엔진의 기본 틀을 마련합니다.

1. 프로젝트 디렉토리 구조

기본 프로젝트 구조는 다음과 같이 설정합니다:

GameEngine/
├── CMakeLists.txt
├── include/
│   └── GameEngine.h
├── src/
│   ├── main.cpp
│   └── GameEngine.cpp
└── build/

2. CMake 설정

프로젝트의 CMakeLists.txt 파일을 수정하여 필요한 라이브러리를 추가하고, 소스 파일을 구성합니다. 오늘은 SDL2 라이브러리를 사용하여 윈도우 창을 생성할 것입니다.

 

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

# 프로젝트 이름과 버전 설정
project(GameEngine VERSION 1.0)

# C++ 표준 설정
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 헤더 파일 디렉토리 포함
include_directories(include)

# SDL2 라이브러리 설정
find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS})

# 소스 파일 설정
file(GLOB SOURCES "src/*.cpp")

# 실행 파일 생성
add_executable(GameEngine ${SOURCES})

# SDL2 라이브러리 링크
target_link_libraries(GameEngine ${SDL2_LIBRARIES})

3. 헤더 파일 작성

include/GameEngine.h 파일을 수정하여 다음과 같이 작성합니다.

 

GameEngine.h

#ifndef GAMEENGINE_H
#define GAMEENGINE_H

#include <SDL2/SDL.h>

class GameEngine {
public:
    GameEngine();
    ~GameEngine();
    bool Initialize(const char* title, int width, int height);
    void Run();
    void Shutdown();

private:
    SDL_Window* window;
    SDL_Renderer* renderer;
    bool isRunning;
};

#endif // GAMEENGINE_H

4. 소스 파일 작성

src/GameEngine.cpp 파일을 생성하고 다음과 같이 작성합니다.

 

GameEngine.cpp

#include "GameEngine.h"
#include <iostream>

GameEngine::GameEngine()
    : window(nullptr), renderer(nullptr), isRunning(false) {}

GameEngine::~GameEngine() {
    Shutdown();
}

bool GameEngine::Initialize(const char* title, int width, int height) {
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        std::cerr << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return false;
    }

    window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_SHOWN);
    if (window == nullptr) {
        std::cerr << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        return false;
    }

    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (renderer == nullptr) {
        std::cerr << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        return false;
    }

    isRunning = true;
    return true;
}

void GameEngine::Run() {
    while (isRunning) {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                isRunning = false;
            }
        }

        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);

        // 여기에 렌더링 코드를 추가합니다

        SDL_RenderPresent(renderer);
    }
}

void GameEngine::Shutdown() {
    if (renderer) {
        SDL_DestroyRenderer(renderer);
        renderer = nullptr;
    }
    if (window) {
        SDL_DestroyWindow(window);
        window = nullptr;
    }
    SDL_Quit();
}

5. main 파일 작성

src/main.cpp 파일을 다음과 같이 작성합니다.

 

main.cpp

#include "GameEngine.h"

int main(int argc, char* argv[]) {
    GameEngine gameEngine;

    if (!gameEngine.Initialize("Game Engine", 800, 600)) {
        return -1;
    }

    gameEngine.Run();
    gameEngine.Shutdown();

    return 0;
}

6. 프로젝트 빌드 및 실행

  1. Visual Studio에서 CMake 프로젝트 열기:
    • Visual Studio를 실행하고, File -> Open -> CMake...를 선택합니다.
    • GameEngine 디렉토리를 선택하여 프로젝트를 엽니다.
  2. SDL2 라이브러리 설치:
    • SDL2 다운로드 페이지에서 운영체제에 맞는 SDL2 라이브러리를 다운로드합니다.
    • SDL2 라이브러리 파일을 프로젝트의 적절한 위치에 복사합니다.
    • CMakeLists.txt 파일의 find_package(SDL2 REQUIRED) 부분이 SDL2 라이브러리를 찾을 수 있도록 경로를 설정합니다.
  3. 프로젝트 빌드:
    • Visual Studio 상단의 Build 메뉴에서 Build All을 선택하여 프로젝트를 빌드합니다.
  4. 프로젝트 실행:
    • Debug 메뉴에서 Start Without Debugging을 선택하여 프로그램을 실행합니다.
    • 윈도우 창이 생성되고, 검은색 화면이 나타나면 성공적으로 설정이 완료된 것입니다.

마무리

오늘은 기본 프로젝트 구조를 설정하고, SDL2를 사용하여 간단한 윈도우 창을 생성하는 방법을 학습했습니다. 다음 단계에서는 기본 렌더링 파이프라인을 이해하고, 화면에 그래픽스를 렌더링하는 방법을 배워보겠습니다.

질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.

Day 4 예고

다음 날은 "윈도우 창 생성 (SDL2/GLFW)"에 대해 다룰 것입니다. 윈도우 창을 생성하고, 초기 화면을 렌더링하는 방법을 학습하겠습니다.

반응형