너무 극단적인 느낌의 제목이긴 하지만,
드디어 충돌의 마지막 주인공 죽이기입니다.
생각보다 조금 간단하게 갑니다.
이전의 몬스터나 총알 없애는 작업에 비하면요.....
전제 : 몬스터 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;
}
자, 이렇게 하면 아무 몬스터와 부딪혀도 이벤트가 일어나게 됩니다.
확인을 누르면 게임 실행창으로, 취소를 누르거나 다이얼로그를 끄면 처음 게임 종료 화면으로 넘어갑니다.
'Coding_Study > Java_Code_Memo' 카테고리의 다른 글
JButton으로 슈팅게임 4-1 Phase2 보스 (0) | 2020.12.13 |
---|---|
JButton으로 슈팅게임 3-4 Phase1 종료 (0) | 2020.12.13 |
JButton으로 슈팅게임 3- 2 (충돌) 총알 (0) | 2020.12.12 |
JButton으로 슈팅게임 3-1 (충돌) 몬스터 죽이기 (0) | 2020.12.12 |
JButton으로 슈팅게임 2-3 몬스터 1 만들기 (0) | 2020.12.11 |