본문 바로가기

Coding_Study/Java_Code_Memo

JButton으로 슈팅게임 1-1 시작 패널

그래픽에 두려움을 가진 사람으로서, 버튼으로 슈팅게임 만들기에 도전하기로 했어요!

이제 막 자바 공부 한 달 차로, 알고있는 선에서 만드는 것이므로, 수정이 필요한 부분은 조언 부탁드립니다.

 

 

 

 

 

- 전제 : 프레임 하나에 패널을 바꿔가며 화면을 바꾸는 형식을 취함

            게임을 선택하는 프레임에 이 게임을 패널로 붙이는 방식

            그러므로, 기본적으로 클래스는 패널이고, 기능은 패널에 추가로 붙임

public class Main_StartHere extends JFrame {
	Main_FirstPage firstPage; //게임 선택 패널
	
	public Main_StartHere(){
		this.setSize(500,800); //프레임 사이즈 설정
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //엑스 누르면 프로그램을 종료하도록
		this.setResizable(false); //사이즈 변경 못하게 고정
		this.setLocationRelativeTo(null); //스크린의 중앙에 뜨게 함
		
		firstPage = new Main_FirstPage(this);
		this.add(firstPage); 
		
		this.setVisible(true); //화면에 보이게
	}
	
	public static void main(String[] args) {
		new Main_StartHere();
	}
}

 

 

 

 

- 'Main_FirstPage' 패널을 붙여줌

-엑션리스너로 버튼을 클릭하면 메인 프레임에 있는 메소드를 불러옴

package miniGame_Main_ChooseGame;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;

public class Main_FirstPage extends JPanel implements ActionListener{
	Main_StartHere main;
	private JButton btnGame1, btnGame2, btnGame3 ; //게임1, 게임2, 게임3
	
	public Main_FirstPage(Main_StartHere main){
		this.main = main;
		
		makeBtn();
	}

	private void makeBtn() { //미니 게임 버튼
		btnGame1 = new JButton("Game1"); //버튼 생성
		btnGame2 = new JButton("Game2"); 
		btnGame3 = new JButton("Game3");
		
		btnGame1.addActionListener(this); //엑션리스너 등록
		btnGame2.addActionListener(this);
		btnGame3.addActionListener(this);
		
		this.add(btnGame1); //패널에 버튼 추가
		this.add(btnGame2);
		this.add(btnGame3);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == btnGame1) {
			main.Main_FiratPageToNext(1);
		} else if (e.getSource() == btnGame2) {
			main.Main_FiratPageToNext(2);
		} else if (e.getSource() == btnGame3) {
			main.Main_FiratPageToNext(3);
		}
	}
}

 

 

 

 

 

- 메인페이지(Main_StartHere)에 해당 메소드를 넣어줌

- 'Main_FirstPage'에서 입력한 번호에 따라 붙일 게임 패널을 결정하는 메소드

-'Main_FirstPage'를 지우고, 이프문으로 해당 패널을 붙인 뒤 프레임 화면을 갱신한다.

- (중요) this.repaint();
            this.revalidate();

void Main_FiratPageToNext(int i) {
		this.remove(firstPage);
		if (i == 1) {
			yunGame = new GameYun_MainPnl(this);
			this.add(yunGame);
		} else if (i ==2) {
			anGame = new Game2_MainPnl(this);
			this.add(Game2);
		} else if (i ==3) {
			parkGame = new Game3_MainPnl(this);
			this.add(Game3);
		}
		this.repaint();
		this.revalidate();
	}

 

 

 

 

 

-'GameYun_MainPnl'

- 이미지는 저작권 무료사이트에서 가져왔고, 글과 화살표는 포토샵으로 넣음

- JLabel로 표현하는데는 한계가 있기도 하고, 비효율적이라 생략

- 다음페이지 가는 버튼 부분에 미리 이미지를 넣고, 비슷한 크기로 버튼을 놓은 뒤 투명하게 처리함

-엑션리스너로 버튼을 클릭하면 메인 프레임에 있는 메소드를 불러옴

 

- (중요) 아래와 같이 배경화면을 입력하지 않고 이미지 아이콘을 생성해서 배경을 삽입하게되면

            버튼이 패널의 뒤로 숨는 오류가 발생하므로, 되도록이면 아래와 같이 처리

            + 다른 해결 방법이 있다면 조언 부탁

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JPanel;

import miniGame_Main_ChooseGame.Main_StartHere; //타 폴더

public class GameYun_MainPnl extends JPanel implements ActionListener{
	Main_StartHere main;
	
	private Image backgroundImage; //배경 이미지
	private JButton btnNext;
	
	public GameYun_MainPnl(Main_StartHere  main){ 
		this.main = main;//프레임을 가지고 온다
		this.setSize(500,800);
		this.setLayout(null);
		
		try {//배경 이미지 삽입
			backgroundImage = ImageIO.read(new File("오프닝1.jpg"));
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		btnNext = new JButton(); // 다음 페이지로 가는 버튼
		btnNext.setBounds(290, 705, 150, 50); 
		btnNext.setBorderPainted(false);
		btnNext.setFocusPainted(false); 
		btnNext.setContentAreaFilled(false);
		btnNext.addActionListener(this);
		this.add(btnNext);
		
	}
	
	@Override
	protected void paintComponent(Graphics g) {	 //이미지 작업
		super.paintComponent(g);
		g.drawImage(backgroundImage,0,0,500,800,null);			
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		main.GameYun_MainPnlToNext();
		
	}
}

 

-Main_StartHere의 아래에 다음 패널을 연결하는 메소드를 추가한다.

- 이 방법의 단점은 페이지가 많을수록 메소드 수가 계속 늘어난다는 것

public void GameYun_MainPnlToNext() { //1번 패널에서 2번 메인 패널로 이동
		this.remove(yunGame);
		main2 = new MainPnl2(this);
		this.add(main2);
		this.repaint();
		this.revalidate();
	}

 

 

-오늘은 졸리니까 여기 까지 :<