DragonRuby 개요 및 초기 설정
DragonRuby는 통합 퍼블리싱/내보내기 기능을 포함한 최첨단 2D 그래픽 엔진을 제공하며, 이는 비용을 상회하는 가치를 지닙니다. 성능 면에서는 Rails 앱에서 흔히 사용되는 CRuby 인터프리터와 달리, 게임 개발에 최적화된 mruby 런타임을 기반으로 하여 속도에 대한 우려를 불식시킵니다.
표준 라이선스 구매 후 플랫폼에 맞는 zip 파일을 다운로드하여 압축을 해제하면, dragonruby 실행 파일과 mygame 폴더가 나타납니다. mygame 폴더는 게임 로직을 담고 있으며, 새로운 게임 개발 시에는 항상 GTK의 신선한 사본을 사용하는 것이 모범 사례로 권장됩니다. 이는 패키징 및 배포 시 발생할 수 있는 경로 관련 문제를 방지하기 위함입니다. DragonRuby는 Ruby의 ‘Gem’ 개념이 없으며, mygame/lib에 Git 리포지토리를 클론하거나 download_stb_rb 함수를 통해 외부 라이브러리를 수동으로 관리합니다.
DragonRuby 게임의 구조
dragonruby 실행 시 터미널에 GTK 버전, 플랫폼, 게임 디렉토리 정보가 출력되며, 교육용 애니메이션이 포함된 창이 나타납니다. DragonRuby 게임의 핵심은 mygame/main.rb 파일에 정의된 tick 메서드입니다. 이 메서드는 초당 60회 호출되는 게임 루프의 역할을 하며, 게임의 모든 로직이 이곳에서 처리됩니다. args 객체는 I/O(비디오, 사운드, 컨트롤러), 이벤트 처리, 게임 상태 관리 등 DragonRuby API의 상당 부분을 래핑하는 ‘god object’ 역할을 수행합니다. args.state는 OpenStruct와 유사하게 게임 상태를 저장하고 수정하며, args.outputs.labels 및 args.outputs.sprites를 통해 화면에 텍스트나 이미지를 렌더링합니다.
스프라이트 렌더링 및 애니메이션
2D 게임의 핵심은 ‘스프라이트’라 불리는 미리 그려진 그래픽을 활용하는 것입니다. args.outputs.sprites를 사용하여 이미지 파일(예: dragonruby.png)을 특정 위치(x, y)와 크기(w, h)로 렌더링합니다. Kernel.tick_count 메서드는 게임 시작 이후 경과한 틱 수를 반환하며, 이를 활용하여 스프라이트의 각도(angle)를 변경하여 애니메이션을 구현할 수 있습니다. 게임 실행 중 백틱() 키를 눌러 DragonRuby 콘솔을 열면 args.state` 내용을 검사하고 게임과 상호작용할 수 있습니다.
입력 확인 및 게임 상태 업데이트
args.inputs.keyboard를 사용하여 현재 게임 틱에서 특정 키(예: 화살표 키)가 눌렸는지 확인할 수 있습니다. left, right, up, down과 같은 편의 메서드는 해당 키의 상태에 따라 true 또는 false를 반환합니다. 키 입력이 감지되면 args.state.logo_rect의 좌표를 업데이트하여 스프라이트의 움직임을 제어합니다.
‘Flappy Bird’ 클론 예제
‘Flappy Bird’ 클론 개발을 위해 Kenney.nl의 ‘Tappy Plane’ 팩에서 캐릭터, 장애물, 배경 스프라이트를 mygame/sprites에 복사합니다.
-
배경 그리기 및 애니메이션:
tick메서드 내에서 배경 스프라이트를 두 번 렌더링하고,Kernel.tick_count를 활용하여 X축 위치를 조정함으로써 움직이는 배경을 구현합니다. -
플레이어 스프라이트 렌더링:
args.state에 플레이어의 초기 위치를 설정하고, 배경 위에 비행기 스프라이트를 렌더링합니다. 이때 렌더링 순서가 중요합니다. -
힘 적용 (중력):
GRAVITY상수를 정의하고,args.state.dy(y축 변화량)에 중력을 지속적으로 적용하여 비행기가 아래로 가속하며 떨어지도록 합니다. -
입력 확인 (점프): 스페이스바 또는 마우스 왼쪽 버튼 입력 시
FLAP_POWER상수를args.state.dy에 추가하여 비행기가 위로 ‘펄럭’이도록 만듭니다. 이를 통해 플레이어는 비행기를 공중에 띄울 수 있습니다.