본문 바로가기
프로그래밍 언어/Java

자바 게임 만들기 - '벽돌과 사다리' 게임 구현해보기 #2

by Kallunar 2022. 2. 20.

 

 

자바 GUI 프로그래밍 - '벽돌과 사다리' 게임 구현해보기 #1

아는 사람만 안다는 고전게임 벽돌과 사다리 초딩 때 야후 꾸러기에서 했던 게임으로 알피라는 캐릭터가 몬스터들을 피해 과일을 먹게 하는 게임이다 당시 굉장히 재밌게 했던 기억이 있는데

firstlune.tistory.com

지난 글에 이어서 계속 만들어보자

 

4. 키보드로 알피 움직일 수 있게 하기

먼저 클래스 Alfy에다가 각 방향키를 눌렀을 때 작동할 메서드를 생성했다
왼쪽 또는 오른쪽을 눌렀을 때는 각 방향을 향해 있는 이미지로 변경을 해주고
30씩 위치가 변하도록 하였으며, 화면을 넘어가지 않도록 0과 1216 사이에서만 움직이게 했다

위 또는 아래 방향키를 눌렀을 때는 무조건 움직이는 것이 아니라
사다리가 있을 때에만 움직이도록 설정해주었다
마찬가지로 화면 내에서만 움직이도록 제한을 걸어주었다

 

점프를 하는 경우는 제자리에서 점프하는 경우와 이동하면서 점프를 하는 경우가 있기 때문에
왼쪽이나 오른쪽 키를 눌렀는지의 여부를 가지고 이를 구분했다
제자리에서 점프할 때는 y축 위치만 변경하고 이동하면서 점프할 때는 x축 위치도 변경시켰다
점프 키를 누르면 위쪽으로 이동을 시키고 점프 키를 뗐을 때는 착지하는 방식으로 구현했다

 

이동하다 멈추면 이미지도 정지한 모습으로 바뀌도록 하는 keyRelease 메서드를 생성했다
사다리를 탈 수 있는지를 판단하는 checkLaddering 메서드도 생성했다

 

키를 눌렀을 때 작동하는 부분

이렇게 정의한 메서드들을 가지고 키 입력을 받기 위한 KeyListener 클래스를 만들어주었다
점프 키는 스페이스로 하고 앞서 생성해둔 메서드들을 각 방향키에 맞게 할당해주었다

왼쪽, 오른쪽 방향키를 눌렀을 때에는 pressedLeftKey, pressedRightKey의 값을 true로 바꿔주도록 했다

 

키를 뗐을 때 작동하는 부분

왼쪽, 오른쪽 방향키를 뗐을 때에는 pressedLeftKey, pressedRightKey의 값을 다시 false로 바꿔주도록 했다
왼쪽, 오른쪽 키를 뗐을 때는 앞서 생성해둔 keyRelease 메서드를,
스페이스 키를 뗐을 때는 descend 메서드를 호출하게 했다

 

그 후 BricksAndLadders 생성자에 만든 키 리스너를 추가해주었다

 

그리고 Stage 클래스의 run 메서드에서 checkLaddering 메서드를 반복해서 호출하여
사다리를 탈 수 있는지 여부를 판단하도록 했는데
아이템을 다 먹어야 단계가 끝나므로 아이템 리스트에 아이템이 있는 동안 반복하도록 했다

 

5. 아이템 먹는 효과 구현하기

알피가 바나나 또는 포도에 닿았을 때 해당 아이템이 사라지도록 해보자

그러기 위해서 Stage 클래스에 eatItems 메서드를 생성해주었는데 살펴보면 이렇다

아이템이 담긴 리스트를 돌면서 각 아이템에 알피가 닿았는지를 확인하여
닿았으면 리스트에서 해당 항목을 삭제하는 것인데
알피가 아이템의 왼쪽에서 접근하는 경우와 아이템의 오른쪽에서 접근하는 경우를 구분하여
각 아이템과 알피의 폭, x 좌표를 고려하여 서로 겹쳤을 경우에 닿은 것으로 판단하도록 했다

리스트에서 제거되면 drawItems에서 더 이상 그리지 않으므로 화면에서 사라지게 된다

 

이제 이 메서드를 Stage 클래스 run 메서드의 while문 안에 추가하여 반복적으로 호출하게 한다

 

6. 몬스터 구현하기

해골인지 뭔지 모르겠지만 일단 몬스터라 칭하고 그려보자

Monster 클래스를 하나 만들어서 사용할 이미지 추가해주고 필요한 변수들을 정의해주었다
몹이 있는 위치가 각각 다르기 때문에 움직이는 범위 역시 생성할 때 각각 초기화 하도록 했다
그리고 필요한 getter와 setter도 적절히 설정

 

알피가 포도를 먹으면 몬스터는 일정 시간동안 연두색으로 변해야 하기 때문에
이를 구현하기 위한 메서드로 turnGreen을 생성했다
포도를 먹었을 경우 true가 되는 eatGrape 변수를 통해 이 값이 true일 때만
표시할 이미지를 연두색 이미지로 바꿔주고
타이머 객체를 이용하여 2초가 지나면 다시 원래의 이미지로 돌아오고 eatGrape 값을 false로 바꾸도록 했다

 

이어서 run 메서드를 오버라이딩 하여 해당 스테이지가 진행되는 동안
반복하여 turnGreen 메서드를 호출하도록 만들었고
좌우로 왔다갔다 하도록 만들기 위한 코드들을 그 아래 추가했다

 

Stage 클래스로 와서 stageClear 변수와 eatGrape 변수를 선언하고 false로 초기화 했다
그리고 생성된 몬스터 객체를 관리하기 위한 리스트로 monList도 미리 생성해두었다

 

아이템과 마찬가지로 몬스터들도 리스트에 추가하기 위한 makeMons 메서드를 만들어주었고

 

마찬가지로 이를 그리기 위한 drawMons 메서드를 만들어준 뒤

 

BricksAndLadders 클래스에서 몹 객체 세 개를 생성해주었고

 

Stage 클래스의 run 메서드 안에서 makeMons 메서드를 호출하여 이 객체들을 리스트에 담도록 하고

 

BricksAndLadders 클래스의 screenDraw 메서드 안에서 drawMons 메서드를 호출하여 그리도록 했다

 

7. 몬스터 사라지게 하기

알피가 포도를 먹고 무적이 되었을 때 몬스터에 닿으면 몬스터가 사라지도록 해보자

 

Stage 클래스에 이와 같은 touchMons 메서드를 추가해줬다

아이템과 마찬가지로 알피가 몬스터의 왼쪽에서 접근할 때와 오른쪽에서 접근할 때로 나누어
서로 겹칠 경우에 리스트에서 사라지게 만들었는데
eatGrape가 true일 때만 리스트에서 사라지게 만들었다

 

그리고 Stage 클래스 run 메서드 안의 while문에 touchMons 메서드를 추가해서
반복적으로 호출하게 만들었다

댓글