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

[C++ 게임 개발 시리즈] Day 5: 첫 번째 게임 프로젝트: 간단한 2D 게임 만들기 (2)

by cogito21_cpp 2024. 8. 1.
반응형

적 추가 및 충돌 처리

이번 단계에서는 적 캐릭터를 추가하고, 플레이어와 적이 충돌했을 때 게임 오버 상태를 구현하겠습니다.

적 캐릭터 추가

  1. 적 캐릭터 정의:
    • main.cpp 파일에 적 캐릭터를 정의합니다.
    • 적 캐릭터는 플레이어 캐릭터와 같은 방식으로 사각형 모양으로 만듭니다.
// 메인 함수 내부에 추가 (플레이어 캐릭터 정의 아래)
sf::RectangleShape enemy(sf::Vector2f(50.0f, 50.0f));
enemy.setFillColor(sf::Color::Red);
enemy.setPosition(200.0f, 150.0f); // 임의의 위치에 배치
  1. 적 캐릭터 이동:
    • 간단한 AI를 사용하여 적이 플레이어를 따라다니도록 만듭니다.
    • 적의 속도를 정의하고, 매 프레임마다 플레이어의 위치를 향해 이동합니다.
// 메인 함수의 게임 루프 내에 추가 (플레이어 이동 처리 아래)
const float enemySpeed = 100.0f;
sf::Vector2f enemyDirection = player.getPosition() - enemy.getPosition();
float enemyDistance = std::sqrt(enemyDirection.x * enemyDirection.x + enemyDirection.y * enemyDirection.y);
enemyDirection /= enemyDistance; // 방향 벡터 정규화
enemy.move(enemyDirection * enemySpeed * deltaTime);

충돌 처리

  1. 충돌 감지 함수 작성:
    • 두 개의 사각형이 충돌했는지 감지하는 함수를 작성합니다.
bool isColliding(const sf::RectangleShape& rect1, const sf::RectangleShape& rect2) {
    return rect1.getGlobalBounds().intersects(rect2.getGlobalBounds());
}
  1. 충돌 처리:
    • 매 프레임마다 플레이어와 적의 충돌 여부를 확인하고, 충돌 시 게임을 종료하거나 게임 오버 메시지를 출력합니다.
// 메인 함수의 게임 루프 내에 추가 (그래픽 렌더링 처리 위)
if (isColliding(player, enemy)) {
    // 충돌 시 게임 종료
    window.close();
    std::cout << "Game Over!" << std::endl;
}

 

 

완성된 main.cpp 파일

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

bool isColliding(const sf::RectangleShape& rect1, const sf::RectangleShape& rect2) {
    return rect1.getGlobalBounds().intersects(rect2.getGlobalBounds());
}

int main() {
    // 창 생성
    sf::RenderWindow window(sf::VideoMode(800, 600), "Simple 2D Game");

    // 플레이어 캐릭터 생성
    sf::RectangleShape player(sf::Vector2f(50.0f, 50.0f));
    player.setFillColor(sf::Color::Green);
    player.setPosition(375.0f, 275.0f); // 창 중앙에 위치

    // 적 캐릭터 생성
    sf::RectangleShape enemy(sf::Vector2f(50.0f, 50.0f));
    enemy.setFillColor(sf::Color::Red);
    enemy.setPosition(200.0f, 150.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();

        // 플레이어 이동
        const float playerSpeed = 200.0f;
        sf::Vector2f movement(0.0f, 0.0f);

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {
            movement.y -= playerSpeed * deltaTime;
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
            movement.y += playerSpeed * deltaTime;
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {
            movement.x -= playerSpeed * deltaTime;
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
            movement.x += playerSpeed * deltaTime;
        }

        player.move(movement);

        // 적 이동 (플레이어를 향해)
        const float enemySpeed = 100.0f;
        sf::Vector2f enemyDirection = player.getPosition() - enemy.getPosition();
        float enemyDistance = std::sqrt(enemyDirection.x * enemyDirection.x + enemyDirection.y * enemyDirection.y);
        enemyDirection /= enemyDistance; // 방향 벡터 정규화
        enemy.move(enemyDirection * enemySpeed * deltaTime);

        // 충돌 처리
        if (isColliding(player, enemy)) {
            // 충돌 시 게임 종료
            window.close();
            std::cout << "Game Over!" << std::endl;
        }

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

        // 그래픽 렌더링
        window.draw(player);
        window.draw(enemy);

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

    return 0;
}

 

결론

두 번째 단계에서는 적 캐릭터를 추가하고, 플레이어와 적의 충돌을 처리했습니다. 게임이 조금 더 완성되어 가는 것을 볼 수 있습니다. 질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "Day 6: 첫 번째 게임 프로젝트: 간단한 2D 게임 만들기 (3)"에 대해 학습하겠습니다.

반응형