환영합니다

게임

Save the Valley

C++17SFML 2.6CMakeSimplex Noise

자체 엔진 구조로 C++에서 처음부터 만든 2D 샌드박스 게임입니다. 무한 절차적 월드 생성, 여러 무기를 쓰는 전투 시스템, 상태 머신 기반 적 AI, 청크 단위로 최적화한 렌더링을 게임 엔진 없이 구현했습니다.

문제

목표는 완성도 높은 제품을 출시하는 것이 아니라, 게임 엔진이 실제로 무엇을 추상화하는지 이해하는 것이었습니다. 대부분의 개발자는 Unity나 Unreal을 쓰고 렌더 루프, 엔티티 시스템, 충돌 파이프라인을 직접 다룰 일이 없습니다. 당연하게 여겼을 저수준 시스템을 제대로 이해하기 위해 이런 요소들을 C++로 직접 만들어 보고 싶었습니다.

주요 결정

게임 엔진 없이, SFML만 의존하는 순수 C++

SFML은 창, 입력 이벤트, 텍스처 렌더링만 담당합니다. 씬 그래프도, 물리 엔진도, 에셋 파이프라인도 없습니다. 엔티티 업데이트 루프, 공간 분할, 카메라 시스템을 직접 작성하면서 엔진을 썼다면 완전히 가려졌을 성능 예산과 메모리 배치에 대해 고민하게 되었습니다.

전체 맵을 불러오는 대신 청크 기반 월드

무한한 월드는 한 번에 메모리에 올릴 수 없습니다. 월드를 고정 크기 청크로 나누고 플레이어 근처의 청크만 활성화합니다. 플레이어가 경계를 넘으면 뒤쪽 청크는 직렬화되어 해제되고, 앞쪽 청크는 불러오거나 새로 생성됩니다. 그래서 플레이어가 얼마나 멀리 이동하든 메모리 사용량이 일정하게 유지됩니다.

적 AI에 행동 트리 대신 유한 상태 머신

처음에는 행동 트리 라이브러리로 프로토타입을 만들었지만, Idle, Wandering, Hunting 세 가지 상태에는 과했습니다. 명시적인 전이를 가진 FSM은 파일 하나로 읽을 수 있었고, 현재 상태를 출력하는 것만으로 쉽게 디버깅할 수 있었으며, 수백 마리의 적이 프레임 시간에 영향 없이 동작할 만큼 빨랐습니다. 복잡성은 문제가 실제로 요구할 때만 정당화됩니다.

지형 생성에 Perlin 대신 Simplex 노이즈

Perlin 노이즈는 특정 주파수에서 축 방향으로 정렬된 아티팩트가 보여 지형이 격자처럼 보이기 시작합니다. Simplex 노이즈는 회전에 불변하고 기울기가 더 등방적이어서, 후처리 없이도 더 자연스러운 지형 윤곽을 만듭니다. 계산 비용은 비슷합니다.

결과

이 프로젝트는 3개월 동안 저녁과 주말을 들여 완성했습니다. 마지막에는 작동하는 무한 월드, 세 가지 무기의 전투 시스템, 청크 경계를 넘어 플레이어를 쫓는 적 AI를 갖추게 되었습니다. 무엇보다 렌더링 파이프라인, 공간 분할, 게임 루프 구조를 구체적으로 이해하게 되었고, 실시간 시스템이 들어가는 모든 프로젝트에 이 경험을 활용하고 있습니다.

기능

절차적 월드

  • 동적으로 로드/언로드되는 무한 청크
  • 고유한 지형 생성을 가진 여러 바이옴
  • 타일 종류 사이의 자연스러운 전환을 위한 오토타일링
  • 충돌하는 오브젝트: 나무, 바위, 구조물

전투 시스템

  • 동적 히트박스를 가진 검, 도끼, 망치
  • 체력, 피해, 일시적 무적 프레임
  • 공격, 피격, 사망 애니메이션

적 AI

  • 상태 머신: Idle → Wandering → Hunting
  • 범위 기반 플레이어 감지
  • 장애물을 피하며 추격

렌더링

  • 청크 기반 렌더링 (보이는 청크만 그림)
  • 레이어 구분: 지형 / 오브젝트 / 엔티티
  • 부드러운 카메라 + 충돌 디버그 모드

데모

월드 생성

전투

함께 일해요