2024년 한국공학대학교 게임공학부 "스마트폰 게임 프로그래밍" 텀 프로젝트입니다.
게임 제목: 티노의 낙하 실험
최종 발표 Youtube 영상 링크
한손으로 즐길 수 있는 간단하고 부담 없는 게임
티노가 자신이 직접 만든 낙하산의 성능을 알아보기 위해 직접 낙하산을 차고 하늘 위에서 떨어져 낙하산이 얼만큼 버티는지 알아보려고 한다. 티노의 실험을 도와주자!
- 게임 월드는 가로 9m, 세로 16m의 크기를 갖는다.
- 스마트폰은 세로로 고정되며, 스마트폰 가로 해상도에 맞춰 크기가 조정된다.
- 게임 월드를 채우고 남은 여백의 공간은 검은색으로 채운다.
- 게임 월드 좌표계는 원점에서 오른쪽과 위쪽으로 증가하는 방향의 좌표계를 갖는다.
- 게임 월드 좌표계의 단위는 미터(m)이다.
- 게임 카메라는 게임 월드 좌표계의 x축이 0m, y축이 8m인 지점에 존재한다.
- 게임 내 플레이어 캐릭터가 이동한 y축 거리를 저장하고, 화면 위쪽 중앙에 표시한다.
- 게임이 끝난 경우 플레이어 캐릭터가 이동한 y축 거리와 획득한 재화를 표시하며,
이전에 이동한 거리보다 더 많이 이동한 경우 기록을 갱신한다.
- 사용할 수 있는 캐릭터는
티노
한 마리(?) 이다. - 티노는
가로 1.2m
,세로 1.6m
의 크기를 갖는다.
- 플레이어 캐릭터는 가운데를 중심점으로 한다.
- 플레이어 캐릭터의 처음 x축 위치는 0m이다.
- 플레이어 캐릭터의 y축 위치는 12.5m로 고정되어 있다.
- 플레이어 캐릭터는 3.25m/s의 속도로 오른쪽과 왼쪽 중 어느 한 방향을 향해 움직인다.
- 플레이어 캐릭터는 처음 시작할 때 오른쪽을 향하고 있다.
- 사용자가 화면을 터치하여 플레이어 캐릭터의 방향을 반대 방향으로 전환할 수 있다.
- 플레이어 캐릭터가 게임 월드 가장자리에 닿을 경우 반대 방향으로 전환된다.
- 플레이어 캐릭터는 중력가속도(-9.8m/s²)의 영향을 받아 점점 내려가는 속도가 빠르게 보인다.
- 플레이어 캐릭터의 내려가는 최대 속도는 제한되어 있다. (※1.4. 낙하산 상세 항목 참고)
- 플레이어 캐릭터가 장애물과 충돌하는 경우 게임 결과를 표시한다. (※1.3. 장애물 상세 항목 참고)
플레이어 캐릭터 티노는 다음 상태와 애니메이션을 갖는다.
- 위의 애니메이션을 보여준다.
- 사용자가 화면을 터치하여 이동 방향을 전환할 수 있다.
- 낙하산의 내구도가 30을 초과할 경우 해당 상태로 변경된다.
- 위의 애니메이션을 보여준다.
- 사용자가 화면을 터치하여 이동 방향을 전환할 수 있다.
- 아이템을 획득할 경우 해당 상태로 변경되며, 3초 이후 원래 상태로 복귀한다.
- 위의 애니메이션을 보여준다.
- 사용자가 화면을 터치하여 이동 방향을 전환할 수 있다.
- 낙하산의 내구도가 30이하일 경우 해당 상태로 변경된다.
- 위의 이미지를 보여준다.
- 사용자가 플레이어 캐릭터를 조종할 수 없다.
- 낙하산의 내구도가 0인경우 해당 상태로 변경된다.
- 위의 애니메이션을 보여준다.
- 사용자가 플레이어 캐릭터를 조종할 수 없다.
- 에너지 음료 아이템을 획득할 경우 해당 상태로 변경된다.
플레이어 캐릭터는 게임 종료 애니메이션을 보여주며 게임 결과를 표시한다.
게임 종료 애니메이션은 2가지가 있으며 각각 상황에 따라 다른 애니메이션이 표시된다.
- Dive상태일 때 게임 오버 처리가 발생할 경우 해당 상태로 변경된다.
- 위의 애니메이션을 보여준다.
- 해당 애니메이션을 보여준 후, 게임의 결과를 표시한다.
- Dive상태가 아닐 때 게임 오버 처리가 발생할 경우 해당 상태로 변경된다.
- 위의 이미지를 보여준다.
- 해당 이미지를 보여준 후, 게임의 결과를 표시한다.
- 장애물은 고정된 장애물과 움직이는 장애물로 나뉜다.
- 고정된 장애물과 움직이는 장애물은 무작위로 생성된다
- 모든 장애물의 세로 길이의 절댓값은 1.5m이다.
- 모든 장애물은 y축이 -32m인 위치에서 이전 장애물과의 거리가 24m가 될 때 생성된다.
- 모든 장애물의 y축 위치는 플레이어 캐릭터의 속도에 따라 움직인다.
- 장애물의 y축 위치가 -32m ~ 32m를 초과할 경우 비활성화 상태가 된다.
- 위의 그림에서 A와 같은 경우 게임 결과를 표시하고, B, C, D의 경우에는 낙하산의 내구도를 감소시킨다.
- 고정된 장애물은 오른쪽 장애물과 왼쪽 장애물이 한 쌍을 이룬다.
- 오른쪽 장애물은 오른쪽 가운데를 중점으로, 왼쪽 장애물은 왼쪽 가운데를 중점으로 한다.
- 고정된 장애물을 이루는 오른쪽 장애물과 왼쪽 장애물의 y축 위치는 같다.
- 고정된 장애물을 이루는 각 장애물의 가로 길이는 무작위한 값으로 고정된다.
- 고정된 장애물은 서로 만나지 않으며, 오른쪽 장애물과 왼쪽 장애물은 항상 3.2m만큼 떨어져 있다.
즉, 한쪽 장애물의 크기가 정해질 경우 다른쪽 장애물의 크기도 정해진다.
- 움직이는 장애물은 가운데를 중점으로 한다.
- 움직이는 장애물의 x축 위치는 -4.5m ~ 4.5m 사이에서 움직인다.
- 움직이는 장애물의 움직이는 속도는 1m/s ~ 5m/s사이의 무작위한 값을 갖는다.
- 움직이는 장애물의 가로 길이의 절댓값은 2.4m ~ 6.8m사이의 무작위한 값으로 고정된다.
- 낙하산은 0 ~ 100 사이의 내구도를 갖는다.
- 낙하산의 내구도는 초당 시간에 비례하여 소모된다.
- 낙하산에 내구도에 비례하여 -9m/s ~ -18m/s 사이의 최대 낙하 속도를 갖는다.
- 내구도가 0이 될 경우 플레이어 캐릭터를 조작할 수 없다.
- 내구도가 0이 될 경우 플레이어 캐릭터 수직으로 떨어진다. (게임은 장애물에 부딪치기 전까지 계속 진행됨)
- 내구도가 0이 될 경우 최대 낙하 속도는 -36m/s까지 증가한다.
- 내구도가 0이 되었을 때, 어떤 아이템을 먹어도 효과가 적용되지 않는다. (단, 좋아요 아이템은 예외)
- 아이템은
에너지 음료
,좋아요
,스패너
3가지가 있다. - 3가지 아이템은 무작위로 등장한다.
- 모든 아이템은 가운데를 중점으로 한다.
- 모든 아이템의 가로와 세로의 크기는 1m이다.
- 모든 아이템은 y축이 -32m인 위치에서 생성된다.
- 모든 아이템의 y축 위치가 -32m ~ 32m를 초과할 경우 비활성화 상태가 된다.
- 모든 아이템은 이전 장애물과 다음 장애물 사이 무작위한 위치에 존재한다.
- 플레이어 캐릭터와 아이템이 충돌할 경우 플레이어 캐릭터는 아이템의 효과를 적용받는다.
- 플레이어 캐릭터가 8초간 무적상태가 된다.
- 무적상태에서 낙하산의 내구도는 소모되지 않는다.
- 무적상태에서 최대 낙하 속도는 -36m/s까지 증가한다.
- 게임의 재화 역할을 한다.
- 게임 내 좋아요 횟수를 1증가시킨다.
- 낙하산의 내구도를 35만큼 증가시킨다.
Behavior Tree
를 사용한 플레이어 처리.Bounding Box
를 사용한 충돌 처리.Object Pool
을 사용한 장애물 생성 및 소멸.- 범위 내 랜덤한 길이를 가진 장애물 생성 및 배치.
- 범위 내 랜덤한 아이템 생성 및 배치.
- 아이템을 획득할 경우의 아이템 효과 처리.
- 티노가 낙하한 거리를 화면에 표시한다.
- 사용자의 터치 입력 처리.
- 벡터와 행렬 클래스를 만들어 사용함.
- 카메라 시스템을 만들어 사용함.
- 게임 루프
- 오브젝트 레이어링 시스템
- 투명한 장면을 이용한 일시정지 기능
- 메뉴 버튼들을 화면에 보여줍니다.
- 메뉴 버튼에는
게임 시작
,게임 종료
가 있습니다. 게임 시작
버튼을 누른 경우 게임 화면에 진입합니다.게임 종료
버튼을 누른 경우 애플리케이션을 종료합니다.- 최고 기록과 현재 보유중인
좋아요
의 갯수를 보여준다.
- 티노가 화면 위쪽에서 천천히 내려오면서 게임이 시작되려 함을 사용자에게 보인다.
- 게임 시작 전에 일정 좋아요를 지불하여
에너지 음료
아이템을 사용할 수 있게 한다.
- 게임을 진행한다.
- 장애물과 아이템이 무작위로 배치된다.
- 플레이어를 좌우로 이동시켜 장애물을 피하거나 아이템을 획득한다.
- 게임 오버 애니메이션을 보여준다.
- 총 이동 거리와 총 획득
좋아요
갯수를 보여준다.
Nintendo DSi의
종이비행기
게임과 비슷하다.
- 밑에서 위로 오른쪽 또는 왼쪽에 랜덤한 길이의 장애물이 나온다.
- 플레이어는 오른쪽 또는 왼쪽 방향으로만 이동한다.
- 배경이 움직이면서 플레이어가 이동하는 것 처럼 보이게 만든다.
- 개발자 코딩 컨벤션 문서화.
- Android 프로젝트 생성 및 설정.
- 게임 월드의 세부 단위 결정.
- 게임에 필요한 리소스 수집.
- 게임 Framework 구현.
- GameTimer 구현.
- GameScene 구현.
- GameLoop와 GameEvent 처리.
- 게임에서 사용되는 Renderer 구현.
- Transform 구현.
- GameCamera 구현.
- DrawPipeline 구현.
-
Behavior Tree를 이용한 각 행동에 따른 플레이어의 움직임 구현.(실패, 세분화) -
사용자 입력으로 플레이어 조종 구현.(실패)
- 플레이어의 움직임 및 조종 구현 (이월)
- 플레이어의 Default 상태를 구현
- 플레이어의 Scared 상태를 구현
-
플레이어의 Dive 상태를 구현(실패) - 플레이어의 이동 거리를 화면 맨 위쪽 가운데에 표시
- 현재 플레이어의 이동 거리를 보여주도록 UI를 갱신
- 낙하산의 내구도가 시간에 따라 감소
- 현재 낙하산의 내구도를 보여주도록 UI를 갱신
- 낙하산의 내구도가 30이하일 경우 플레이어 상태를 Scared 상태로 변경
-
낙하산의 내구도가 0이하일 경우 플레이어 상태를 Dive 상태로 변경(실패) -
화면 맨 위쪽 왼쪽에 낙하산의 내구도를 출력(실패) -
화면 맨 위쪽 오른쪽에 획득한 좋아요의 갯수를 출력(실패)
- 플레이어의 Dive 상태를 구현 (이월)
- 낙하산의 내구도가 0이하일 경우 플레이어 상태를 Dive 상태로 변경 (이월)
- 장애물 오브젝트를 화면에 출력
- 장애물 오브젝트의 크기를 무작위한 값으로 조정
- 장애물 오브젝트를 아래에서 위쪽으로 움직이게 구현
- 배경을 플레이어의 속도에 따라 움직이게 구현
- 장애물 오브젝트를 관리하는 ObjectPool을 구현
- 충돌처리를 위한 Bounding Box 자료형 생성
- Energy, Like, Spanner 아이템을 구현
- 아이템을 무작위한 위치에 생성되서 화면에 출력
- 아이템을 아래에서 위쪽으로 움직이게 구현
- 플레이어의 Happy 상태를 구현
- 플레이어의 Invincible 상태를 구현
- 플레이어와 Like, Spanner 아이템이 충돌할 경우 플레이어 상태를 Happy 상태로 변경
- 플레이어와 Energy 아이템이 충돌할 경우 플레이어 상태를 Invincible 상태로 변경
- 화면 맨 위쪽 왼쪽에 낙하산의 내구도를 출력 (이월)
- 화면 맨 위쪽 오른쪽에 획득한 좋아요의 갯수를 출력 (이월)
-
InGamePrepare 장면, InGameFinish 장면을 구현(실패) - InGameFinish 장면에서 상황에 따라 플레이어 애니메이션을 다르게 출력
- 플레이어와 장애물 오브젝트가 충돌할 경우 InGameFinish 장면으로 전환
-
InGamePrepare 장면에서 InGame 장면으로 전환(실패) -
Title 장면을 구현(실패) -
Title 장면에서 게임 시작 버튼을 누를 경우 InGamePrepare 상태로 전환(실패) -
Intro 장면을 구현(중단) -
Intro 장면에서 Title 장면으로 전환(중단)
- FinishGameScene에서 최고 기록을 출력하도록 구현 (세분화)
- PrepareGameScene 장면을 구현 (이월)
- PrepareGameScene 장면에서 InGame 장면으로 전환 구현 (이월)
-
게임 최고기록을 저장하는 기능을 구현(실패)
- 게임 최고기록을 저장하는 기능을 구현 (이월)
- Title 장면을 구현 (이월)
- Title 장면에서 InGamePrepare 장면으로 전환 구현 (이월)
- ResultGameScene 장면을 생성
- ResultGameScene 장면에서 결과를 출력하도록 구현
- 게임 배경음악 출력
- 아이템을 먹었을 때 효과음 출력
-
Title 장면에 장비 업그레이드 기능 구현(기획 수정) - 게임 시작 전에 좋아요를 지불하여 무적 아이템을 사용할 수 있도록 구현
차고에서 일정 좋아요
를 지불하여 낙하산
을 강화하게 한다.
발생한 문제점
낙하산
을 강화할 경우 게임 재미가 떨어짐.낙하산
강화에는 한계가 존재하기 때문에좋아요
를 계속 소비하지 못함.
게임 시작 전 일정 좋아요
를 지불하여 게임 시작과 동시에 에너지
아이템을 사용할 수 있도록 한다.
- 배경 이미지를 적용했더니 아이템의 시인성이 좋지 않아 빠르게 개선하기 위해 배경을 단색으로 할 수밖에 없어 아쉽다.
- 모방한 UI 시스템이 안정적으로 동작하지는 않아서 아쉽다.
- 클래스간 역할을 제대로 분해하지 못해 중복되는 코드가 곳곳에 있는 것이 아쉽다.
- 계발 일정이 빠듯하여 부드러운 시스템 애니메이션을 적용하지 못한 점이 아쉽다.
안드로이드 시스템과 게임 시스템 설계를 살펴볼 수 있는 점은 좋았으나, 게임에서 Java
를 사용하지 않기에 Android NDK
를 사용할지 기대를 했었고, 안드로이드의 Activity Lifecycle
에 대해 더 자세히 가르칠 필요가 있다고 생각한다. 결과적으론 좋은 수업이었으나, 자신만의 프레임워크가 확립된 4학년때 배우기 보단 2~3학년 사이에 수업을 들었으면 더 좋았을 것 같다.