드디어 Phase1의 종료를 앞두고 있습니다.
설계(?)상 Phase1에서는 여러 종류의 몹이 나오고, 주인공은 그 중에 특정몹을 몇 회 이상 잡으면 Phase2로 넘어가게 되어있습니다.
저는 그 몹을 Monster3으로 정했고, 현재는 테스트를 해야하기 때문에 난이도를 낮춰서 3회 잡으면 넘어가는 것으로 설정했습니다.
오늘 마무리하고 쉽시다!
전제 : Monster3를 3회 잡으면 Phase2로 넘어간다.
(사실 중간에 스토리를 넣어서 바로 넘어가진 않고, 스토리 패널로 넘어가게 됩니다.)
오늘 할 일 : 메인(Play_Phase1)에 3회 잡으면 넘어가는 Method넣기
JFrame(Main_StartHere)에 JPanel 교체 Method넣기
Monster3 class에 횟수 카운트 하는 신호 넣기
- 메인(Play_Phase1) 작업
/**Count dead of Monster3, 3 times > call Boss*/
void callPhase2() {
callNum++;
if (callNum == 3) {
isPhase1Stop = true;
isPhase2Started = true; //start to Phase2
}
}
- run()을 수정
- boolean 타입의 isPhase1Stop을 넣어서 3회가 되면 break
- boolean 타입의 isPhase2Started를 통해 while문 밖에서 패널 붙이는 작업 하기
@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);//게임 메인으로 간다
}
} else if(isPhase2Started == true) {
main.Play_Phase1ToNext(3); //다음 페이즈 이동
}
}
- 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);
} else if(i == 3) {//다음 페이지
story2_1 = new Phase2_Story1(this);
this.add(story2_1);
}
this.repaint();
this.revalidate();
}
public void Phase2_StoryToNext(int i) {
if (i == 1) {//다음 선택지
this.remove(story2_1);
story2_2 = new Phase2_Story2(this);
this.add(story2_2);
} else if (i == 2) {//엔딩 1
this.remove(story2_1);
end1 = new Ending1(this);
this.add(end1);
} else if (i == 3) {//Phase2
this.remove(story2_2);
playPhase2 = new Play_Phase2(this);
this.add(playPhase2);
} else if (i == 4) {//엔딩 1
this.remove(story2_2);
end1 = new Ending1(this);
this.add(end1);
}
this.repaint();
this.revalidate();
}
public void Ending1ToNext() { //엔딩1 > 첫 화면으로
this.remove(end1);
this.add(firstPage);
this.repaint();
this.revalidate();
}
- Monster3 class 작업
- play1.callPhase2(); 소환할 때마다 메인(Play_Phase1)의 callNum 증가
/**'Monster' is crashed with 'Bullet'*/
for(Map.Entry<Integer, BtnBullet> bullet:play1.listBullet.entrySet()){
if(isDead(monX,monY,play1.listBullet.get(bullet.getKey()))){
//System.out.println("맞췄다!Monster3"); //테스트 코드
isMonsterOver=true;
play1.callPhase2();
play1.listBullet.get(bullet.getKey()).iscrashed=true;
play1.listBullet.remove(bullet.getKey());
break;
}
}
if(isMonsterOver){
break;
}
이렇게 작업하면 드디어 Phase1이 끝나고 스토리 패널로 넘어가게 됩니다.
다음번에는 스토리가 끝나고 나면 시작되는 Phase2작업을 하면 될 것 같아요.
휴 ;)
'Coding_Study > Java_Code_Memo' 카테고리의 다른 글
JButton으로 슈팅게임 _ 마무리 (5) | 2020.12.13 |
---|---|
JButton으로 슈팅게임 4-1 Phase2 보스 (0) | 2020.12.13 |
JButton으로 슈팅게임 3-3 (충돌) 주인공 죽이기_Game Over (0) | 2020.12.12 |
JButton으로 슈팅게임 3- 2 (충돌) 총알 (0) | 2020.12.12 |
JButton으로 슈팅게임 3-1 (충돌) 몬스터 죽이기 (0) | 2020.12.12 |