본문 바로가기
-----ETC-----/C++ 고급 프로그래밍과 응용 프로젝트 시리즈

[C++ 고급 프로그래밍과 응용 프로젝트 시리즈] Day 28: C++로 게임 개발 (SFML, SDL)

by cogito21_cpp 2024. 8. 1.
반응형

SFML 소개

SFML(Simple and Fast Multimedia Library)은 멀티미디어 애플리케이션 개발을 위한 크로스 플랫폼 C++ 라이브러리입니다. 주로 2D 게임 개발에 사용되며, 그래픽, 오디오, 네트워크, 입출력 등의 기능을 제공합니다.

 

SFML 설치 및 설정

SFML 설치

리눅스 환경에서 SFML을 설치하려면 다음 명령어를 사용합니다.

sudo apt-get install libsfml-dev

 

SFML 프로젝트 설정

SFML을 사용하여 간단한 게임을 개발하는 프로젝트를 설정합니다.

 

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(SFMLGame)

set(CMAKE_CXX_STANDARD 17)

find_package(SFML 2.5 COMPONENTS graphics audio REQUIRED)

add_executable(sfml_game main.cpp)
target_link_libraries(sfml_game sfml-graphics sfml-audio)

 

main.cpp

다음은 간단한 SFML 창을 생성하고 이벤트를 처리하는 예제입니다.

#include <SFML/Graphics.hpp>

int main() {
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML Game");

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                window.close();
            }
        }

        window.clear();
        window.display();
    }

    return 0;
}

 

빌드 및 실행

mkdir build
cd build
cmake ..
make
./sfml_game

 

이 코드는 800x600 해상도의 창을 생성하고, 닫기 버튼을 클릭하면 창을 닫습니다.

 

SDL 소개

SDL(Simple DirectMedia Layer)은 멀티미디어 애플리케이션 개발을 위한 크로스 플랫폼 C 라이브러리입니다. 주로 2D 게임 개발에 사용되며, 그래픽, 오디오, 이벤트 처리 등의 기능을 제공합니다.

 

SDL 설치 및 설정

SDL 설치

리눅스 환경에서 SDL을 설치하려면 다음 명령어를 사용합니다.

sudo apt-get install libsdl2-dev

 

SDL 프로젝트 설정

SDL을 사용하여 간단한 게임을 개발하는 프로젝트를 설정합니다.

 

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(SDLGame)

set(CMAKE_CXX_STANDARD 17)

find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS})

add_executable(sdl_game main.cpp)
target_link_libraries(sdl_game ${SDL2_LIBRARIES})

 

main.cpp

다음은 간단한 SDL 창을 생성하고 이벤트를 처리하는 예제입니다.

#include <SDL2/SDL.h>
#include <iostream>

int main(int argc, char* argv[]) {
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        std::cerr << "SDL could not initialize! SDL_Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    SDL_Window* window = SDL_CreateWindow("SDL Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN);
    if (window == NULL) {
        std::cerr << "Window could not be created! SDL_Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    bool quit = false;
    SDL_Event event;

    while (!quit) {
        while (SDL_PollEvent(&event) != 0) {
            if (event.type == SDL_QUIT) {
                quit = true;
            }
        }

        SDL_SetRenderDrawColor(SDL_GetRenderer(window), 0, 0, 0, 255);
        SDL_RenderClear(SDL_GetRenderer(window));
        SDL_RenderPresent(SDL_GetRenderer(window));
    }

    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

 

빌드 및 실행

mkdir build
cd build
cmake ..
make
./sdl_game

 

이 코드는 800x600 해상도의 창을 생성하고, 닫기 버튼을 클릭하면 창을 닫습니다.

 

간단한 게임 구현

SFML과 SDL을 사용하여 간단한 게임을 구현해보겠습니다. 여기서는 SFML을 사용하여 간단한 "Pong" 게임을 구현합니다.

 

SFML로 Pong 게임 구현

main.cpp

#include <SFML/Graphics.hpp>

int main() {
    sf::RenderWindow window(sf::VideoMode(800, 600), "Pong");

    sf::RectangleShape paddle1(sf::Vector2f(25, 100));
    sf::RectangleShape paddle2(sf::Vector2f(25, 100));
    sf::CircleShape ball(10);

    paddle1.setPosition(50, 250);
    paddle2.setPosition(725, 250);
    ball.setPosition(395, 295);

    sf::Vector2f ballVelocity(0.3f, 0.3f);

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                window.close();
            }
        }

        // Paddle1 control
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) && paddle1.getPosition().y > 0) {
            paddle1.move(0, -0.5f);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::S) && paddle1.getPosition().y < 500) {
            paddle1.move(0, 0.5f);
        }

        // Paddle2 control
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up) && paddle2.getPosition().y > 0) {
            paddle2.move(0, -0.5f);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down) && paddle2.getPosition().y < 500) {
            paddle2.move(0, 0.5f);
        }

        // Ball movement
        ball.move(ballVelocity);

        if (ball.getPosition().y <= 0 || ball.getPosition().y >= 590) {
            ballVelocity.y = -ballVelocity.y;
        }

        if (ball.getGlobalBounds().intersects(paddle1.getGlobalBounds()) ||
            ball.getGlobalBounds().intersects(paddle2.getGlobalBounds())) {
            ballVelocity.x = -ballVelocity.x;
        }

        window.clear();
        window.draw(paddle1);
        window.draw(paddle2);
        window.draw(ball);
        window.display();
    }

    return 0;
}

 

이 코드는 간단한 Pong 게임을 구현합니다. 플레이어는 W/S 키와 위/아래 키를 사용하여 패들을 제어하고, 공이 패들에 부딪히면 방향을 바꿉니다.

 

빌드 및 실행

mkdir build
cd build
cmake ..
make
./sfml_game

 

게임을 실행하여 Pong 게임을 플레이해볼 수 있습니다.

 

이제 28일차의 학습을 마쳤습니다. SFML과 SDL을 사용하여 간단한 게임을 구현하는 방법을 학습하고, SFML을 사용하여 Pong 게임을 구현해보았습니다.

 

질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "머신러닝을 위한 C++ 라이브러리 (TensorFlow, Caffe)"에 대해 학습하겠습니다.

반응형