반응형
게임 루프와 기본 게임 구조
게임 루프는 게임이 실행되는 동안 지속적으로 반복되는 코드 블록입니다. 게임 루프에서는 입력 처리, 게임 로직 업데이트, 그래픽 렌더링 등이 수행됩니다. 오늘은 게임 루프의 주요 구성 요소와 기본 게임 구조를 이해하겠습니다.
게임 루프의 주요 구성 요소
- 입력 처리 (Input Handling):
- 사용자의 입력을 받아 처리합니다. 키보드, 마우스, 게임패드 등 다양한 입력 장치의 입력을 처리할 수 있습니다.
- 게임 로직 업데이트 (Game Logic Update):
- 게임의 상태를 업데이트합니다. 플레이어의 이동, 적의 행동, 충돌 처리 등 게임의 주요 로직이 이 단계에서 처리됩니다.
- 그래픽 렌더링 (Rendering):
- 게임 화면을 업데이트합니다. 게임의 시각적 요소를 그려 화면에 표시합니다.
- 프레임 시간 계산 (Frame Time Calculation):
- 각 프레임의 소요 시간을 계산하여 일정한 속도로 게임이 실행되도록 합니다. 이를 통해 프레임 독립적인 게임 로직을 구현할 수 있습니다.
게임 루프 구현 예시
다음은 간단한 게임 루프의 예시입니다. 이 예시에서는 SFML을 사용하여 창을 생성하고, 게임 루프를 구현합니다.
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>
#include <iostream>
// 입력 처리 함수
void handleInput(sf::RenderWindow& window, sf::RectangleShape& player, float deltaTime) {
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);
}
// 게임 로직 업데이트 함수
void updateGame(sf::RectangleShape& player, std::vector<sf::RectangleShape>& enemies, float deltaTime) {
const float enemySpeed = 100.0f;
for (auto& enemy : enemies) {
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());
}
// 그래픽 렌더링 함수
void renderGame(sf::RenderWindow& window, const sf::RectangleShape& player, const std::vector<sf::RectangleShape>& enemies, const sf::Text& scoreText) {
window.clear();
window.draw(player);
for (const auto& enemy : enemies) {
window.draw(enemy);
}
window.draw(scoreText);
window.display();
}
int main() {
// 랜덤 시드 설정
std::srand(static_cast<unsigned>(std::time(nullptr)));
// 창 생성
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); // 창 중앙에 위치
// 적 캐릭터 생성
std::vector<sf::RectangleShape> enemies;
const int numberOfEnemies = 5;
for (int i = 0; i < numberOfEnemies; i++) {
sf::RectangleShape enemy(sf::Vector2f(50.0f, 50.0f));
enemy.setFillColor(sf::Color::Red);
enemy.setPosition(rand() % 750, rand() % 550); // 임의의 위치에 배치
enemies.push_back(enemy);
}
// 점수 시스템
int score = 0;
sf::Font font;
if (!font.loadFromFile("arial.ttf")) {
std::cerr << "Error loading font" << std::endl;
return -1;
}
sf::Text scoreText;
scoreText.setFont(font);
scoreText.setCharacterSize(24);
scoreText.setFillColor(sf::Color::White);
scoreText.setPosition(10.0f, 10.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();
// 입력 처리
handleInput(window, player, deltaTime);
// 게임 로직 업데이트
updateGame(player, enemies, deltaTime);
// 충돌 처리
for (const auto& enemy : enemies) {
if (isColliding(player, enemy)) {
// 충돌 시 게임 종료
window.close();
std::cout << "Game Over!" << std::endl;
}
}
// 점수 업데이트
score++;
scoreText.setString("Score: " + std::to_string(score));
// 그래픽 렌더링
renderGame(window, player, enemies, scoreText);
}
return 0;
}
결론
오늘은 게임 루프의 주요 구성 요소와 기본 게임 구조를 이해하고, 이를 구현해 보았습니다. 게임 루프는 게임 개발의 핵심이며, 입력 처리, 게임 로직 업데이트, 그래픽 렌더링 등의 작업이 포함됩니다. 질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "Day 8: 2D 그래픽 기본 개념"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++ 게임 개발 시리즈' 카테고리의 다른 글
[C++ 게임 개발 시리즈] Day 9: 스프라이트와 텍스처 (0) | 2024.08.01 |
---|---|
[C++ 게임 개발 시리즈] Day 6: 첫 번째 게임 프로젝트: 간단한 2D 게임 만들기 (3) (0) | 2024.08.01 |
[C++ 게임 개발 시리즈] Day 4: 첫 번째 게임 프로젝트: 간단한 2D 게임 만들기 (1) (0) | 2024.08.01 |
[C++ 게임 개발 시리즈] Day 5: 첫 번째 게임 프로젝트: 간단한 2D 게임 만들기 (2) (0) | 2024.08.01 |
[C++ 게임 개발 시리즈] Day 3: 개발 환경 설정 (Visual Studio, CMake, SFML/SDL 설치) (0) | 2024.08.01 |