College of Computing, class of 2024, Dongbin Kim,Jingeon Shin,Yunbo Shim (20학번 김동빈,신진건,심윤보)
시연영상 (Demonstration Video) - https://youtu.be/63dogOhNVUo
● 주제: 게임 ● 게임 종류: 전략 타워 디펜스 게임 ● 전체적인 게임 진행 은행잎(몬스터)이 맵의 길을 따라서 이동하고 그 길 주변에 타워를 설치하여 은행잎이 목적지에 도달하지 못하도록 하는 게임이다. 게임이 시작되면 생명력이 주어지고 은행잎이 목 적지에 도달하면 생명력이 1씩 감소되고, 주어진 생명력이 모두 사라지면 게임이 끝난다. 은행잎을 제거하면 코인을 얻게 되고 그 코인으로 타워를 추가적으로 설치할 수 있다. 게임은 총 3개의 레벨로 구성되어 있으며 레벨이 높아질수록 난이도가 상승한다.
● Frame
- 게임 인터페이스 창을 위한 Frame을 만드는 class
- JFrame class를 확장했다.
● Game
- 게임에 필요한 객체들이 저장되고 실행될 panel이다. Jpanel을 확장했고 게임실행을 위한 thread를 위해 Runnable 인터페이스를 사용했다.
- 레벨이 올라갈 때마다 화면이 달라지기 때문에 constructor를 대신해서, 이미지와 맵을 읽어오고, 게임에 필요한 객체들을 생성하는 define method를 따로 구현했다.
- 각 객체들이 가지고 있는 화면 상에 이미지와 그림들을 출력하는 method(draw)들을 실행할method를 구현했다.
- 몬스터의 생성 주기를 제어하는 method를 구현했다.
- 게임의 모든 상황을 제어하기 위해 thread를 사용했다. 객체들의 물리적 움직임을 설정된 프레임을 통해 제어되도록 method들을 구현했다. 만약, 그 method들이 프레임만큼 반복 호출되었을 때 물리적 움직임이 나타나도록 했기 때문에 프로그램이 너무 빨리 돌아가 게임 진행 또한 너무 빨라지지 않게 하기 위해서 thread 제어를 위해 sleep을 사용하였다.
● Map
- 게임이 진행되는 화면을 만드는 class이다. 몬스터가 지나가는 길과 타워가 설치할 공간을 하나의 타일(정사각형)로 설정했기 때문에 이 class 안에 Tile class를 따로 만들고 map class에서는 이 tile의 2차원 배열을 만들어서 맵을 만들도록 했다.
- Tile class
- 타일은 정사각형으로 구현했으며, 몬스터의 길을 나타내기도 하지만, 타워가 설치되면 공격해야 하기 때문에 물리적 method 또한 구현했다.
- 하나의 정사각형 타일이 있고 그것보다 큰 정사각형을 만들어 타워의 공격범위로 설정하였다.이 공격범위를 나타내는 정사각형에 몬스터가 교차된다면 공격을 하도록 구현하였다.
- 공격을 한다면, 타워의 중앙과 몬스터의 중앙을 연결하는 선을 그려서 공격을 하고 있다는 표시를 구현하였다.
- 타일의 2차원을 배열과 반복문을 통해 모든 타일이 물리적 method와 draw method를 실행시키도록 method 들을 구현했다.
● Shop
- 상점을 구현하고 상태(생명, 코인)을 구현하는 class이다.
- 모든 객체를 생성하는 constructor가 있고 그것들의 이미지를 화면 상에 출력하는 draw method가 있다.
- 마우스 클릭을 통해 타워를 클릭해서 타워를 선택하고, 게임 내의 map에 다시 마우스 클릭을 통해 타워를 설치하게 해주는 click method가 있다.
● Mob
- 몬스터를 구현하는 class이다.
- 몬스터를 생성하는 constructor가 있고 화면에 이미지를 출력하는 draw method가 있다.
- 몬스터를 생성하는 spawnMob method, 몬스터의 상태를 관리하는 deleteMob, levelUp, loseMobHealth, checkDeath, isDead method들을 구현했다.
- 몬스터의 물리적 움직임을 제어하는 method로는 setDirection과 physic이 있다. 먼저, 맵의 정보를 가져와 몬스터가 움직일 수 있는 길과 아닌 길을 구분하고 dfs와 비슷한 방법으로 인접한 타일로 몬스터가 움직이도록 했다. 방문한 길은 따로 처리를 해주어서 다시 못 돌아가도록 구현했다.
● IDnum
- 타워나 몬스터 같은 객체들의 특징을 저장한 class이다. 따로 함수를 구현하지 않고 값만 저장되어 있다.
- 게임에 표시될 모든 객체들이 이미지를 가지고 있기 때문에 Game class에 있는 이미지배열을 쉽게 활용하기 위해 따로 구현했다.
- 객체들이 가지고 있는 특징이 다 다르기 때문에, 저장된 값들을 ID로 활용해 각각의 특징을 관리하기 용이하게 했다.
● Keyhandle
- 상점과 타워 설치를 위한 마우스의 움직임을 처리하는 class이다.
- MouseMotionListener와 MouseListener 인터페이스를 사용했다.
● Save
- 맵 파일을 읽는 class이다.
- 텍스트 파일을 읽어서 Map class 객체에 정보를 저장한다.
● 맵 파일
- 맵의 형식을 저장한 텍스트 파일이다.
- 첫 줄에는 그 맵에서 제거해야 할 몬스터의 수가 있다.
- 다음으로, 1과 0을 통해 몬스터가 지나갈 길과 아닌 길을 구분하도록 작성되어있다.
- 마지막으로는 맵에 타워를 설치할 때 필요한 정보들을 저장할 숫자들로 구성되어 있다. 초기 설정은 -1으로 아무것도 없는 상태이므로 -1로 작성되어 있다. (IDnum class에 있는 charAir 값)
● 타워 종류 및 업그레이드 기능 ○ 현재는 명륜이, 율전이 타워만 있지만 다른 종류의 타워도 더 만들어서 게임의 다양성을 높이고 업그레이드 기능도 추가하면 게임의 재미를 높이는데 좋을 것 같다.
● 몬스터 종류 및 체력 증가 ○ 현재는 나오는 몬스터의 종류가 1개이지만 몬스터의 종류를 증가시켜 각 몬스터마다의 특징에 따라 필요한 타워를 만들면 더욱 게임의 재미가 높아질 것 같다. 또한 체력 증가 기능도 넣는다면 게임의 난이도도 더욱 올라갈 수 있을 것 같다.
● 레벨 별 배경음악 추가 ○ 각 레벨 별로 배경음악을 추가한다면 심심하지 않게 게임을 할 수 있을 것 같다.
● Map 디자인 향상 ○ Map디자인을 향상시켜 Map에 게임이름을 추가하고 성균관대학교 마크를 추가한다면 더욱 독창성 있는 타워 디펜스 게임이 될 것 같다.




