Java Swing을 이용하여 스네이크 게임을 만든 토이 프로젝트 입니다.
paint(Graphics g)는 컴포넌트에 그림을 그리기 위한 것으로 Component 클래스에 정의되어 있어서, 모든 컴포넌트에서 사용할 수 있음
awt에서는 Componenet 자신을 그리기 위해서 paint()를 override하여서 사용함(awt)
paintComponent는 paint 메소드를 좀 더 세분화하여 만든 메소드임(Swing)
paint 메소드 실행 주체(JVM)
paint 메소드가 호출되는 시점 -> awt 스레드에 의해 자동으로 호출된다고 함;;
repaint() awt 스레드에게 화면을 갱신할 것을 요청함
awt 스레드는 0.1초마다 확인해서 요청이 있으면 update()를 호출함
update() 화면을 지우고 다시 paint()를 호출함
* If this component is a lightweight component, this method
* causes a call to this component's <code>paint</code>
* method as soon as possible. Otherwise, this method causes
* a call to this component's <code>update</code> method as soon
* as possible.
paint 메소드의 호출되고, 그렇지 않으면 update 메소드의 호출이 된다
x,y 좌표 값을 배열로 하는 이유
아직까진 나의 생각이지만 자바 GUI에선 x,y좌표로 컴포넌트들을 배치를 한다. 우리가 그릴려고 하는 뱀도 x,y좌표로 그린다. 하지만 뱀은 사용자 키보드 이벤트에 의해 x,y 좌표 값이 변한다 그렇기에 각 좌표별로 배열을 만들어 이벤트가 감지될때마다 값을 증가 시킨다
뱀 생성 코드
private void doDrawing(Graphics g) {
if (true) {
g.drawImage(apple, apple_x, apple_y, this);
for (int i = 0; i < dots; i++) {
if (i == 0) {
g.drawImage(head, x[i], y[i], this);
}else {
g.drawImage(tail, x[i], y[i], this);
}
}
} else {
System.out.println("doDrawing 실패");
}
}
i의 값이 0인 경우는 뱀의 머리를 의미하기에 분기문을 이용하여 머리부분과 꼬리부분을 나눠서 생성함
actionPerformed(ActionEvent e) - ActionEvent가 발생하면 호출
KeyListener를 구현하여 사용중이기때문에 키보드 이벤트가 발생할때마다 ActionEvent가 발생함
즉 키보드 이벤트 값에 따라 변화되는 값들은 ActionEvent 메소드 안에 구현하면 됨
move() - DOT_SIZE (10) 만큼 x,y축으로 움직이기
actionPerformed 이벤트와 keyListener 이벤트 이슈 처리