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

[C++ 게임 개발 시리즈] Day 16: 플레이어 입력 처리

by cogito21_cpp 2024. 8. 1.
반응형

플레이어 입력 처리

플레이어 입력 처리는 게임의 핵심 요소 중 하나입니다. 플레이어는 키보드, 마우스, 게임패드 등 다양한 입력 장치를 통해 게임과 상호작용합니다. 오늘은 SFML을 사용하여 플레이어 입력을 처리하는 방법을 학습하겠습니다.

기본적인 입력 처리

SFML은 sf::Keyboardsf::Mouse 클래스를 사용하여 키보드와 마우스 입력을 처리할 수 있습니다.

키보드 입력 처리

키보드 입력은 sf::Keyboard::isKeyPressed 메서드를 사용하여 특정 키가 눌려 있는지 확인할 수 있습니다.

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

int main() {
    // 창 생성
    sf::RenderWindow window(sf::VideoMode(800, 600), "Keyboard Input 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();
        }

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

마우스 입력 처리

마우스 입력은 sf::Mouse::isButtonPressed 메서드를 사용하여 특정 마우스 버튼이 눌려 있는지 확인할 수 있습니다.

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

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

    // 원 생성
    sf::CircleShape circle(25.0f);
    circle.setFillColor(sf::Color::White);
    circle.setPosition(375.0f, 275.0f); // 창 중앙에 위치

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

        // 마우스 위치 가져오기
        sf::Vector2i mousePosition = sf::Mouse::getPosition(window);

        // 마우스 클릭 처리
        if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
            circle.setPosition(mousePosition.x - circle.getRadius(), mousePosition.y - circle.getRadius());
        }

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

        // 원 그리기
        window.draw(circle);

        // 화면에 그리기
        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 Input 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::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 17: 게임 상태 관리"에 대해 학습하겠습니다.

반응형