더보기

쿠키런 프로젝트 시리즈
1.준비
https://ondolroom.tistory.com/297
2.전역공간
https://ondolroom.tistory.com/298
3.JPanel생성자
https://ondolroom.tistory.com/299
4.mapMove메서드
https://ondolroom.tistory.com/300
5.hit메서드
https://ondolroom.tistory.com/301
6.fall메서드
https://ondolroom.tistory.com/302
7.jump메서드
https://ondolroom.tistory.com/303
8.paintComponent 및 결과
https://ondolroom.tistory.com/304

 

https://ondolroom.tistory.com/299

 

자바 스윙 쿠키런 만들기 MyPanel 생성자 수정 (프로젝트 진행)

https://ondolroom.tistory.com/298 자바 스윙 쿠키런 만들기 전역 변수 선언하기 (프로젝트 진행) 들어가기 전에... 아래 내용을 숙지하고 시작하자 https://ondolroom.tistory.com/279 자바 WindowBuilder 설치..

ondolroom.tistory.com

 

지난 생성자 파트에서 점프 메서드를 넣었던 것을 기억 할 것이다.

점프 메서드는 낙하메서드와 거의 비슷하다.

다만 이것도 실제 쿠키런 게임의 작동방식과 약간 다르게 제작되었으니 참고하길 바란다.

 

더보기를 눌러 전체코드 확인

더보기
void jump() {
		new Thread(new Runnable() {

			@Override
			public void run() {

				c1.setCountJump(c1.getCountJump()+1); // 점프 횟수 증가

				int nowJump = c1.getCountJump(); // 이번점프가 점프인지 더블점프인지 저장

				c1.setJump(true); // 점프중으로 변경

				if (c1.getCountJump() == 1) { // 점프 횟수가 1이라면
					
					System.out.println("점프");
					c1.setImage(jumpIc.getImage());
					
				} else if (c1.getCountJump() == 2) { // 점프 횟수가 2라면
					
					System.out.println("더블점프");
					c1.setImage(doubleJumpIc.getImage());
					
				}

				long t1 = Util.getTime(); // 현재시간을 가져온다
				long t2;
				int set = 8; // 점프 계수 설정(0~20) 등으로 바꿔보자
				int jumpY = 1; // 1이상으로만 설정하면 된다.(while문 조건 때문)
				
				while (jumpY >= 0) { // 상승 높이가 0일때까지 반복
					
					t2 = Util.getTime() - t1; // 지금 시간에서 t1을 뺀다
					
					jumpY = set - (int) ((t2) / 40); // jumpY 를 세팅한다.
					
					c1.setY(c1.getY()-jumpY); // Y값을 변경한다.

					if (nowJump != c1.getCountJump()) { // 점프가 한번 더되면 첫번째 점프는 멈춘다.
						break;
					}
					
					if (escKeyOn) {
						long tempT1 = Util.getTime();
						long tempT2 = 0;
						while (escKeyOn) {
							try {
								Thread.sleep(10);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
						tempT2 = Util.getTime() - tempT1;
						t1 = t1 + tempT2;
					}
					
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}

				if (nowJump == c1.getCountJump()) { // 점프가 진짜 끝났을 때를 확인
					c1.setJump(false); // 점프상태를 false로 변경
				}

			}
		}).start();
	}

 

 

설명

 

점프 쓰레드 생성

점프 도중에도 맵은 이동하고, 우리는 더블점프를 해야 하기 때문에

새 쓰레드를 이용한다.

 

점프 횟수를 1 늘려주고

이번 쓰레드의 점프가 1회인지 2회인지 임시변수에 저장한다. (추후점프 상태를 false로 변환하기 위함)

예를들어 1회 점프 중에 한번 더 점프하여 지금점프가 break되었는데 점프 상태를 false로 바꾸게되면 문제가 발생한다.

그것을 방지하기 위해 현재 점프횟수를 기록해두는 것.

c1(캐릭터)의 점프 상태도 true로 변경하자.

그리고 이번 점프가 1회려면 점프, 2회라면 더블점프 이미지로 변경한다.

 

내용이 길어서 아래에서 나누어서 설명하겠다.

 

Util클래스에서 타임스탬프 시간을 가져온다.

t2는 바로 뒤에 쓸예정이니 선언만 해둔다.

set은 점프 계수인데 처음 점프량을 설정한다.
(예를들어 캐릭터의 높이가 8씩 증가하다가 7 6 5 4 3 2 1 0 씩 증가하게 되는데, set은 그 초기값이다.)

 

상승은 점프량이 0이 될때까지 반복하게 된다.

t2에 현재시간 - 점프가 시작된시간을 저장하고

set에 그값을 가공한뒤 빼서 jumpY를 세팅한다. (jumpY는 상승량이라고 보면된다.)

그것으로 캐릭터의 높이를 재설정해준다.

 

캐릭터가 1회점프 도중 한번더 점프를 하면 이번 점프는 멈춰야된다. (중복되면 가속상승이 되버린다.)

 

낙하 때와 마찬가지로 esc메뉴가 뜬 상태에서는 위와 같이 시간을 저장해두었다가 t1에 넣어준다.

 

while무한반복문에는 대기시간을 넣어 리소스를 안정화 시키자

이번 쓰레드의 점프가 진짜 끝났는지 확인하고 맞다면 점프상태를 false로 변경한다.

 

다음편에 계속

+ Recent posts