이번 자바 게임 만들기 시리즈는 순서가 중요하다. 포스팅의 내용이 이어지도록 작성하고 있다.
File 2는 File 1에서 이어지는 내용이다.
게임 엔진을 사용하지 않는 게임은 클래식 아케이드 스타일이 만들어진다. 아무리 아마추어의 게임제작에도 시간과 노력이 많이 들기 때문에 쉽게 만들어 지지 않는다. 자바의 경우 OOP 라서 좀 더 난해한 부분이 있다. 이 시리즈는 좀 길고 상세한 내용이 될 것 같다.
최근에는 게임을 만드는 툴이 잘 나와있기 때문에 굳이 이런 방식을 사용할 필요가 없다. 필자가 이 내용을 정리하는 것은 프로그래밍 실력의 향상 +@ 만드는 재미 때문이다. 컴퓨터 게임은 다양한 자원과 알고리즘을 사용해야 하기 때문에 과정에서 얻는게 많다. 미국의 AAA 개발자 중에는 게임을 개발하고 싶으면 플래피 버드 부터 만들어 보라는 충고를 하는 사람도 있다. 직접 해보면 생각보다 많은 것을 배울 수 있다고 한다.
본론으로 들어가서 File 1에서 프레임의 기본 셋업을 했다. 그 다음은 게임의 비주얼을 담당할 Display 부분을 우선 JFrame 으로 선정했다. (Display 는 자신만의 게임엔진을 완성하면 다른 라이브러리로 변경할 수 있다.)
다음에 필요한 클래스는 Game 클래스이다. Game 클래스는 게임루프를 담당하는 클래스다. 기본인 Launcher 가 있는데 Laucher에서 Display를 부르는게 아니라 Game 을 호출하도록 한다. Game 클래스는 Display 를 호출한다. Game 클래스에서 게임 루프, 업데이트, 렌더링 등의 작업이 모일 것이다.
Display 를 사용할 것이므로 속성에다가 추가한다.
Game 객체의 생성이 곧 Display (화면) 클래스의 인스턴스 생성임을 알 수 있다. 지난번의 내용 처럼 게임창의 타이틀, 너비, 높이가 들어간다.
package com.kay;
import com.kay.display.Display;
public class Game {
private Display display;
public int width, height;
public String title;
public Game(String title, int width, int height){
this.width = width;
this.height = height;
this.title = title;
display = new Display(title, width, height);
}
}
Game 클래스는 Display를 호출하고 그 Game 클래스를 처음 호출하는 것은 메인 메서드가 있는 Launcher 다.
package com.kay;
public class Launcher {
public static void main(String[] args) {
new Game("자바 2D게임 타이틀", 500, 500);
}
}
* Launcher의 main 메서드 -> Game() -> Display() 생성한다.
다소 복잡해 보인다. 객체지향 프로그래밍 방식에 충실하게 설계하는 것이다.
이제 Display 를 호출할 수 있게 되었는데 무언가를 그리려면 도화지가 필요하다.
Java에서 제공하는 가상의 도화지를 Canvas 객체라고 한다.
말 그대로 캔버스에 그리는 개념이다.
Display 에서 캔버스 객체에 그린다. 캔버스 (도화지)가 완성되면 Frame (액자)에 걸어 놓는다. 그런 개념이 적용되어 있다. JFrame 안에 Canvas 가 들어가는 것이다.
캔버스는 그릴 수 있는 곳이고 프레임은 걸어놓을 수 있는 곳이다. 이런 개념을 잡으면 조금은 더 이해가 빠를 것이다. 가상의 캔버스지만 컴퓨터 게임을 위한 그림을 그릴 수 있다.
캔버스는 매개변수를 Dimension 객체로 받는다. 결국 똑같은 width 와 height 가 계속 클래스를 거쳐서 전달되면 이 size를 가지고 프레임과 캔바스를 생성한다.
frame에 add 하는 것과 pack 메서드 까지 호출하면 준비가 끝난다.
package com.kay.display;
import javax.swing.*;
import java.awt.*;
public class Display {
private JFrame frame;
private Canvas canvas;
private String title;
private int width, height;
public Display(String title, int width, int height) {
this.title = title;
this.width = width;
this.height = height;
createDisplay();
}
private void createDisplay(){
frame = new JFrame(title);
frame.setSize(width, height);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
// Canvas instance
canvas = new Canvas();
canvas.setPreferredSize(new Dimension(width, height));
canvas.setMaximumSize(new Dimension(width, height));
canvas.setMinimumSize(new Dimension(width, height));
//add Canvas
frame.add(canvas);
frame.pack();
}
}
여기까지 작성하고 실행을 해봐도 아직 변화는 없다.
빈창만 덩그라니 놓여 있을 뿐이다. 허나 눈에 보이지 않아도 캔버스가 장착되어 있다. 눈으로는 안 보이지만 코드를 작성하면서 믿는다. 보이지 않는 것을 다루기에 쉽지는 않다.
다음 포스팅 File 3 에서는 게임루프 쪽에 좀 더 진행하도록 한다.