danDevlog

JAVA 리듬게임 만들어 보기 - 1 본문

클론코딩

JAVA 리듬게임 만들어 보기 - 1

단데기이 2022. 3. 7. 22:27
728x90

Main.java

package dynamic_beat_4;

public class Main {
	
	public static final int SCREEN_WIDTH = 1280;
	public static final int SCREEN_HEIGHT = 720;

	public static void main(String[] args) {
		new DynamicBeat();
	}

}

 

DynamicBeat.java

package dynamic_beat_4;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class DynamicBeat extends JFrame {

	private Image screenImage;
	private Graphics screenGraphic;
	
	// JLabel은 문자열 및 이미지를 화면에 출력 | ImageIcon은 이미지 파일로부터 이미지를 읽음
	// exit버튼에 마우스를 접촉시킬때의 이미지들
	private ImageIcon exitButtonEnteredImage = new ImageIcon(Main.class.getResource("../images/exitButtonEntered.png"));
	private ImageIcon exitButtonBasicImage = new ImageIcon(Main.class.getResource("../images/exitButtonBasic.png"));

	// 이미지 파일을 얻어온 뒤에, getImage로 이미지 인스턴스를 얻어온 후 이미지 변수에다 초기화함
	private Image introBackground = new ImageIcon(Main.class.getResource("../images/introBackground(Title).jpg"))
			.getImage();
	// menuBar라는 JLabel 객체 생성
	private JLabel menuBar = new JLabel(new ImageIcon(Main.class.getResource("../images/menuBar.png"))); 
	// 버튼에 이미지 삽입
	private JButton exitButton = new JButton(exitButtonBasicImage);
	
	

	private int mouseX, mouseY;

	public DynamicBeat() {
		setUndecorated(true); // 기본적으로 존재하는 윈도우 메뉴바를 없애줌
		setTitle("Dynamic Beat");
		setSize(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT); // 게임창 크기 지정
		setResizable(false); // 게임창 크기 재조정 false
		setLocationRelativeTo(null); // 항상 화면의 정중앙에 위치하게
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 게임창을 끄면 완전히 종료하게함
		setVisible(true); // 게임창을 보이게함
		setBackground(new Color(0, 0, 0, 0)); // paintComponents를 했을때 배경이 회색이 아닌 흰색으로 바뀌게 해줌
		setLayout(null); // 버튼이나 JLabel을 넣었을때 그 위치 그대로 고정?
		
		exitButton.setBounds(1245, 0, 30, 30); // exit버튼의 위치 및 크기 지정
		exitButton.setBorderPainted(false); // 버튼 테두리 설정
		exitButton.setContentAreaFilled(false); // 버튼 영역 배경 표시 설정
		exitButton.setFocusPainted(false); // 포커스 표시 설정
		
		exitButton.addMouseListener(new MouseAdapter() {
			// 마우스를 버튼에 접촉시켰을때
			@Override
			public void mouseEntered(MouseEvent e) {
				exitButton.setIcon(exitButtonEnteredImage);
				exitButton.setCursor(new Cursor(Cursor.HAND_CURSOR));
				Music buttonEnteredMusic = new Music("buttonEnteredMusic.mp3", false);
				buttonEnteredMusic.start();
			}
			// 마우스가 버튼에 접촉안되었을때
			@Override
			 public void mouseExited(MouseEvent e) {
				exitButton.setIcon(exitButtonBasicImage);
				exitButton.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
			}
			// 마우스 버튼을 눌렀을때
			@Override
			public void mousePressed(MouseEvent e) {
				Music buttonEnteredMusic = new Music("buttonPressedMusic.mp3", false);
				buttonEnteredMusic.start();
				try {
					Thread.sleep(1000);
				} catch (InterruptedException ex) {
					ex.printStackTrace();
				}
				System.exit(0);
			}
		});
		add(exitButton);

		menuBar.setBounds(0, 0, 1280, 30); // 메뉴바의 위치와 크기 지정
		menuBar.addMouseListener(new MouseAdapter() {
			// 마우스 클릭 이벤트가 발생했을때 X좌표와 Y좌표를 얻어온다.
			@Override
			public void mousePressed(MouseEvent e) {
				mouseX = e.getX();
				mouseY = e.getY();
			}
		});
		menuBar.addMouseMotionListener(new MouseMotionAdapter() {
			// 마우스를 드래그할때 그 순간순간 마다의 x,y좌표를 얻어와서 그 해당위치로 게임창의 위치를 바꿔줌
			@Override
			public void mouseDragged(MouseEvent e) {
				int x = e.getXOnScreen();
				int y = e.getYOnScreen();
				setLocation(x - mouseX, y - mouseY);
			}
		});
		add(menuBar);

		Music introMusic = new Music("lion.mp3", true);
		introMusic.start();
	}

	// 화면을 그려주는 함수
	public void paint(Graphics g) {
		screenImage = createImage(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT);
		screenGraphic = screenImage.getGraphics();
		screenDraw(screenGraphic);
		g.drawImage(screenImage, 0, 0, null);
	}

	public void screenDraw(Graphics g) {
		// 배경화면 그려줌
		g.drawImage(introBackground, 0, 0, null);
		// JLabel 그려줌
		paintComponents(g);
		this.repaint();
	}
}

Music.java

package dynamic_beat_4;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

import javazoom.jl.player.Player;

// mp3파일을 실행시키기 위해서 javazoom의 jlayer라는 라이브러리를 포함시켜야한다.
public class Music extends Thread {
	private Player player;
	private boolean isLoop; // 현재 곡이 무한반복인지 아닌지
	private File file;
	private FileInputStream fis;
	private BufferedInputStream bis;
	
	public Music(String name, boolean isLoop) {
		try {
			this.isLoop = isLoop; 
			file = new File(Main.class.getResource("../music/" + name).toURI());
			fis = new FileInputStream(file);
			bis = new BufferedInputStream(fis);
			player = new Player(bis);
		}catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	// 현재 노래가 어느 위치(시간)까지 재생되었는지 알려줌
	public int getTime() {
		if (player == null)
			return 0;
		return player.getPosition();
	}
	
	// 음악이 언제 시작되었던간에 종료할 수 있게 해줌
	public void close() {
		isLoop = false;
		player.close();
		this.interrupt(); // 해당 스레드를 중지상태로 만듬
	}
	
	// Thread를 상속받으면 무조건 사용해야하는 함수
	@Override
	public void run() {
		try {
			do {
				player.play();
				fis = new FileInputStream(file);
				bis = new BufferedInputStream(fis);
				player = new Player(bis);
			} while (isLoop);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

'클론코딩' 카테고리의 다른 글

JAVA 리듬 게임 만들어보기 - 2  (0) 2022.03.17
Comments