본문 바로가기

개인프로젝트/리듬게임만들기

[내가 만든 프로젝트 코드 분석 | 리듬게임 만들기] 15.노트 판정 함수

각각의 노래의 박자에 맞게 노트를 작성합니다.

@Override
	public void run() {
		dropNotes(this.titleName); // 선택된 곡 노트드랍
	}
    
public void dropNotes(String titleName) { // 선택된 곡 매개변수
		Beat[] beats = null;
		if(titleName.equals("Again") && difficulty.equals("Easy")) {
		// 난이도 구분
			int startTime = 1000 - Main.REACH_TIME * 1000;
			int gap = 125; // 1/8의 간격으로 노트드랍
			beats = new Beat[] {
					new Beat(startTime, "S"),
					new Beat(startTime + gap * 2, "D"),
					new Beat(startTime + gap * 4, "S"),
					new Beat(startTime + gap * 6, "F"),
							.
	                        .
							.노트작성
						    .
						    .
					new Beat(startTime + gap * 340, "Space")
			};	
		}

노트가 화면을 지나가면 사라질 수 있도록 만듭니다.

private String noteType;
private boolean proceeded = true; // 현재 노트 진행여부 변수

public String getNoteType() { // 현재 노트타입 반환메소드
		return noteType;
	}
public boolean isProceeded() { // getter메소드 생성
		return proceeded;
	}
	
public void close() { // 노트 중지  
		proceeded = false;
	}

public void drop( ) { // 판정 범위 
		y += Main.NOTE_SPEED;
		if(y > 620) { // 판정바 위치를 벗어나는 경우 
			System.out.println("Miss");
			close();
		}
	}

public void run() {
		try {
			while (true) {
				drop();
				if(proceeded) { // 진행중이라면 간격만큼 이동 
					Thread.sleep(Main.SLEEP_TIME);
				}
				else {
					interrupt();  // 노트 쓰레드 정지
					break;
				}
			}
		} catch(Exception e) {
			System.err.println(e.getMessage());
		}
	}
	public void judge() { // 판정범위 설정
		if(y >= 613) {
			System.out.print("Late");
			return "Late";
		}
		else if(y >= 600 ){
			System.out.print("Good");
			return "Good"
		}
		else if(y >= 587 ){
			System.out.print("Great");
			return "Great"
		}
		else if(y >= 573 ){
			System.out.print("Perfect");
			return "Late"
		}
		else if(y >= 565 ){
			System.out.print("Great");
			return "Great"
		}
		else if(y >= 550 ){
			System.out.print("Good");
			return "Good"
		}
		else if(y >= 535 ){
			System.out.print("Early");
			return "Early"
		}
		return "None"
	}
	
	public int getY(){
		return y;	
	}

자료구조 q처럼 먼저 만들어진 노트가 먼저 판정을 받아야한다.

반복문을 통해 인덱스에서 0부터 탐색하여 가장 먼저 떨어지는 노트부터 판정할 수 있다.

public void judge(String input) { // 판정메소드
		for(int i = 0; i < noteList.size(); i++) {// 노트반복
			Note note = noteList.get(i); // 노트 한개씩 접근
			if(input.equals(note.getNoteType())) { // 입력키와 비교
				judgeEvent(note.judge()); // 판정메소드 매개변수
				break;
			}
		}
	}