프로젝트 스페이스슈터 DirectX9

DirectX9으로 종스크롤 슈팅 게임을 만들면서 가장 크게 배운 점은 “화면이 바빠질수록 게임이 무거워진다”는 아주 단순한 사실이었다.
<슈팅 플레이 기본 화면 이미지 필요>
플레이어가 미사일을 계속 발사하고 적 함선이 몰려오면 탄환, 적, 이펙트가 동시에 늘어나는데, 이때 프레임이 떨어지면 난이도보다 조작 스트레스가 먼저 올라갔다.

그래서 이 프로젝트는 연출 강화보다 전투 루프를 버티게 만드는 구조 설계에 더 집중했다.

처음에는 탄환과 이펙트를 생성/삭제로 처리했는데 웨이브가 겹치는 구간에서 성능이 급격히 떨어졌다.

이 부분은 오브젝트 풀링으로 바꿔서 메모리 할당/해제 비용을 줄였고, 효과가 바로 나타났다.

충돌도 한 번에 다 검사하지 않고 레이어를 분리해서 탄환-적, 적-플레이어, 폭발 범위를 각각 처리했다.

이렇게 분리하니 검사 횟수가 줄고 디버깅도 쉬워졌다.

궁극기는 화면 내 적을 일괄 제거하는 방식이라 전투 루프와 충돌하기 쉬웠다.
<궁극기 발동 장면 이미지 필요>
그래서 발동 프레임에서 대상 리스트를 먼저 고정한 뒤 순차 처리하는 방식으로 바꿨고, 처리 도중 새로 생성된 적과 섞이는 문제를 줄였다.

웨이브는 시간 기반 스케줄링으로 관리하면서 패턴 조합을 조금씩 바꿔 플레이 템포가 단조롭지 않게 맞췄다.

결국 사용한 기술은 DirectX9, C++, AABB 충돌 판정, 오브젝트 풀링, 스폰 큐 스케줄링처럼 기본적인 것들이었다.
<충돌 판정 또는 디버그 오버레이 이미지 필요>
하지만 이 기본 요소들을 어떤 순서로 실행하고 어떤 기준으로 분리하느냐가 플레이 감각을 결정했다.

P.S

이 프로젝트는 슈팅 게임에서 화려한 무기보다 충돌 처리와 메모리 재사용 같은 기초 알고리즘이 실제 재미를 지탱한다는 걸 느끼게 해준 것 같다.

Author avatar

웨이호프

WordPress creator and blogger.

View all posts