메인 콘텐츠로 건너뛰기

직접 만든 게임과 C++ 코드 리뷰, 진짜로 인상적인 RayLib 프로젝트 이야기

요약

클립으로 정리됨 (생성형 AI 활용)

출처 및 참고 : https://www.youtube.com/watch?v=eopps3YF6aE

간단한 2D 슈팅 게임 하나가 이렇게까지 완성도 높을 수 있다는 것, 그리고 C++로 어떤 구조적 접근이 가능한지까지 생생하게 경험한 리뷰를 소개합니다. 오늘은 RayLib 기반의 라이브러리 위에 만든 'Spectrum'이라는 게임을 살펴봅니다. 단순한 게임이지만 눈길을 끄는 디테일부터 코드 설계, 개선 포인트까지 모두 배우고 갈 수 있는 시간! 만약 여러분도 C++로 게임을 만들거나 라이브러리 구조에 관심이 있다면, 확실히 얻어갈 게 많은 포스팅이 될 거예요.

RayLib 활용 게임, 'Spectrum'의 첫인상과 게임 플레이

RayLib을 기반으로 만든 라이브러리와 ECS(엔티티 컴포넌트 시스템) 등 각종 시스템을 포함한 게임, 'Spectrum'. 처음 실행해 보면, 착실하게 만들어진 게임임을 바로 느낄 수 있습니다. 다양한 색의 적들을 물리치며 코인을 모아, 상점에서 속도, 최대 체력, 데미지 등을 업그레이드할 수 있죠.

게임 플레이는 부드럽고 사운드와 효과, 카메라 흔들림 등의 디테일이 살아 있습니다. 단순한 픽셀 스타일이지만 글로우(Glow) 효과와 파티클 효과 덕분에 시각적으로 세련된 느낌을 주며, 처음부터 끝까지 매끄러운 UX가 돋보였어요. 다만 전체적인 난이도는 낮은 편이었고, 콘텐츠가 조금 부족하게 느껴졌습니다. 그래도 개인 개발 게임 치고는 완성도가 상당합니다.

RayLib 위에 직접 구현한 C++ 라이브러리 구조의 특징

이 게임의 가장 큰 특징 중 하나는 RayLib 엔진에 추가로 직접 설계한 C++ 라이브러리의 사용입니다. 해당 라이브러리에는 ECS 방식의 씬(scene) 관리, 오디오 시스템 등 복수의 커스텀 시스템이 포함되어 있습니다.

핵심적인 설계 방식은 구현체 분리(Implementation hiding)를 통해 외부에 세부 구조를 드러내지 않는 점인데, 실제로 게임 클래스와 그 내부 구현 클래스를 분리해 관리합니다. 하지만 이런 분리 방식이 반드시 필요한 경우(플랫폼별 구성이 완전히 다를 때 등)가 아니라면, 오히려 코드 가독성이 떨어질 수 있습니다. 코드 리뷰 시에는 불필요한 속성 노출을 막되, 코드 복잡도와 성능 영향을 적절히 저울질해야 한다는 점을 기억하세요.

C++ 템플릿과 타입 체크: 란타임이 아닌 컴파일 타임의 중요성

이 프로젝트에서 씬 등록 로직은 '기본(Scene) 클래스'를 상속한 타입만 등록할 수 있게 if문으로 잡아두었지만, 사실 C++에서는 컴파일 타임 체크가 훨씬 더 효율적입니다. 최신 C++20 이상에서는 concepts(개념) 기능을 이용해 "템플릿 타입이 반드시 Scene을 상속해야 한다"는 조건을 컴파일 단계에서 강제할 수 있죠.

이런 방식은 불필요하게 런타임에서 예외를 발생시키기보다, 컴파일 에러로 미리 오류를 알 수 있어 유지보수성과 성능, 안정성을 동시에 잡을 수 있습니다. C++ 코드 설계 시 시간 체크를 최대한 컴파일로 당겨오는 습관을 들이면 여러모로 도움이 돼요.

전역 에셋 관리와 구조 개선 아이디어

이 게임은 초기화 시에 폰트, 오디오 파일 등 '전역(Global) 에셋' 목록을 관리하는데, 쌍(pair) 형태의 벡터(vector)로 각 에셋 타입과 경로를 연결해놨습니다. 단순 리스트로 처리해도 나쁘진 않지만, 에셋 타입(예: 폰트, 사운드)별로 중복 관리나 실수(타입 오타 등)를 줄이고, 확장성을 높이기에는 map(맵) 자료구조나 enum 사용이 더 효율적입니다.

복잡한 에셋 로딩이 필요한 경우라면 구조별 '직렬화 함수'를 맵에 매핑해 직접 호출하는 패턴(예: Hazel 엔진의 Serializer 패턴처럼)을 참고해볼 만합니다. 기본적으로 전역 에셋/씬 에셋을 분리 관리하는 접근은 매우 모범적인 설계 방식입니다.

시스템 관리자(System Manager)를 활용한 모듈화와 확장성

게임에는 각종 시스템을 통합 관리하는 System Manager가 적용되어 있습니다. 각 시스템의 일시 중단이나 갱신 여부를 관리하고, 렌더링 등 주요 작업을 일괄적으로 처리하도록 설계되어 있죠.

이런 매니저 패턴은 이후 게임이 커지고 기능이 복잡해질 때 유지보수와 기능 확장에 큰 힘을 발휘합니다. 특히 엔진 구조에서도 비슷한 방식의 '엔진 시스템 매니저'까지 활용한다면, 코드 중복을 줄이고 개발 생산성을 높일 수 있습니다. 여러분이 게임 구조를 설계한다면 반드시 시스템 관리자의 도입을 고려해보세요.

RayLib의 렌더링 버그와 해결 방법

리뷰 중 발견된 대표적 버그는 바로 "게임 창 최소화 후 복원 불가" 문제! 알고 보니 RayLib 프레임워크가 이벤트 폴링(poll events) 과정을 렌더링(endDrawing) 함수 안에 숨겨두고 있었습니다. 최소화 상태에서는 렌더링 루프가 멈추면서, 이벤트 갱신도 중단되어 복원이 되지 않던 것이죠.

해결 방법은, 최소화 상태에서도 이벤트 폴링을 별도로 호출하는 조건문을 추가하는 것입니다. 이렇게 원인을 파악하고 직접 수정해본 경험 자체가, 프레임워크를 쓸 때 내부 동작을 체험적으로 이해하는 데 큰 도움이 됩니다.

Bloom 효과와 실제 시각 효과 처리

'글로우'라 불리는 Bloom은, 대부분 텍스처에 직접 적용하는 경우가 많지만, 이 게임은 실제로 셰이더(Shader)를 통해 화면에 번짐 효과를 구현했습니다. 저해상도 픽셀 게임에서는 복잡한 Bloom 대신 가볍고 심플한 셰이더만으로도 충분하며, 실제로 깨끗하고 세련된 결과를 보여줬습니다.

게임의 리소스 관리 패턴을 살펴보면, 씬마다 필요한 자원을 별도로 로딩/언로드하는 구조까지 갖추고 있어 작은 규모지만 게임 엔진 설계의 핵심을 잘 반영하고 있습니다.

입력 관리와 람다, 그리고 스크립트 구조의 아쉬움

키 입력에 따라 각종 람다 함수가 사전에 등록되어 동작하는 구조도 흥미롭습니다. 간단한 게임에는 손쉽게 적용할 수 있는 방식이지만, 만약 복잡한 게임 로직이나 동적인 입력 처리가 늘어난다면, 좀 더 명확한 스크립트 패턴(예: onUpdate와 같은 이벤트 중심 루프)이 유지보수와 확장에 유리하다는 점도 참고하면 좋습니다.

AI 기반 코드 리뷰 툴 'Code Rabbit' 소개

이번 리뷰에는 AI 코드 리뷰 툴인 Code Rabbit CLI도 등장합니다. MacOS와 Linux에서 바로 터미널에서 동작하며, 버그와 논리 오류, 보안 문제까지 자동 검출해주는 기능을 제공합니다. 10만 개 이상의 Pull Request 리뷰 경험을 갖추고, AI 코드 생성 툴들과 호환되니 실제 개발 현장에서 코드 품질을 높이고 싶은 분이라면 꼭 써보길 추천합니다.

이 프로젝트에서 배우는 C++ 게임 개발의 실전 노하우

'Spectrum' 게임 프로젝트는 단순한 아이디어와 가볍게 만든 인터페이스부터, 깊이 있는 코드 구조, 시스템 관리, 렌더링 효과, 자원 관리까지 모두 잘 보여줍니다. RayLib 같이 심플한 엔진 위에서도 충분히 고급스러운 게임 결과물을 뽑아낼 수 있다는 것을 증명했죠.

게임을 구성하는 각종 시스템 매니저, 씬 관리, 타입 체크, 전역 에셋의 효율적 분리 등 모든 부분에서 실제로 적용할 수 있는 개선 아이디어가 많았습니다. 무엇보다 직접 설계한 라이브러리와 기초부터 쌓아올린 코드를 꼼꼼히 리뷰하면서, 사소한 버그나 프레임워크 한계까지 파악하고 수정한 과정 자체가 인상적이었습니다.

만약 당신도 C++ 게임 개발에 도전한다면, 이런 구조적 접근과 개선 아이디어, 그리고 문제 해결 경험을 반드시 참고해보세요!

마지막으로, 프로젝트 품질이 이렇게 뛰어난 경우 직접 실행해보는 것만큼 많은 것을 배우기 어렵습니다. RayLib과 C++의 구조적 장점을 최대한 활용하며, 사소한 불편함까지 직접 개선하는 과정을 담아낸 '실전 코드 리뷰 시리즈'—여러분도 자신의 프로젝트를 한 번 리뷰 받고 싶다면 이메일(채널 review@gmail.com)로 코드를 보내보세요. 끝까지 읽어주셔서 감사합니다! C++ 게임 개발, 오늘부터 한 단계 더 업그레이드 해보는 건 어떨까요?

출처 및 참고 :

이 노트는 요약·비평·학습 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.