Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 초성게임앱 #플러터앱 #플러터카운트다운
- flutter #android #androidstudio
- 앱번들
- Flutter #플러터 #모바일앱만들기 #GetX
- GetX #CustomScrollView #Flutter
- 플러터 #Flutter #파이어베이스 #firebase #firestore #파이어스토어
- Flutter #플러터 #프로젝트 #파이어베이스 #파이어스토어 #Firebase #FireStore
- 복권번호예측 #Flutter #플러터 #Provider
- 복권번호예측기 #Flutter #adMob #광고배너 #리워드형광고
- 유니티게임 #상점만들기 #뽑기구현 #케이디리듬게임
- AAB
- 플레이스토어 앱등록
Archives
- Today
- Total
이코노딩
JAVA 프로젝트: 슈팅 게임 만들기 본문
▶보고서
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();
}
}