본문 바로가기

Coding_Study/Java_Code_Memo

JButton으로 슈팅게임 3-3 (충돌) 주인공 죽이기_Game Over

너무 극단적인 느낌의 제목이긴 하지만,

드디어 충돌의 마지막 주인공 죽이기입니다.

 

생각보다 조금 간단하게 갑니다.

이전의 몬스터나 총알 없애는 작업에 비하면요.....

 

전제 : 몬스터 class에서 Game Over 사인을 메인(Play_Phase1)으로 보낸다.

          메인(Play_Phase1)에서는 주인공이 죽으면 버튼을 없애고 Thread를 정지한다.

          주인공이 죽으면 showConfirmDialog으로 게임을 다시 할 지, 아니면 처음으로 갈 지 선택할 수 있도록 한다.

 

오늘 할 일 : JFrame class(Main_StartHere)에서 패널 교체 메소드를 추가한다.

                  메인(Play_Phase1)에서 사망 메소드 추가한다.

                  각 몬스터 class(Monster1, Monster2, Monster3)의 run()에 충돌 내용 추가한다.

 

 

 

JFrame(Main_StartHere) 작업

- 오랜만에 메소드 추가

public void Play_Phase1ToNext(int i) {
		this.remove(playPhase1);
		if (i == 1) {//첫 페이지로 간다
			main2 = new MainPnl2(this);
			this.add(main2);
		} else if (i == 2) {//게임 메인으로 간다
			this.add(firstPage);
		}
		this.repaint();
		this.revalidate();
}

 

 

 

 

- 메인(Play_Phase1) 작업

- 전역 변수 추가 (페이즈 정지, 게임 중지)

private boolean isPhase1Stop;
private boolean isGameOver;

- 사망여부를 받는 Method를 작성

/**Game over*/
	 public void setOver(boolean b) {
		  btnMe.setLocation(0,800); //죽고 나서 버튼 위치 남아있는 오류, 버튼 위치를 미리 밖으로 보내버리기
	      this.remove(btnMe);
	      isPhase1Stop = b;
	      isGameOver = b;
	 }

- run()의 while문에 break조건 추가

- run()의 while문 밖에 isGameOver 조건 추가

- int result에 showConfirmDialog를 추가

  showConfirmDialog는 초기화 할 필요 없음

  JOptionPane.showConfirmDialog(parentComponent, message, title, optionType, messageType, icon)

  >> JOptionPane.showConfirmDialog (main, "Game Over, Try Again?", "안타깝네요!", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE,icon)

- result에 넣은 이유는 각 버튼을 눌렀을 때 어떤 페이지로 연결할 것인지 if문으로 설정하기 위함

- JOptionPane.OK_CANCEL_OPTION에서는 ok 버튼이 숫자 0, cancel 버튼이 숫자 2, 그리고 화면을 끄는 x버튼이 숫자 -1로 대치된다. 

@Override
	public void run() {
		
		for(int i=0;i<5;i++){
			try {
				Thread.sleep(500);//객체가 생성되는 시간
				countTime += 500;
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			if(isPhase1Stop == true) {
				break;
			}
			
			/**Monster 1 count*/
			if(countTime%1500 == 0) {
				listMonster.put(i, new Monster1(this,i));
				(new Thread(listMonster.get(i))).start();
			}
			
			/**Monster 2 count*/
			if(countTime%2000 == 0) {
				int j = i+5;
				listMonster.put(j, new Monster2(this,j));
				(new Thread(listMonster.get(j))).start();
			}
			
			/**Monster 3 count*/
			if(countTime%3000 == 0) {
				int	k = i+10;
				listMonster.put(k, new Monster3(this,k));
				(new Thread(listMonster.get(k))).start();
			}
			
			if (i == 4) i = 0; // 몹 스레드 재활용 
			
			/**Bullet count*/
			if(countTime%500 == 0&& isFire == true) {
				isFire = false;
				idxBullet += 1; //Map의 Key값 설정
				 if (idxBullet == 30) { //key값이 너무 커지지 않게 재활용
					 idxBullet = 0;
				 }
				 listBullet.put(idxBullet, new BtnBullet(this, idxBullet));
				 (new Thread(listBullet.get(idxBullet))).start();
			}
		}
		
		if(isGameOver == true) { // 게임 끝 
			ImageIcon icon = new ImageIcon("tomb-2.png");
			int result = JOptionPane.showConfirmDialog (main, "Game Over, Try Again?", "안타깝네요!", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE,icon);
			if(result == 0) { //System.out.println(result); //-1 : X, 0 : ok, 2 : cancel
				main.Play_Phase1ToNext(1);//첫 페이지로 간다
			} else if(result == -1 || result == 2) {
				main.Play_Phase1ToNext(2);//게임 메인으로 간다
			}	
		}
		
		
	}

 

 

- 각 몬스터 class(Monster1, Monster2, Monster3)작업

- run()의 while문 안에 하나만 추가하면 됨

/**'Me' is crashed with 'Monster'*/
			if(isDead(monX, monY, play1.btnMe)){
				play1.setOver(true);
	            break;
	         }

 

 

 

자, 이렇게 하면 아무 몬스터와 부딪혀도 이벤트가 일어나게 됩니다.

확인을 누르면 게임 실행창으로, 취소를 누르거나 다이얼로그를 끄면 처음 게임 종료 화면으로 넘어갑니다.