본문 바로가기
-----ETC-----/C++ 게임 개발 시리즈

[C++ 게임 개발 시리즈] Day 15: 게임 이벤트 처리

by cogito21_cpp 2024. 8. 1.
반응형

게임 이벤트 처리

이벤트 처리는 게임에서 사용자의 입력을 받아 다양한 동작을 수행하게 하는 중요한 요소입니다. 오늘은 SFML을 사용하여 이벤트를 처리하고, 입력에 따라 게임의 상태를 변경하는 방법을 학습하겠습니다.

이벤트 처리 기초

SFML에서는 sf::Event 클래스를 사용하여 다양한 이벤트를 처리할 수 있습니다. 대표적인 이벤트 유형은 다음과 같습니다:

  1. 키보드 이벤트 (Keyboard Event): 키를 누르거나 떼는 이벤트입니다.
  2. 마우스 이벤트 (Mouse Event): 마우스 버튼을 누르거나 떼는 이벤트입니다.
  3. 윈도우 이벤트 (Window Event): 창의 닫기, 크기 변경 등의 이벤트입니다.

기본적인 이벤트 처리 예제

다음은 기본적인 이벤트 처리 예제입니다. 이 예제에서는 키보드와 마우스 이벤트를 처리하여 화면의 색상을 변경합니다.

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>
#include <iostream>

int main() {
    // 창 생성
    sf::RenderWindow window(sf::VideoMode(800, 600), "Event Handling Example");

    // 초기 배경 색상
    sf::Color backgroundColor = sf::Color::Black;

    // 게임 루프
    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            // 창 닫기 이벤트 처리
            if (event.type == sf::Event::Closed)
                window.close();

            // 키보드 이벤트 처리
            if (event.type == sf::Event::KeyPressed) {
                if (event.key.code == sf::Keyboard::R) {
                    backgroundColor = sf::Color::Red;
                } else if (event.key.code == sf::Keyboard::G) {
                    backgroundColor = sf::Color::Green;
                } else if (event.key.code == sf::Keyboard::B) {
                    backgroundColor = sf::Color::Blue;
                }
            }

            // 마우스 버튼 이벤트 처리
            if (event.type == sf::Event::MouseButtonPressed) {
                if (event.mouseButton.button == sf::Mouse::Left) {
                    backgroundColor = sf::Color::Yellow;
                } else if (event.mouseButton.button == sf::Mouse::Right) {
                    backgroundColor = sf::Color::Magenta;
                }
            }
        }

        // 화면 지우기
        window.clear(backgroundColor);

        // 화면에 그리기
        window.display();
    }

    return 0;
}

복합적인 이벤트 처리

복합적인 이벤트 처리는 여러 종류의 이벤트를 동시에 처리하거나 특정 조건에 따라 다른 동작을 수행하도록 합니다. 다음 예제에서는 캐릭터를 키보드 입력으로 이동시키고, 마우스 클릭으로 캐릭터의 색상을 변경합니다.

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>
#include <iostream>

int main() {
    // 창 생성
    sf::RenderWindow window(sf::VideoMode(800, 600), "Complex Event Handling Example");

    // 캐릭터 생성
    sf::RectangleShape character(sf::Vector2f(50.0f, 50.0f));
    character.setFillColor(sf::Color::White);
    character.setPosition(375.0f

, 275.0f); // 창 중앙에 위치

    // 이동 속도 설정
    const float moveSpeed = 200.0f;

    // 게임 루프
    sf::Clock clock;
    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            // 창 닫기 이벤트 처리
            if (event.type == sf::Event::Closed)
                window.close();

            // 키보드 이벤트 처리
            if (event.type == sf::Event::KeyPressed) {
                if (event.key.code == sf::Keyboard::W) {
                    character.move(0.0f, -moveSpeed * clock.restart().asSeconds());
                } else if (event.key.code == sf::Keyboard::S) {
                    character.move(0.0f, moveSpeed * clock.restart().asSeconds());
                } else if (event.key.code == sf::Keyboard::A) {
                    character.move(-moveSpeed * clock.restart().asSeconds(), 0.0f);
                } else if (event.key.code == sf::Keyboard::D) {
                    character.move(moveSpeed * clock.restart().asSeconds(), 0.0f);
                }
            }

            // 마우스 버튼 이벤트 처리
            if (event.type == sf::Event::MouseButtonPressed) {
                if (event.mouseButton.button == sf::Mouse::Left) {
                    character.setFillColor(sf::Color::Green);
                } else if (event.mouseButton.button == sf::Mouse::Right) {
                    character.setFillColor(sf::Color::Red);
                }
            }
        }

        // deltaTime 계산
        float deltaTime = clock.restart().asSeconds();

        // 입력 처리 (키보드 지속 입력)
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {
            character.move(0.0f, -moveSpeed * deltaTime);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
            character.move(0.0f, moveSpeed * deltaTime);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {
            character.move(-moveSpeed * deltaTime, 0.0f);
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
            character.move(moveSpeed * deltaTime, 0.0f);
        }

        // 화면 지우기
        window.clear();

        // 캐릭터 그리기
        window.draw(character);

        // 화면에 그리기
        window.display();
    }

    return 0;
}

결론

오늘은 SFML을 사용하여 게임 이벤트를 처리하는 방법을 학습했습니다. 기본적인 이벤트 처리부터 복합적인 이벤트 처리까지 다양한 예제를 통해 사용자의 입력에 따라 게임의 상태를 변경하는 방법을 배웠습니다. 질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "Day 16: 플레이어 입력 처리"에 대해 학습하겠습니다.

반응형