게임만들기(1) - "JAVADOT" 플랫폼게임

2021. 7. 8. 01:08프로그래밍/개인프로젝트

JavaUI를 이용해서 플랫폼게임을 만드는 과정을 기록합니다.

 

예시입니다

게임의 컨셉:

로그라이크 플랫폼 게임

시작시 기본적으로 점프횟수가 1 주어지고 주황색으로 표시한 enegy를 먹으면 점프횟수가 1개씩 증가한다.

점프시 점프횟수 1차감하고 점프횟수가 0이되면 점프를 할 수 없다

회색 직사각형으로 표시한 door에 닿으면 다음층으로 넘어간다

맵밖으로 아웃되거나, 시간을 초과하거나, esc버튼을 눌러 초기화하면 1층부터 다시시작한다

 

+ 조작법, 층수표시등을 추가해야하고 맵은 더 복잡하고 가로로 길게 구현할 예정이다


만들기에 앞서 대략적인 설계를 했다

public void start(stage primaryStage){ 
	MainPage();
		
	Scene scene = new Scene(mainContainer);
	scene.setOnKeyPressed(e -> keys.put(e.getCode(), true));
	scene.setOnKeyReleased(e -> keys.put(e.getCode(), false));
	primaryStage.setTitle("JAVADOT");
	primaryStage.setScene(scene);
	primaryStage.show();
		
	AnimationTimer timer = new AnimationTimer() {
		@Override
		public void handle(long now) {
			sceneUpdate();
		}
	};
	timer.start();
} 
// 메인함수를 시작하는 메소드이다 
// 구현한 MainPage()메소드사용
// scene생성
// 키이벤트등록
// scene등록, 제목설정. show메소드 사용
// AnimationTimer를 통해 지속적으로 데이터값을 받아온다
private Node createObject(int x, int y, int w, int h, Color color) {
		Rectangle object = new Rectangle(w, h);
		object.setTranslateX(x);
		object.setTranslateY(y);
		object.setFill(color);
		
		blockContainer.getChildren().addAll(object);
		return object;
	}
// 사각형 객체를 생성하는 메소드
// player, block, energy, door등을 생성하는데 사용한다
private void MainPage() { 
		
	Rectangle bg = new Rectangle(WIDTH, HEIGHT, Color.IVORY); 
        	// 배경화면으로 쓰일 bg생성
            
	for (int i = 0; i < BlockData.BLOCK1.length; i++) { 
        //범위 : 0 ~ BlockData클래스의 BLOC1 '배열의 길이'  length;
			String line = BlockData.BLOCK1[i];	
		for (int j = 0; j < line.length(); j++) {		
            // 범위 :0 ~ BlockData클래스의 각 배열당 '문자열의 길이' length();
		switch (line.charAt(j)) {	
            // line의 문자열을 하나하나 체크해서 0이면 빈값 1이면 블럭만들기 (
	case '0': //빈값
			break;
	case '1': // block객체생성
			Node block = createObject(j*10, i*10, 10, 10, Color.LIGHTGRAY);
			blocks.add(block);
			break;
        case '2':// energy객체 생성
			Node energy = createObject(j*10, i*10, 10, 10, Color.LIGHTGRAY);
			blocks.add(enegry);
			break;
        case '3': // door객체 생성
			Node door = createObject(j*10, i*10, 10, 10, Color.LIGHTGRAY);
			blocks.add(door);
			break;
			}
		}
	}
	player = createPlayer(0, 600, 20, 20, Color.DODGERBLUE);
		
	mainContainer.getChildren().addAll(bg, blockContainer);
}
    
private boolean isPressed(keyCode Key){
    return keys.getOrDefault(key, false);
	//keys객체를 만드는 HashMap클래스에 쓰이는 메소드,
    //getOrDefault = key가 존재하면 key값을 반환하고 존재하지않으면 디폴트값인 false를 반환
}

private void sceneUpdate() { 
	왼쪽 키 입력시 ~~~
	오른쪽 키 입력시 ~~~
	스페이스바 입력시 ~~~
	낙하속도할당 후 movePlayerY에 전달
}

private void movePlayerX(int value) {
	좌/우이동, 카메라이동,energy와 충돌구현, door와 충돌구현
}

private void movePlayerY(int value) {
	player객체 낙하, block과 충돌구현, 점프
}