반응형
적 추가 및 충돌 처리
이번 단계에서는 적 캐릭터를 추가하고, 플레이어와 적이 충돌했을 때 게임 오버 상태를 구현하겠습니다.
적 캐릭터 추가
- 적 캐릭터 정의:
main.cpp
파일에 적 캐릭터를 정의합니다.- 적 캐릭터는 플레이어 캐릭터와 같은 방식으로 사각형 모양으로 만듭니다.
// 메인 함수 내부에 추가 (플레이어 캐릭터 정의 아래)
sf::RectangleShape enemy(sf::Vector2f(50.0f, 50.0f));
enemy.setFillColor(sf::Color::Red);
enemy.setPosition(200.0f, 150.0f); // 임의의 위치에 배치
- 적 캐릭터 이동:
- 간단한 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);
충돌 처리
- 충돌 감지 함수 작성:
- 두 개의 사각형이 충돌했는지 감지하는 함수를 작성합니다.
bool isColliding(const sf::RectangleShape& rect1, const sf::RectangleShape& rect2) {
return rect1.getGlobalBounds().intersects(rect2.getGlobalBounds());
}
- 충돌 처리:
- 매 프레임마다 플레이어와 적의 충돌 여부를 확인하고, 충돌 시 게임을 종료하거나 게임 오버 메시지를 출력합니다.
// 메인 함수의 게임 루프 내에 추가 (그래픽 렌더링 처리 위)
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)"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++ 게임 개발 시리즈' 카테고리의 다른 글
[C++ 게임 개발 시리즈] Day 7: 게임 루프와 기본 게임 구조 (0) | 2024.08.01 |
---|---|
[C++ 게임 개발 시리즈] Day 4: 첫 번째 게임 프로젝트: 간단한 2D 게임 만들기 (1) (0) | 2024.08.01 |
[C++ 게임 개발 시리즈] Day 3: 개발 환경 설정 (Visual Studio, CMake, SFML/SDL 설치) (0) | 2024.08.01 |
[C++ 게임 개발 시리즈] Day 2: 게임 개발 도구와 엔진 소개 (Unreal, Unity, SFML, SDL) (0) | 2024.08.01 |
[C++ 게임 개발 시리즈] Day 1: 게임 개발 개요와 역사 (0) | 2024.08.01 |