https://youtube.com/playlist?list=PLRx0vPvlEmdDySO3wDqMYGKMVH4Qa4QhR
이번 자바 스터디는 동빈나님의 자바 리듬게임 만들기 영상을 기반으로 진행하게 되었습니다
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 함수를 불러옴
}
}
배경 이미지 가져온 사이트
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' 카테고리의 다른 글
자바 독학 [자바의 정석 | Ch5 ] : 스터디 기록 3 (0) | 2023.09.27 |
---|---|
자바 독학 [자바의 정석] : 스터디 기록 2 (0) | 2023.09.15 |
Chat GPT를 활용하여 Java 기초 공부하기 (0) | 2023.09.14 |
자바 리듬게임 만들기 ( 7강 ) (0) | 2023.08.13 |
자바 독학 [자바의 정석] : 스터디 기록 1 (0) | 2023.07.20 |