게임만들기(11) - "JAVADOT" 플랫폼게임 - 완료

2021. 8. 23. 10:41프로그래밍/개인프로젝트

JavaFX를 이용해서 플랫폼게임을 만드는 과정을 기록합니다.

https://github.com/coqoa/JAVADOT_PlatformGame



JAVADOT

제작동기 및 목표

처음 배우는 언어로 자바를 선택했고 자바의 GUI인 javafx로 게임을 만들어 보고 싶었습니다.
javafx로 게임을 만들기 위해 참고할 사이트는 비교적 제한적이었고 이 부분이 오히려 짧은 시간에 더 많이 배울 수 있는 밑거름이 됐다고 생각합니다.
저는 무엇이든 첫 단추를 끼우는 게 가장 중요하다고 생각합니다.
목표는 무조건 내가 만족할 수준으로 배포하기 입니다.


제작기간

2021.06.24~ 08.23


 

 

https://www.youtube.com/watch?v=V6vTG9MVplU 


JAVADOT은 도트 플랫포머 게임입니다.

게임의 목표

Player는 해저에서부터 시작해서 해수면, 육지, 비바람과 번개가 몰아치는 하늘을 건너 태양에 도달해야 합니다.

게임의 특징 :

1. 점프 횟수에 제한이 있다.
2. 땅을 밟으면 점프를 1회 할 수 있다.
3. energy를 먹으면 점프 횟수를 1 추가한다.
4. 각종 상호작용 블럭에 의해 죽을 수 있다.
5. 죽으면 첫 스테이지부터 다시 시작한다.

키설명

행동
이동 <-,->
점프 spacebar
재시작 esc
볼륨 on = F11, off=F12

 

- 시연을 위해 숫자키 2 ~ 8, F1 ~ F7 키를 통해 순간 이동할 수 있게 구현해놨습니다.


Stage설명 및 상호작용하는 블럭 설명

JAVADOT은 1 Stage에서 7 Stage까지 존재합니다.
Player와 상호작용하는 블럭들을 적절히 이용해서 스테이지를 클리어하면 됩니다.

시작페이지

➥ 시작 페이지입니다.


기본적인 상호작용

➥ energy 블럭입니다. (먹으면 점프 횟수가 늘어납니다)


➥ door 블럭입니다. (접촉시 다음 스테이지로 넘어갑니다)


➥ 화면 아래로 벗어나면 1 Stage부터 재시작합니다.


1 Stage : 해저

 

1 Stage 코드 및 사진을 보려면 클릭하세요. 🧐

 

➥ 해저를 표현하기 위해 바닥은 모래색으로 표현했습니다.


➥ 수중에서 헤엄치는 느낌을 주기위해 닿으면 점프를 할 수 있는 블럭을 곳곳에 배치했습니다.


➥ 맵의 디자인 요소로 하얀색 블럭으로 공기방울을 표현했습니다.

(속도를 다양하게 구현해서 좀 더 사실적으로 표현할 수 있었습니다)

➥ 해초류를 그렸고 밟을 수 있는 해초류와 밟지 못하는 해초류는 색으로 구분했습니다.



2 Stage : 수중

 

2 Stage 코드 및 사진을 보려면 클릭하세요. 🧐

 

➥ 해초의 줄기를 표현하기 위해 초록색 객체를 사용했고 이 객체는 밟고 다니거나 옆에 붙을 수 있습니다.

(붙었을 때는 투명해지도록 구현을 해 뒀습니다)


3 Stage : 해수면

 

3 Stage 코드 및 사진을 보려면 클릭하세요. 🧐

 

➥ 벽에 붙지않는 블럭입니다.


➥ 닿으면 1 Stage부터 재시작하는 하얀색 블럭입니다.


➥ 점프해서 밟으면 높이 뛰는 발판입니다.


4 Stage : 육지

 

4 Stage 코드 및 사진을 보려면 클릭하세요. 🧐

 

➥ 짚라인을 표현하기 위해 만든 블럭으로 Player를 좌,우로 이동시켜줍니다.


5 Stage : 하늘과 비바람

 

5 Stage 코드 및 사진을 보려면 클릭하세요. 🧐

 

➥ 먹구름은 아래에서도 통과할 수 있으며, Player가 두려워도 앞으로 나아가는 것을 표현하고자 덜덜 떨게 만들었습니다.


➥ 비를 맞으면 1 Stage부터 재시작합니다.


➥ 공기저항을 표현하기 위해 만들어진 블럭입니다. (낙하속도가 줄어듭니다)


6 Stage : 고난과 역경

 

6 Stage 코드 및 사진을 보려면 클릭하세요. 🧐

 

➥ 위, 아래로 움직이는 블럭입니다. (아래에서 통과할 수 없습니다)


7 Stage : 먹구름과 번개 그리고 태양.

 

7 Stage 코드 및 사진을 보려면 클릭하세요. 🧐

 

➥ 번개입니다. (맞으면 1 Stage부터 재시작합니다)


➥ 태양입니다. (태양에 들어가면 게임 클리어입니다)


Clear

 

clear 코드 및 사진을 보려면 클릭하세요. 🧐

 



개발할 때 가장 힘들었던 문제를 해결한 방법

javafx의 scene을 이동시키는 문제

간단하게 생각해서 '실행하는동안 변경된 값'들을 원위치 시키는걸로 구현
(코드 간소화로 인한 가독성증가, 메모리 자원 절약 등등 이번프로젝트에서 가장 맘에드는 해결방법)

javafx의 scene을 이동시키는 문제

 

화면 이동시 프레임 드랍 현상

화면을 이동시키는 moveCamera()메서드를 멀티스레드로 관리
Player객체의 프레임당 이동거리조절 (1->0.5로 줄여서 같은 시간 대비 더 많은 프레임을 그리도록 함)

moveCamera()메서드 멀티스레드관리

Player객체의 프레임당 이동거리조절

 

처음 실행시 걸리는 렉을해결하기위한 방법

mainContainer를 구성하는 mainPage()메서드를 멀티스레드로 관리
ObjectData1.java에서 0으로 표현되는 쓸데없는 리소스 정리

렉을해결하기위한 방법


개인프로젝트 진행 중에 느낀 점

왜?,내생각이 가장 중요하다.

코딩은 나의 생각을 코드로 표현하는것이므로 생각이 중요합니다.
같은 문제라도 생각에 따라서 쉽게 해결할 수도, 어렵게 해결할 수도 있는상황을 실제로 경험했습니다.
(해결이 안될땐 다른방법으로 접근도 해보고 처음으로 돌아가보기도 했음)
문제해결을위해 검색을 하기전에 내 생각을 먼저 정리하는 과정이 사고확장에 아주많은 도움이 됐고, 검색어를 좀 더 상세하게 설정할 수 있었습니다.
(로직을 한번더 생각해보거나, 좀더 근본적인 문제에 접근하는등..)

코딩을 시작하기전 대략적인 설계를 하는것은 필수

차분히 글을 써보거나 그림을 그려본 후에 그걸 토대로 코드를 작성 하는것이 전체적인 구조를 짜는데 많은 도움이 됐습니다.

개발기록의 중요성

의미있는 제목으로 커밋하는것이 중요합니다 이는 앞으로의 목표수립이나 데드라인을 설정하는데 많은 도움이 됐습니다.
개발할 당시 나의 생각을 일기형식으로 정리했는데 공부를 지속하는데 많은 도움이 되었습니다.
(작은목표를 반복적으로 달성해서 성취감을 느낄 수 있었고, 문제해결을 위한 끊임없는 고민하는 등 노력대비 아주 많은것을 얻을 수 있는 방법이라고 생각합니다)

최적화하는 방법은 매우 매우 매우 다양하다

이번 프로젝트에서 적절한 멀티스레드를 사용해보고, 메모리절약과 성능향상을 위한 코드 리팩토링, 중복의 제거를 통해 코드 가독성을 높여 개발시간을 단축하려고 많은 노력을 했습니다.
수 많은 방법이 있었고 아직 모르는 많은 방법들이 훨씬 많기에 더욱 열심히 공부해야겠다는 생각을 할 수 있었습니다.

이도저도아닌 애매한 결과물은 나의 이력에 별로 도움이 안된다.

나를 나타내는것은 결과물의 퀄리티입니다.
내가 만족할 정도의 수준으로 구현하려고 노력하는 과정에 결과물도 당연히 좋아지고 배우는것도 많았습니다.
내가 만든 앱은 내가 제일 잘 알기에 남에게 설명하기 위해 공부하는 과정에 더 확실히 알게됐고 설명하는능력도 향상됐습니다.
이는 개발자로서 가치를 올리는데 매우 중요한 요소라고 생각합니다.

e-mail : coqoa28@gmail.com
Blog : http://coqoa.tistory.com
GitHub : https://github.com/coqoa
YouTube : https://www.youtube.com/channel/UCKX7icIXjZvYNBZTmFhlwOQ