이코노딩

JAVA 프로젝트: 슈팅 게임 만들기 본문

언어/JAVA

JAVA 프로젝트: 슈팅 게임 만들기

떼이로 2022. 3. 7. 18:08

▶보고서 

1차 계획

●게임이름: Bubble POP!

●장르: 슈팅게임

●게임설명: 아래에서부터 올라오는 비눗방울을 터뜨리는 간단한 게임 버블을 제거 할수록 점수가 누적되고 일정 개수의 방울을 놓치면 게임오버

●구현해야할 기능

  • 이미지를 받아서 띄우고, 랜덤한 위치에 여러개의 패널을 생성한 후 위로 랜덤하게 좌우로 올라가게 함
  • 클릭당한 방울을 터지는 이미지로 전환
  • 마우스의 동작을 읽고 방울 클릭시 해당 방울 터지게 함, 터지면 점수가 올라가고 놓칠때마다 생명이 줄어듦
  • 점수가 올라감에 따라 도달 레벨에 따른 방울 생성 개수와 속도 증가 기능
  • 레벨이 올라 갈수록 배경음악 변경

●예상 다이어그램

 

2차 계획

●변동사항

추가된 사항: 아이템 기능 

아이템 명 - 폭탄

효과 - 화면에 나온 모든 방울 제거와 함께 점수 획득

이유 - 게임의 속도감과 레벨 업시 난이도가 기하급수적으로 증가하여 밸런스 조절을위하여 추가

제거된 사항: 배경음악 변경

이유 - 필요성이 크지 않을 뿐만아니라 음악 데이터의 용량이 큼

●최종 다이어그램

▶ 주요코드(※import 생략)

1. BubblepopDriver.JAVA

public class BubblepopDriver{
      public static final int SCREEN_WIDTH = 800, SCREEN_HEIGHT = 600; //스크린 사이즈 정의
      public static final int SLEEP_TIME = 7; //방울들 속도 정의
      public static void main(String args[]){
              Bubblepop game = new Bubblepop();
      }
}

 

2.Bubblepop.JAVA

public class Bubblepop extends JFrame {
      private Image mainscreen = new ImageIcon(BubblepopDriver.class.getResource("MainScreen.gif")).getImage();
      private Image logo = new ImageIcon(BubblepopDriver.class.getResource("Logo.gif")).getImage();
      private AudioInputStream bgm;
      private Clip clip;
      private ImageIcon startbt = new ImageIcon(BubblepopDriver.class.getResource("Start.png"));
      private ImageIcon startbt2 = new ImageIcon(BubblepopDriver.class.getResource("Start2.png"));
      private JButton start = new JButton(startbt);
      private JButton howto = new JButton(new ImageIcon(BubblepopDriver.class.getResource("HowTo.png")));
      private JButton back = new JButton(new ImageIcon(BubblepopDriver.class.getResource("backbt.png")));
      public static GameManager gm = new GameManager();
      public static JButton replay = new JButton(new ImageIcon(BubblepopDriver.class.getResource("Replay1.png")));      
      gamepan gameground = new gamepan();


      public Bubblepop(){
           play("Intromusic.wav"); //시작 배경음악 재생
            //아이콘 생성
           Toolkit toolkit  = this.getToolkit();
           ImageIcon imageIcon = new ImageIcon("icon.png");
           Image icon = imageIcon.getImage();
           setIconImage(icon);
           //전체설정
           setTitle("Bubble POP!");
           setSize(BubblepopDriver.SCREEN_WIDTH, BubblepopDriver.SCREEN_HEIGHT);
           setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           setVisible(true);
           setResizeable(false); //사용자가 임의로 게임창 크기변경 불가능
           //배경화면 바꿔주는 패널 정의
           Mypan background = new Mypan();
           background.setLayout(null);
           add(background);
           //커서 설정
           Toolkit mouse = this.getToolkit();
           Image cus = mouse.getImage(BubblepopDriver.class.getResource("gameMouse.png"));
           Cursor c = mouse.createCustomCursor(cus, new Point(this.getX(), this.getY()), "stick");
           // 다시하기 버튼
           Dimension replaydimension = getSize();
           int replaywidth = (int) (replaydimension.getWidth() / 2) - 10;
           replay.setBounds(replaywidth, 460, 160, 65);
           replay.setBorderPainted(false);
           replay.setContentAreaFilled(false);
           replay.setFocusPainted(false);
           replay.addMouseListener(new MouseAdapter() {
                @Override
                  public void mouseEntered(MouseEvent e) {
                        replay.setIcon(new ImageIcon(BubblepopDriver.class.getResource("Replay2.png")));
                        replay.setCursor(new Cursor(Cursor.HAND_CURSOR));
                 }

                @Override
                 public void mouseExited(MouseEvent e) {
                      replay.setIcon(new ImageIcon(BubblepopDriver.class.getResource("Replay1.png")));
                      replay.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                 }

                @Override
                 public void mousePressed(MouseEvent e) {
                       replay();
                  }
           });

          Dimension dimension = getSize();
          int width = (int) (dimension.getWidth() / 2) - 80;
          start.setBounds(width, 460, 160, 65);
          // 스타트버튼
          start.setBorderPainted(false);
          start.setContentAreaFilled(false);
           start.setFocusPainted(false);
          background.add(start);
          start.addMouseListener(new MouseAdapter() {
                 @Override
                public void mouseEntered(MouseEvent e) {
                     start.setIcon(startbt2);
                     start.setCursor(new Cursor(Cursor.HAND_CURSOR));
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    start.setIcon(startbt);
                    start.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
               }

                @Override
               public void mousePressed(MouseEvent e) {
                   start.setVisible(false);
                    clip.stop();
                    clip.close();
                    play("./Music/countDown.wav"); //게임시작 카운트다운 설정
                    background.setVisible(false);
                    gameground.add(replay);
                    replay.setBounds(0, 0, 70, 70);
                    add(gameground);
                    gameground.addMouseListener(new MouseListner());
                    gameground.setCursor(c);
                    replay.setVisible(false);

                   playgame();
             }
           });
          //howtoplay버튼
          howto.setBounds(680, 10, 70, 70);
          howto.setBorderPainted(false);
          howto.setContentAreaFilled(false);
          howto.setFocusPainted(false);
           background.add(howto);
           howto.addMouseListener(new MouseAdapter() {
               @Override
                public void mouseEntered(MouseEvent e) {
                     howto.setCursor(new Cursor(Cursor.HAND_CURSOR));
                }

               @Override
                public void mouseExited(MouseEvent e) {
                         howto.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
               }

               @Override
               public void mousePressed(MouseEvent e) {
                    howto();

                }
                });
           back.setBounds(10, 20, 70, 70);
           // 뒤로가기버튼
           back.setBorderPainted(false);
           back.setContentAreaFilled(false);
           back.setFocusPainted(false);
           background.add(back);
           back.setVisible(false);
           back.addMouseListener(new MouseAdapter() {
               @Override
              public void mouseEntered(MouseEvent e) {
                    back.setCursor(new Cursor(Cursor.HAND_CURSOR));
              }

              @Override
               public void mouseExited(MouseEvent e) {
                   back.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
              }

               @Override
                public void mousePressed(MouseEvent e) {
                  returning();
              }
               });
      }

      class Mypan extends JPanel {

           public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(mainscreen, 0, 0, getWidth(), getHeight(), this);
                g.drawImage(logo, 160, 60, this);
           }
      }

      class gamepan extends JPanel {
           public void paintComponent(Graphics g) {
              super.paintComponent(g);
              gm.screenDraw(g);
              this.repaint();
          }
      }


      public void play(String name) {
          try {
              bgm = AudioSystem.getAudioInputStream(new File(name));
              clip = AudioSystem.getClip();
              clip.stop();
              clip.open(bgm);
              clip.start();
           } catch (Exception ex) {
                System.err.println(ex);
           }
      }

      public void howto() {
           mainscreen = new ImageIcon(BubblepopDriver.class.getResource("howtoplay.gif")).getImage();
          logo = new ImageIcon(BubblepopDriver.class.getResource("")).getImage();
          start.setVisible(false);
          howto.setVisible(false);
          back.setVisible(true);
      }

      public void returning() {
          mainscreen = new ImageIcon(BubblepopDriver.class.getResource("MainScreen.gif")).getImage();
          logo = new ImageIcon(BubblepopDriver.class.getResource("Logo.gif")).getImage();
          start.setVisible(true);
          howto.setVisible(true);
          back.setVisible(false);
      }

      public void playgame() {
          gm.start();
          gm.musicstart();
      }

      public void replay() {
          replay.setVisible(false);
          gm = new GameManager();
          gm.start();
          play("./Music/countDown.wav");
          gm.musicstart();
     }
}

 

3. GameManager.JAVA

public class GameManager extends Thread {
      ArrayList<Bubble> bubbleList = new ArrayList<Bubble>();
      private AudioInputStream bgm;
      private Clip clip;
      private Image gameground = new ImageIcon(BubblepopDriver.class.getResource("gameScreen.jpg")).getImage();
      private Image downbar = new ImageIcon(BubblepopDriver.class.getResource("Downbar2.png")).getImage();
      public static int score;
      private String scorelb = "score: 0";
      private String lifestring = "Life: 10";
      private String replayst = "";
      private String levelst = "Level: 1";
      private int level;
      private int life;
      private boolean playing = true;

      boolean play() {
            return playing;
      }

      public GameManager() {
            this.life = 10;
            this.score = 0;
            this.level = 1;
      }

      public void screenDraw(Graphics g) {
            g.drawImage(gameground, 0, 0, null);
            g.drawImage(downbar, 0, 520, null);
            g.setColor(Color.white);
            g.setFont(new Font("Arial", Font.BOLD, 30));
            g.drawString(scorelb, 300, 550);
            g.drawString(lifestring, 650, 550);
            g.drawString(levelst, 20, 550);
            g.drawString(replayst, 380, 450);

            for (int i = 0; i < bubbleList.size(); i++) {
                  Bubble bubble = bubbleList.get(i);
                  if (bubble.missstatus()) {
                        bubbleList.remove(i);
                        i--;
                        life--;
                        if (life <= 0)
                              life = 0;
                        lifestring = lifetoString();
                        gameover();
                  } else if (bubble.hitstatus()) {
                        bubbleList.remove(i);
                        i--;
                        score += 10;
                        scorelb = scoretoString();
                  } else if (bubble.baamhit()) {
                        score += (bubbleList.size() * 10);
                        bubbleList.removeAll(bubbleList);
                        scorelb = scoretoString();
                  }
                  bubble.screenDraw(g);
            }
      judge();
      }

      public void makeBubble() {
            int i = 0;
            while (true) {
                  if (playing) {
                        if (level < 10) {
                              if (bubbleList.size() == 35) {
                                    BAAM();
                              }
                  } else {
                        if (bubbleList.size() == 70) {
                              BAAM();
                        }
                  }
                  Bubble bubble = new Bubble(this, false);
                  bubble.start();
                  bubbleList.add(bubble);
                  try {
                        level = (score / 200) + 1;
                        levelst = leveltoString();
                        if (score > 2000)
                              Thread.sleep(100);
                        else if (score > 1000)
                              Thread.sleep(200);
                        else if (score > 500)
                              Thread.sleep(300);
                        else
                              Thread.sleep(500);
                  } catch (Exception e) {
                        e.printStackTrace();
                  }
            i++;
            } else {
                  bubbleList.removeAll(bubbleList);
                  close();
                  break;
                  }
            }
      }

      public void BAAM() {
            Bubble special = new Bubble(this, true);
            special.start();
            bubbleList.add(special);
      }

      public void gameover() {
            if (life == 0) {
                  clip.close();
                  Bubblepop.replay.setVisible(true);
                  gameground = new ImageIcon(BubblepopDriver.class.getResource("gameover.png")).getImage();
                  replayst = "RE?";
                  playing = false;
            }
      }

      public String lifetoString() {
            return "Life: " + life;
      }

      public String scoretoString() {
            return "score: " + score;
      }

      public String leveltoString() {
            return "Level: " + level;
      }

      @Override
      public void run() {
            makeBubble();
      }

      public void play(String name) {
            try {
                  bgm = AudioSystem.getAudioInputStream(new File(name));
                  clip = AudioSystem.getClip();
                  clip.stop();
                  clip.open(bgm);
                  clip.start();
            } catch (Exception ex) {
                  System.err.println(ex);
            }
      }

      public void close() {
            clip.close();
            interrupt();
      }
      
      public void judge() {
            for(int i=0;i<bubbleList.size();i++) {
                  Bubble bubble = bubbleList.get(i);
                  Bubble bubble2 = bubbleList.get(i+1); 
                  if(bubble.x >= bubble2.x && bubble.y >= bubble2.y && bubble.x <= bubble2.x && bubble.y <=bubble2.y) {
                        bubbleList.remove(i);
                        bubbleList.remove(i+1);
                        i-=2;
                  }
            }
      }

      public void musicstart() {
            play("./Music/게임브금.wav");
      }
}

 

4. Bubble.JAVA

public class Bubble extends Thread {
      private AudioInputStream bgm;
      private Clip clip;
      private int randomSIZE = (int) (Math.random() * 50) + 50;
      private Image basicbubble = new ImageIcon(BubblepopDriver.class.getResource("Bubble.png")).getImage();
      private Image baam = new ImageIcon(BubblepopDriver.class.getResource("baam.png")).getImage();
      private Image changedImg = basicbubble.getScaledInstance(randomSIZE, randomSIZE, Image.SCALE_SMOOTH);
      private Image count;
      public static int x, y = 1000;
      private int radius;
      private boolean hit = false;
      private boolean miss = false;
      private boolean isbaam= false;
      private boolean baamhit;
      GameManager gm;

      public boolean hitstatus() {
            return hit;
      }

      public boolean missstatus() {
            return miss;
      }
      public boolean baamhit() {
            return baamhit;
      }

      public void hit() {
            miss = false;
            hit = true;
      }

      public Bubble(GameManager gm,boolean isbaam) {
            this.gm = gm;
            x = (int) (Math.random() * 750) + 1;
            this.radius = this.randomSIZE / 2;
            this.isbaam=isbaam;
      }

      public void screenDraw(Graphics g) {
            if(isbaam) {
                  g.drawImage(baam, x, y, null);
            }else
                  g.drawImage(changedImg, x, y, null);
      }

      public void flow() {
            y--;
            x += (int) (Math.random() * 3) - 1;
            if (x <= 0)
                  x++;
            if (x > 700)
                  x--;
            if (y < -10) {
                  miss = true;
                  missstatus();
            }
            judge();
      }

      @Override
      public void run() {
            while (true) {
                  if (gm.play()) {
                        try {
                              flow();
                              if (!miss) {
                                    if (GameManager.score > 200)
                                          Thread.sleep(BubblepopDriver.SLEEP_TIME + (int) (Math.random() * 10) + 1 - 2);
                                    else if (GameManager.score > 400)
                                          Thread.sleep(BubblepopDriver.SLEEP_TIME + (int) (Math.random() * 10) + 1 - 4);
                                    else if (GameManager.score > 600)
                                          Thread.sleep(BubblepopDriver.SLEEP_TIME + (int) (Math.random() * 10) + 1 - 6);
                                    else if (GameManager.score > 800)
                                          Thread.sleep(BubblepopDriver.SLEEP_TIME + (int) (Math.random() * 10) + 1 - 8);
                                    else if (GameManager.score > 1000)
                                          Thread.sleep(BubblepopDriver.SLEEP_TIME - 5);
                                    else if (GameManager.score > 1500)
                                          Thread.sleep(BubblepopDriver.SLEEP_TIME - 8);
                                    else
                                          Thread.sleep(BubblepopDriver.SLEEP_TIME + (int) (Math.random() * 10) + 1);

                              } else {
                                    interrupt();
                                    break;
                              }

                        } catch (Exception e) {
                              System.err.println(e);
                        }
                  } else {
                        interrupt();
                        break;
                  }
            }
      }

      public void judge() {
            if (y <= -10) 
            else if (MouseListner.x <= x + radius && MouseListner.x >= x - radius && MouseListner.y <= y + radius
&& MouseListner.y >= y - radius) {
                  if(!isbaam) {
                        play("./Music/띠링.wav");
                        hit();
                        hitstatus();
                        System.out.println("hit"); //동작체크하기
                        MouseListner.x = -100;
                        MouseListner.y = -100;
                  }
                  else{
                        play("./Music/주먹-퍽.wav");
                        baamhit=true;
                        baamhit();
                        System.out.println("hit"); //동작체크하기
                        MouseListner.x = -100;
                        MouseListner.y = -100;
                  }
            }
      }

      public void play(String name) {
            try {
                  bgm = AudioSystem.getAudioInputStream(new File(name));
                  clip = AudioSystem.getClip();
                  clip.stop();
                  clip.open(bgm);
                  clip.start();
            } catch (Exception ex) {
                  System.err.println(ex);
            }
      }
}

5. MouseListner.JAVA

public class MouseListner extends MouseAdapter{
      public static int x=-100,y=-100;
      @Override
      public void mousePressed(MouseEvent e) {
            x= e.getX();
            y = e.getY();
      }
}