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

[C++로 배우는 게임 엔진 개발] Day 4: 윈도우 창 생성 (SDL2/GLFW)

by cogito21_cpp 2024. 8. 1.
반응형

윈도우 창 생성

오늘은 SDL2 또는 GLFW를 사용하여 윈도우 창을 생성하는 방법을 학습합니다. SDL2는 멀티미디어 라이브러리로, 게임 개발에 널리 사용됩니다. GLFW는 OpenGL을 위한 경량의 윈도우 라이브러리입니다.

1. SDL2를 사용하여 윈도우 창 생성

SDL2를 사용하여 윈도우 창을 생성하고 기본적인 렌더링을 구현해 보겠습니다.

 

헤더 파일 작성

include/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

 

소스 파일 작성

src/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();
}

 

main 파일 작성

src/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;
}

2. GLFW를 사용하여 윈도우 창 생성

GLFW를 사용하여 윈도우 창을 생성하고 OpenGL 컨텍스트를 설정해 보겠습니다.

 

CMakeLists.txt 수정

CMakeLists.txt 파일을 수정하여 GLFW를 추가합니다.

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)

# GLFW 라이브러리 설정
find_package(OpenGL REQUIRED)
find_package(GLFW3 REQUIRED)
include_directories(${GLFW3_INCLUDE_DIR})

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

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

# GLFW 및 OpenGL 라이브러리 링크
target_link_libraries(GameEngine ${OPENGL_LIBRARIES} ${GLFW3_LIBRARIES})

 

헤더 파일 작성

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

#ifndef GAMEENGINE_H
#define GAMEENGINE_H

#include <GLFW/glfw3.h>

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

private:
    GLFWwindow* window;
    bool isRunning;
};

#endif // GAMEENGINE_H

 

소스 파일 작성

src/GameEngine.cpp 파일을 다음과 같이 수정합니다.

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

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

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

bool GameEngine::Initialize(const char* title, int width, int height) {
    if (!glfwInit()) {
        std::cerr << "GLFW Initialization failed!" << std::endl;
        return false;
    }

    window = glfwCreateWindow(width, height, title, NULL, NULL);
    if (!window) {
        std::cerr << "GLFW Window creation failed!" << std::endl;
        glfwTerminate();
        return false;
    }

    glfwMakeContextCurrent(window);
    isRunning = true;
    return true;
}

void GameEngine::Run() {
    while (isRunning && !glfwWindowShouldClose(window)) {
        glfwPollEvents();

        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

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

        glfwSwapBuffers(window);
    }
}

void GameEngine::Shutdown() {
    if (window) {
        glfwDestroyWindow(window);
        window = nullptr;
    }
    glfwTerminate();
}

 

main 파일 작성

src/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;
}

3. 프로젝트 빌드 및 실행

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

마무리

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

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

Day 5 예고

다음 날은 "기본 렌더링 파이프라인 이해"에 대해 다룰 것입니다. 그래픽스를 화면에 렌더링하는 기본 방법을 학습하고, 간단한 도형을 그리는 방법을 배워보겠습니다.

반응형