그래픽에 두려움을 가진 사람으로서, 버튼으로 슈팅게임 만들기에 도전하기로 했어요!
이제 막 자바 공부 한 달 차로, 알고있는 선에서 만드는 것이므로, 수정이 필요한 부분은 조언 부탁드립니다.
- 전제 : 프레임 하나에 패널을 바꿔가며 화면을 바꾸는 형식을 취함
게임을 선택하는 프레임에 이 게임을 패널로 붙이는 방식
그러므로, 기본적으로 클래스는 패널이고, 기능은 패널에 추가로 붙임
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();
}
-오늘은 졸리니까 여기 까지 :<
'Coding_Study > Java_Code_Memo' 카테고리의 다른 글
JButton으로 슈팅게임 2-3 몬스터 1 만들기 (0) | 2020.12.11 |
---|---|
JButton으로 슈팅게임 2-2 총알 만들기 (0) | 2020.12.11 |
JButton으로 슈팅게임 2-1 주인공 만들기 (0) | 2020.12.11 |
JButton으로 슈팅게임 1-2 시작 패널 마무리 (0) | 2020.12.11 |
HashMap(1) (0) | 2020.12.02 |