Red Ball – Billiard Minigame

Short Introduction

Red Ball – Billiard Minigame은 흰 공을 쳐서 빨간 공을 맞추어 점수를 획득하는 형태의 기록형 미니게임이다. 매 라운드마다 빨간 공을 맞추지 못하면 게임오버된다. 라운드가 거듭될수록 노란 공이 스테이지에 등장하며, 이는 게임을 어렵게 만드는 변수가 된다. (노란 공으로 빨간 공을 맞추어도 게임오버를 막을 수 있다.) 한번에 공을 많이 맞출수록 얻는 점수도 증가하기 때문에, 벽과 노란 공을 이용하여 전략적으로 플레이해야 높은 점수를 획득할 수 있다.

Content

  • 프로젝트 진행 동기

예전부터 이 게임을 머릿속에 구상해 두고 있었다. 예전에 비슷하게 만들어 보았으나, 물리엔진 구현 부분에서 여러 문제가 발생했었던 기억이 있다. 이번 프로젝트를 진행하면서 주변 회원들의 피드백도 받아가며 제작하면 더 좋은 결과물이 완성될 수 있을 것이다. IDEV에서 이 프로젝트를 진행할 수 있어서 다행이라고 생각한다.

  • 프로젝트의 진행 과정

계획서에 작성한 대로 스크래치 3.0을 이용하여 개발하였다. 개발한 부분은 크게 물리엔진과 디자인으로 나눌 수 있다.

1. 물리엔진

이 게임을 구현하는 데 있어서 가장 중요한 것이 바로 물리엔진이다. 플레이어가 불편해하지 않을 정도로 충분히 빠른 FPS를 지원하면서 버그는 최소로 해야 할 것이다. 여기서는 충돌 알고리즘을 구현하는 것이 쟁점이다.

가장 먼저 구현한 충돌 알고리즘은 FPS에서는 문제가 없었으나, 공이 가까이 붙어 있을 시 공을 통과하는 현상이 발생하였다. 충돌이 발생하여 속도를 바꿔준 뒤 겹치지 않을 때까지 다른 충돌 없이 이동하도록 하였는데, 이것 때문에 한 번의 충돌 이후 다른 충돌이 있을 때 바로 이어지지 못하고 그 공을 통과하였다. 생각보다자주 발생해서 고쳐야 할 필요를 느꼈다.

두 번째로 고안한 충돌 알고리즘은 아예 공들이 이동하는 방식을 바꾸는 것이었다. 마치 Thread처럼 미소 시간마다 공 하나씩 따로 움직이게 하는 것이었는데, 이 방식은 터보 모드를 적용했음에도 불구하고 느렸다. 따라서 또 다른 방법을 고안하였다.

마지막 방법은 첫 번째 방법과 비슷하게 공들을 한꺼번에 움직이도록 하지만, 충돌 후 겹치지 않을 때까지다른 충돌이 없도록 하는 것은 없애고 대신 두 공들이 서로 가까워지는 경우에만 충돌하게 하도록 하였다. (벡터의 내적을 생각하면 생각보다 구현하기 쉽다.) 이 방법을 적용하니 속도도 적절했으며 버그도 거의 발생하지 않았다. 따라서 이것을 채택하였다.

2. 디자인

디자인은 화려하게 하지는 않았다. 레트로 느낌이 나는 간단한 디자인으로 하였으며, 특히 숫자를 픽셀 모양으로 디자인하여 게임 특유의 느낌을 부여하였다.  효과음은 당구공을 칠 때와 공끼리 충돌할 때에 나도록 하였다.

  • 프로젝트의 결과

최종적으로 스크래치 프로젝트의 형태를 완성하였으며, html로 변환하여 누구나 편하게 플레이할 수 있도록하였다. 실제로 몇 번 테스트해본 결과 큰 장애 없이 게임이 잘 돌아감을 확인할 수 있었다. (scratch to html이라고 검색하면 변환 툴을 찾을 수 있다.) 또한 원래 컴퓨터 버전으로 만든 게임이었는데, 모바일 기기에서도잘 작동한다는 것을 확인하였다.

  • 프로젝트 진행 소감

우선 목표로 하였던 물리엔진 개선은 달성한 것 같아서 뿌듯하다. 다른 게임 개발 툴을 사용하였더라면 이미기본적으로 제공되었을지도 모르는 2D 운동 모델을 스크래치로 직접 구현해 보니 나름 원리도 깨달을 수 있었고 많은 것을 배워갈 수 있었던 것 같다. 아쉬운 점이라면 물리엔진 개발에 생각보다 많은 시간을 들여 디자인에 크게 신경을 쓰지 못한 점인데, 시간이 된다면 여러 디자인 요소를 더 집어넣고 싶다.

Attachments

https://drive.google.com/file/d/1bngHN-8P9dVRi1mBP9STYtfQ5HINA7wr/view?usp=sharing


About

본 글은 2022년도 1학기에 20 정민재 연구회원이 진행한 프로젝트입니다.

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다