자바 수업시간에 선생님께서 각자의 자유 과제 발표를 준비하라며 수업때마다 1~2시간 정도의 자유시간을 주셨습니다.
그렇게 한주가 흘렀고, 이번주에 학생 25명이 3시간에 걸쳐 한명씩 나와 모두 발표를 마쳤습니다.
저는 지난주에 만들던 playerMonster 라는 가제로 게임을 만들어 보았는데요. Object oriented programming 개념을 들어간 직후에 설계한 클래스들이다 보니, 과제를 발표할때쯤이나 되어서 배운 상속이나 인터페이스 등의 개념을 적용시키지 못해 정말 아쉬웠습니다.
사실 발표를 할거란 말씀을 하시기 전에 영어버전으로 만들어보던 게임이었는데, 발표를 하게된단 말에 부랴부랴 한글로 버전으로 방향을 틀었다가, 기존에 만들어 놓았던 영어버전이 아까운 마음에 언어파일을 따로 클래스로 빼고 두 가지 언어 모두로 만들어 보았습니다.
# 아래는 각 언어 버전의 실행 동영상 입니다.
알맹이가 없는 AllText 파일을 만든뒤, AllText_KOR을 상속 하게끔 만들어서 한글 버전으로만 사용하다가, 영어 버전으로 사용하고 싶을때는 extends AllText_ENG 로 바꿔서 했습니다. text를 print 해주는 모든 메서드를 AllText_KOR 에서 전부 static으로 선언해서 어디서들 불러오게 만들었는데요..
발표 할때는 영어 버전을 발표할 생각이 없어서 이대로 발표 했습니다.
나중에 상속에 대한 개념을 수업에서 배운 뒤, 상속을 반대로 했다는 것을 깨닫고, 주말을 이용해 프로그램을 처음 실행했을때에 언어를 선택하는 기능을 추가해봤습니다.
1. AllText 와 하위 언어들의 상속 관계를 뒤집고, AllText를 추상 클래스로 선언하였습니다.
2. 처음에 언어 선택하는 선택지를 주고, 그 결과를 전역변수 language 에 저장하도록 하였습니다.
3. 모든 다른 세부 클래스들에서 AllText의 static 메서드들을 바로 불러와 썼었는데, 이제는 선택한 언어에 해당하는 클래스를 생성해 사용하도록 했습니다.
4. 기존에는 몬스터나 아이템 이름들을 AllText 에서 static String 배열로 선언한 뒤 AllText.monsterNames[0] 이런식으로 직접 접근해서 사용했었는데요, 상속 방향이 바뀌면서 AllText가 부모클래스가 되고 부모클래스에는 해당하는 배열들이 존재하다 보니 접근을 할 수가 없어서, 새로 배운 getter 를 사용해서 접근하도록 변경했습니다. 그 덕에 몬스터,아이템 이름 배열들은 private 으로 접근제어자를 변경 (감격의 첫 캡슐화) 했습니다.
언어 선택을 한 뒤, 해당 언어에 맞는 text 클래스를 생성하도록 만들었습니다.
또한, text 를 사용하는 모든 클래스들의 생성자에서 전역변수 language값에 맞게 text 클래스를 만들도록 모두 수정해주었습니다.
가장 공들였던 부분은 아무래도 장비 교체 인데요, 장비교체를 구현하기 위해 아이템 클래스도 만들어야 했습니다.
이때는 상속이나 인터페이스를 만들기 전이라, itemcode 라는 int 변수를 만들어서 장비를 구분 했습니다.
아이템코드 범위별로 0~10은 헬멧, 11~20은 무기, 21~30은 갑옷.. 이런식으로 일단 구현이 가능은 했습니다.
아이템 뿐만 아니라 인벤토리도 구현해야 했으며, 인벤토리가 가득찼을 경우 아이템을 버리고 새로 채우는 기능, 또한 아이템을 습득하려니 아이템 습득하는 기능, 아이템을 장착 하거나 해제 하는 기능, 아이템에 따른 추가 스탯등 장비 교체 하나를 추가 하기 위해 정말 먼 길을 돌아갈 수 밖에 없었습니다.
장비교체는 메인메뉴와 조금은 다른 시스템으로 시도를 해봤습니다. 위 아래로 옮기면서 선택한 장비에 까만 불이 들어오고, 엔터를 치면 해당 장비 선택창으로 들어가는 시스템 인데요,
객체지향 첫 수업시간에 TV 클래스 만들기에서의 '채널'을 올리고 내리는 method를 만드는것을 배웠었는데 그것을 활용했습니다. 채널을 위로 올리거나 내리며 CH 번호가 바뀌는걸 배웠었는데, 제가 구현한 시스템에서는 채널 번호는 int 값으로 존재 하지만, 그걸 사용자에게 보여주진 않고 그 채널 번호를 이용해서 if 문을 이용해 까만 불이 해당하는 곳에 들어오고, 선택도 가능하게끔 해 보았습니다. 채널5에서 더 늘리면 6이 되거나 5에서 멈추지 않고, 1이 되게끔 했고 만대로 채널 1 에서 아래로 내렸을 경우에는 채널 5가 되게끔 해서 순환도 가능하 해 보았습니다.
장비 목록은 제가 콘솔창 '10줄'을 스크린으로 사용하다보니, 5개 까지만 볼 수 있도록 해 두었습니다. 당장에 인벤토리가 최대 10개까지의 아이템만을 담을 수 있으며, 무기를 5종류 이상 만들지 않았으니 당장은 문제가 되지 않습니다만, [다음페이지] 등의 기능을 구현해두지 못한건 아쉽습니다.
무기를 장착 한 뒤에는 아이템이 바뀌게 됩니다. 장비를 장착할때 [없음]을 선택하면 장비를 해제할 수도 있습니다.
제가 만든 게임 안에서의 기본적인 아이템에 불과하지만, 아이템을 장착한 뒤엔 괜히 기분이 좋아집니다.
아이템을 장착 한 뒤에는 정보창에서 추가된 공격력을 확인 할 수 있습니다.
사냥 시스템이 발표때 반응이 가장 좋았지만 사실 구현은 쉬운 편이었습니다.
단지 10줄씩 정확히 출력 되면서 리얼타임으로 서로 공격을 주고 받는 것 처럼 보이게 하기 위해
줄을 맞춰 체력바 한줄과 텍스트 2줄씩을 정확히 출력하는데에만 신경을 조금 써야 했습니다.
병원과 상점 시스템의 경우에는 발표때까지 [장비 강화] 시스템과 [판매] 시스템 정도는 만들어 보고 싶었는데
시간이 부족해서 다음으로 미루게 되었습니다.
여러가지 시스템들을 구축해보려다 보니 게임의 볼륨이 상당히 작지만, 볼륨은 추후에 키우기로 하고 시간이 날때마다 캡슐화를 먼저 조금씩 해봐야겠습니다.
앞으로도 새로운 기능을 배울때마다 해당 프로젝트로 돌아와서 추가해 볼 생각입니다.
'Development > DevLife' 카테고리의 다른 글
최종 프로젝트 ) gaia 후기와 그 과정 (2) | 2021.07.18 |
---|---|
2021 네이버 웹툰 개발 챌린지 후기 (8) | 2021.07.11 |
17주차) 중간프로젝트 PLAYDDIT 회고 (0) | 2021.04.04 |
7주차 ) 초급 조별 프로젝트 "오늘 뭐먹지" 발표 (0) | 2021.01.01 |
6주차 ) 첫 조별 프로젝트 (0) | 2020.12.26 |