자바스크립트로 2D 게임을 만들어보자: Phaser(페이서) 프레임워크 입문 🎮
보통 ‘게임 개발’이라고 하면 Unity(유니티)나 Unreal Engine(언리얼 엔진) 같은 거대하고 무거운 엔진과 C#이나 C++ 같은 언어들을 먼저 떠올리기 마련입니다. 하지만 프론트엔드 개발자들에게 가장 익숙한 언어인 JavaScript/TypeScript만으로도 아주 훌륭한 2D 게임을 만들 수 있다는 사실 알고 계셨나요?
그 역할을 가장 완벽하게 수행해 내는 오픈소스 웹 게임 프레임워크가 바로 **Phaser(페이서, Phaser.io)**입니다. 오늘은 웹 브라우저에서 돌아가는 HTML5 게임 개발의 매력과 Phaser 프레임워크에 대해 소개해보겠습니다.
✨ Phaser란 무엇인가요?
Phaser는 웹 애플리케이션(브라우저) 환경에서 빠르고, 재미있는 2D 게임을 모바일과 데스크톱 모두에서 구동할 수 있도록 도와주는 방대한 자바스크립트 기반 게임 프레임워크입니다.
가장 흔한 웹 기술인 HTML5 Canvas와 WebGL 렌더링을 내부적으로 최적화하여 혼용 사용하므로, 브라우저가 제공하는 한계치를 뛰어넘는 60fps 이상의 부드럽고 빠른 그래픽 처리를 지원합니다.
왜 유니티 대신 Phaser를 쓸까요?
수십 기가의 무거운 툴바와 에디터를 설치할 필요 없이, 평소 쓰던 VS Code와 브라우저 환경 하나면 개발 환경 세팅이 5분 만에 끝납니다. 덧붙여 URL 하나만 던져주면 유저가 설치(Download) 과정 없이 즉시 게임을 시작할 수 있다는 점은 웹 게임이 가지는 가장 강력한 장점입니다.
🛠️ Phaser 프레임워크의 강력한 주요 기능들
Phaser는 단순한 렌더러가 아니라 게임 개발에 필요한 모든 것을 내장한 완성형 프레임워크입니다.
1. 강력하고 다양한 물리 엔진(Physics Systems) 내장
게임을 만들 때 캐릭터가 바닥으로 떨어지는 중력, 벽에 부딪히는 충돌 판정, 총알의 궤도 연산 등을 직접 수학 공식으로 다 짤 필요가 없습니다. Phaser는 용도에 맞게 선택할 수 있도록 Arcade Physics(아케이드 물리, 빠르고 가벼움)와 Matter.js(매터 물리, 매우 정교한 핑퐁/밧줄 움직임 처리 등)라는 서로 다른 물리 엔진을 빌트인으로 제공합니다.
2. 스프라이트 애니메이션과 파티클 시스템
캐릭터가 걷거나 공격할 때 이미지 프레임이 바뀌는 스프라이트 시트(Sprite Sheet) 애니메이션을 단 몇 줄의 코드로 구현할 수 있습니다. 거기에 화려한 불꽃놀이나 마법 이펙트를 연출할 수 있는 강력한 파티클 시스템(Particle System)도 내장되어 있어 시각적 연출이 훌륭합니다.
3. 모바일 친화적인 입력 제어 및 크로스 플랫폼
키보드, 마우스뿐만 아니라 모바일 환경에서의 터치, 스와이프 이벤트를 알아서 처리해 줍니다. 따라서 한 번 롬을 짜두면 스마트폰 브라우저에서도 멀티 터치로 완벽하게 돌아갑니다.
4. 씬(Scene) 매니저
메인 화면(Title), 게임 화면(Play), 랭킹 화면(Game Over) 등 게임의 각 단계를 Scene이라는 단위로 관리하도록 설계되어 있습니다. React의 라우터(Router) 시스템과 유사해서 상태 관리가 매우 깔끔해집니다.
🚀 1분 만에 뼈대 만들기 (기본 코드)
“게임 개발은 코드가 복잡할 것”이라는 선입견을 깨기 위해, Phaser의 가장 기본적인 틀을 살펴보겠습니다. Phaser의 Scene은 크게 3단계 생명 주기를 거칩니다.
preload(): 이미지, 음악, 맵 타일 등 게임에 쓰일 에셋들을 메모리에 불러옵니다.create(): 불러온 에셋을 바탕으로 캐릭터를 화면에 그리고 물리 판정을 지정하는 등 게임의 시작 세팅을 합니다.update(): 프레임마다(보통 1초에 60번) 호출되며, 캐릭터의 움직임을 계산하고 충돌 등을 지속해서 처리합니다.
/* 단순한 Phaser 게임 세팅 구조 */
const config = {
type: Phaser.AUTO, // WebGL과 Canvas 중 브라우저에 맞게 자동 선택
width: 800,
height: 600,
physics: {
default: 'arcade', // 기본 아케이드 물리 엔진 적용
arcade: { gravity: { y: 300 } } // 아래로 떨어지는 중력 세팅
},
scene: {
preload: preload,
create: create,
update: update
}
};
const game = new Phaser.Game(config);
function preload () {
this.load.image('sky', 'assets/sky.png');
this.load.image('star', 'assets/star.png');
}
function create () {
this.add.image(400, 300, 'sky'); // 배경 그리기
const star = this.physics.add.image(400, 100, 'star'); // 마리오 별처럼 떨어지는 이미지
star.setCollideWorldBounds(true);
star.setBounce(0.5); // 바닥에 닿으면 통통 튕김
}
function update () {
// 플레이어 조작에 따른 움직임 로직 담당
}
몇 줄 안 되는 자바스크립트 코드만으로 화면에 하늘이 뜨고 땅으로 통통 튕기며 떨어지는 별을 구현했습니다.
💡 마치며
JavaScript 하나로 세상에 없던 게임을 기획하고 브라우저로 띄우는 맛은 그 어떤 텍스트 코딩보다 즉각적이고 재밌는 카타르시스를 줍니다. 평소 머릿속에만 담아두었던 2D 미니 게임 아이디어가 있다면 이번 주말에 Phaser.io를 활용해 직접 만들어 Vercel에 올려보시는 건 어떨까요?