https://youtube.com/playlist?list=PLRx0vPvlEmdDySO3wDqMYGKMVH4Qa4QhR
자바(JAVA) 리듬게임 만들기 강좌(How To Make Java Rhythm Game)
www.youtube.com
이번 자바 스터디는 동빈나님의 자바 리듬게임 만들기 영상을 기반으로 진행하게 되었습니다
1강 (자바 개발 환경 구축 및 GUI 시작하기)
환경변수 - 자바로 작성된 부분을 빠르게 컴파일할 수 있도록 도와주는 것
자바 패키지 - 프로그램이 실행되는 하나의 단위
클래스 - 자바와 같은 객체 지향 언어에서 하나의 틀 역할을 한다
Main.java
package dynamic_beat_1;
public class Main {
public static final int SCREEN_WIDTH = 1280; //public static 프로젝트 내부에서 모두 공유하는 것
public static final int SCREEN_HEIGHT = 720; //상수 같은 경우 전부 대문자를 이용해 작성
public static void main(String[] args) {
new DynamicBeat();
}
}
DynamicBeat.java
package dynamic_beat_1;
public class Main {
public static final int SCREEN_WIDTH = 1280; //public static 프로젝트 내부에서 모두 공유하는 것
public static final int SCREEN_HEIGHT = 720; //상수 같은 경우 전부 대문자를 이용해 작성
public static void main(String[] args) {
new DynamicBeat();
}
}
2강 (게임 시작 화면 개발하기)
images 폴더 만들기
자바에서 이미지를 그대로 가져오게 되면 문제가 생길 수 있음
더블 버퍼링 전체 화면에 맞는 이미지를 매 순간 마다 생성하여 원하는 컴포넌트를 화면에 출력하는 방식
(버퍼에 담아 매 순간 마다 이미지 출력)
Main.java
package dynamic_beat_2;
public class Main {
public static final int SCREEN_WIDTH = 1280; //public static 프로젝트 내부에서 모두 공유하는 것
public static final int SCREEN_HEIGHT = 720; //상수 같은 경우 전부 대문자를 이용해 작성
public static void main(String[] args) {
new DynamicBeat();
}
}
DynamicBeat.java
package dynamic_beat_2;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JFrame; //라이브러단축키 ctrl + shift + O
public class DynamicBeat extends JFrame{ //그래픽 기반
private Image screenImage;
private Graphics screenGraphic; //더블 버퍼링을 위해 전체 화면의 이미지를 담는 두 인스턴스
private Image IntroBackground;
public DynamicBeat() {
setTitle("Dynamic Beat");
setSize(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT); //1280 * 720
setResizable(false); //사용자가 인위적으로 화면을 줄일 수 없도록
setLocationRelativeTo(null); //실행 시 만든 화면창이 컴퓨터 정중앙에 위치하도록
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //게임창 종료 시 전체 프로그램 종료를 알림
setVisible(true); //만든 게임창이 출력되도록
IntroBackground = new ImageIcon(Main.class.getResource("../images/IntroBackground.jpg")).getImage();
//메인페이지의 위치를 기반으로 해서 IntroBackground라는 이름의 이미지 변수에 초기화
}
public void paint(Graphics g) {
screenImage = createImage(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT); //프로그램 화면 만큼 이미지를 생성
screenGraphic = screenImage.getGraphics(); //screenGraphic객체를 통해 이미지를 얻어온다
screenDraw(screenGraphic);
g.drawImage(screenImage, 0, 0, null);
}
public void screenDraw(Graphics g) { //프로그램이 종료되기 전까지 해당 작업을 계속 반복
g.drawImage(IntroBackground, 0, 0, null); //0, 0 위치에 그려줌
this.repaint(); //paint 함수를 불러옴
}
}
WallpapersWide.com - Free 4K & 8K UltraHD Desktop Backgound Wallpapers for UHD TV, Ultra Widescreen Desktop, Tablet, Smartphone
wallpaperswide.com
배경 이미지 가져온 사이트
3강 (시작 화면에 음악 삽입하기)
오디오를 재생하기 위해서는 자바 라이브러리가 필요
영상을 따라 하였으나 음악 재생이 되지 않음
Main.java
package dynamic_beat_3;
public class Main {
public static final int SCREEN_WIDTH = 1280; //public static 프로젝트 내부에서 모두 공유하는 것
public static final int SCREEN_HEIGHT = 720; //상수 같은 경우 전부 대문자를 이용해 작성
public static void main(String[] args) {
new DynamicBeat();
}
}
DynamicBeat.java
package dynamic_beat_3;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JFrame; //라이브러단축키 ctrl + shift + O
public class DynamicBeat extends JFrame{ //그래픽 기반
private Image screenImage;
private Graphics screenGraphic; //더블 버퍼링을 위해 전체 화면의 이미지를 담는 두 인스턴스
private Image IntroBackground;
public DynamicBeat() {
setTitle("Dynamic Beat");
setSize(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT); //1280 * 720
setResizable(false); //사용자가 인위적으로 화면을 줄일 수 없도록
setLocationRelativeTo(null); //실행 시 만든 화면창이 컴퓨터 정중앙에 위치하도록
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //게임창 종료 시 전체 프로그램 종료를 알림
setVisible(true); //만든 게임창이 출력되도록
IntroBackground = new ImageIcon(Main.class.getResource("../images/IntroBackground.jpg")).getImage();
//메인페이지의 위치를 기반으로 해서 IntroBackground라는 이름의 이미지 변수에 초기화
Music IntroMusic = new Music("IntroMusic.mp3", true); //프로그램 시작 시 음악이 무한정 반복
IntroMusic.start();
}
public void paint(Graphics g) {
screenImage = createImage(Main.SCREEN_WIDTH, Main.SCREEN_HEIGHT); //프로그램 화면 만큼 이미지를 생성
screenGraphic = screenImage.getGraphics(); //screenGraphic객체를 통해 이미지를 얻어온다
screenDraw(screenGraphic);
g.drawImage(screenImage, 0, 0, null);
}
public void screenDraw(Graphics g) { //프로그램이 종료되기 전까지 해당 작업을 계속 반복
g.drawImage(IntroBackground, 0, 0, null); //0, 0 위치에 그려줌
this.repaint(); //paint 함수를 불러옴
}
}
Music.java
package dynamic_beat_3;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import javazoom.jl.player.Player;
public class Music extends Thread{ //thread란 하나의 작은 프로그램
private Player player; //라이브러리를 말함
private boolean isLoop; //mp3파일이 무한 반복인지 한 번만 반복인지
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/IntroMusic.mp3").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) //0.001초 단위까지 알려줌
return 0;
return player.getPosition();
}
public void close() { //언제 실행되던 항상 종료할 수 있게 해줌
isLoop = false;
player.close(); //해당 곡이 안정적으로 종료될 수 있도록 도움
this.interrupt();
}
@Override
public void run() {
try { //곡 실행
do {
player.play(); //곡 실행
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
player = new Player(bis);
} while (isLoop); //isLoop의 값이 true일 경우 무한반복
} catch(Exception e) { //오류 메세지 출력
System.out.println(e.getMessage()); //오류가 발생한 경우 해당 오류 메세지 발생
}
}
}
실행화면 💻

진행하면서 어려웠던 부분 🥴
코드가 점차 길어지면서 조금 혼란스럽긴 하였으나
그래도 설명을 잘해주셔서 따라가는 데 어려움은 없었던 거 같다
코드를 실행해가며 화면에 이미지가 나타날 때 무척 기뻤던 거 같다
오디오는 무슨 문제인지는 모르겠으나 재생이 되지 않아 많이 아쉽다..
'스터디 > java' 카테고리의 다른 글
자바 독학 [자바의 정석] : 스터디 기록 2 (0) | 2023.09.15 |
---|---|
Chat GPT를 활용하여 Java 기초 공부하기 (0) | 2023.09.14 |
자바 리듬게임 만들기 ( 7강 ) (0) | 2023.08.13 |
자바 리듬게임 만들기 ( 4 - 6 강 ) (0) | 2023.08.06 |
자바 독학 [자바의 정석] : 스터디 기록 1 (0) | 2023.07.20 |