본문 바로가기

Coding_Study/Java_Code_Memo

JButton으로 슈팅게임 3-4 Phase1 종료

드디어 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작업을 하면 될 것 같아요.

휴 ;)