어떤 분의 부탁으로 Laser Maze 게임을 만들어보았다
아직 기술이 부족하여 의뢰인 분께서 요구하신 완성까지는 많이 못미치지만 실력껏 만들어보았다
Java를 이용하여 제작했으며 GUI 프로그래밍을 이용하였다
Laser Maze introduction (ENG)
게임에 대한 설명을 간단하게 해보자면 다음과 같다
앞면에는 문제를 뒷면에는 그 문제에 대한 해답을 가진 카드가 있다
문제는 사용해야 할 보드말의 갯수와 종류, 보드판에 반드시 놓아야 할 보드말의 위치와 방향이 주어진다
보드말을 조합하여 Target/Mirror 라는 보드말의 빨간쪽에 레이저가 닿아야 게임에서 승리한다
보드말의 종류는 다음과 같다
Laser x 1 : 화살표의 방향으로 레이저를 쏜다
Target/Mirror x 5 : 타겟, 거울 또는 동시에 사용할 수 있다. 거울은 레이저의 방향을 90도로 틀어준다
색이 진한 부분이 타겟팅이고 다른 거울이 아닌 부분은 아무런 의미가 없다
BeamSplitter x 2 : 레이저를 두 개로 분할한다 하나는 원래의 방향대로 나아가며 다른 하나는 방향을 90도로 틀어진다
DoubleMirror x 1 : 레이저의 방향을 90도로 틀어준다
Checkpoint x 1 : 보드말의 방향으로 반드시 레이저가 지나야 한다. 레이저에겐 아무런 영향도 끼치지 않는다
Cell Blocker x 1 : 이 보드말이 위치한 곳에는 보드말을 놓을 수 없다
전체적인 구성
Sprite 클래스를 이용하여 각 개체의 뼈대 속성을 구성했다
개체의 좌표와 이미지, 영역(Rectangle)에 관한 정보를 저장하고
각 정보를 반환하고 설정하는 함수와 충돌 테스트, 충돌 이벤트를 처리하는 함수로 이루어져있다
충돌 테스트 함수는 intersects 함수를 이용하여 처리했다
그리고 개체를 크게 Horse 클래스와 BeamSprite 클래스로 나누었다
두 클래스는 모두 Sprite 클래스를 상속받는다
Horse 클래스는 보드말의 처음 위치의 정보를 저장한다
보드말을 저장된 처음 위치로 돌려보내는 함수와
보드말을 식별하는 문자를 반환하는 함수,
보드말의 방향을 설정하는 함수와 반환하는 함수
그리고 다른 보드말과 충돌 했을 때의 이벤트를 처리하는 함수와
레이저와 충돌했을 때의 이벤트를 처리하는 함수⑴ 원형으로 구성되어있다
각각 보드말의 특징을 담은 Horse 클래스를 상속받는 클래스를 만들었다
각 보드말은 Horse 클래스에 있던 함수⑴ 원형을 오버라이드하여
레이저와 충돌했을 때의 각각 특징에 따른 이벤트를 처리하도록 하였다
BeamSprite 클래스는 레이저의 움직임을 다룬다
한 번 그려질 때의 움직임의 정도를 저장하는 두 개의 int형 변수가 있고
레이저를 움직이는 동작을 하는 함수가 있다
Laser 보드말의 위치를 처음 위치로 저장하여 움직이기 시작한다
보드판의 경계에 부딪히면 레이저는 멈추게 된다
LazerMaze 클래스는 화면 출력, 게임의 동작에 관한 모든 것을 관리한다
모든 개체는 ArrayList를 이용하여 sprite 배열에 저장하여 관리했다
불러들어온 보드말의 이미지는 이후 방향 전환을 위해서 배열로 저장했다
awt와 swing 라이브러리를 이용하여 GUI를 다루었다
보드말 이동 동작
보드말의 이동을 마우스 이벤트를 이용하여 처리했다
우선 mousePressed 함수에서 마우스가 보드말을 클릭했는지를 확인하기 위하여 보드말의 영역(Rectangle 변수)을 이용하여
contain() 함수를 이용하여 움직일 보드말이 마우스의 좌표 안에 있는지 여부를 판단한다
정확한 움직임을 위해 마우스의 좌표의 움직일 보드말의 좌표의 차이인 상대 좌표를 저장한다
mouseDragged 함수는 드래그 상태일 때 움직일 좌표의 이미지와 영역(Rectangle)을 동시에 움직이게 한다
mouseReleased 함수는 마우스 버튼이 떼어질 때 좌표가 보드판의 위에 있임을 확인하는 변수에 true 값을 주고
보드판 위에 있지 않다면 블록끼리 충돌해도 이벤트가 발생하지 않도록 했다
화면 밖에 두었을 때 보드말을 처음 위치로 되돌려 놓는다
드래그 상태를 해제하고 마친다
mouseEntered 함수와 mouseExited 함수를 이용하여 마우스가 화면 밖에 있는지에 대한 여부를 판단했다
mouseClicked 함수를 이용하여 보드말을 회전시켰다
mousePressed함수와 마찬가지로 보드말을 클릭했는지를 확인했다
보드말에 따라 이미지가 다르기 때문에 switch 문을 이용하여 보드말 식별에 따라서 달리 이벤트를 처리했다
보드말의 이미지는 배열로 저장했기 떄문에 현재 보드말의 이미지의 배열 인덱스를 저장한다
그리고 다음 인덱스의 이미지로 설정하고 마지막 인덱스에 도달했다면 처음으로 돌아간다
동시에 보드말의 방향 값도 설정한다
레이저 충돌 처리
레이저는 보드말에 충돌했을 때 각 보드말의 특징에 따라 이벤트를 처리하도록 했다
보드말의 방향과 레이저의 진행 방향에 따라서 각기 달리 처리했다
중복 충돌을 막기 위해서 이동하고자 하는 방향을 참고하여 보드말 영역 바깥쪽에 바로 배치하도록 했다
결과 확인 버튼을 클릭하면 레이저가 발사되며 도중에 보드말을 움직이거나 회전하는 것을 방지했다
초기화 버튼을 누른 뒤에 보드말을 수정할 수 있도록 했다
'Programming Language > Java' 카테고리의 다른 글
[Java] 객체 지향 프로그래밍 (0) | 2017.04.07 |
---|---|
[Java] 배열의 복사 (0) | 2017.04.06 |
[Java] Calendar, 날짜와 시간 (0) | 2017.03.20 |