Snake-Game

Lee·2020년 6월 16일
0

Project

목록 보기
2/7
post-thumbnail

개요

Java Swing을 이용하여 스네이크 게임을 만든 토이 프로젝트 입니다.

삽질 기록

  • pack() : 컨테이너의 크기를 구성 요소 들의 크기로 설정하는 메소드
  • paint(Graphics g) : 이 메소드가 사용하면 다른 곳에서 setBackground 메소드를 적용해도 먹히질 않음

paint(Graphics g)과 paintComponent(Graphics g) 차이점

  • paint(Graphics g)는 컴포넌트에 그림을 그리기 위한 것으로 Component 클래스에 정의되어 있어서, 모든 컴포넌트에서 사용할 수 있음
    awt에서는 Componenet 자신을 그리기 위해서 paint()를 override하여서 사용함(awt)

  • paintComponent는 paint 메소드를 좀 더 세분화하여 만든 메소드임(Swing)

    • paintComponent
    • paintChildren
    • paintBorder
  • paint 메소드 실행 주체(JVM)

  • paint 메소드가 호출되는 시점 -> awt 스레드에 의해 자동으로 호출된다고 함;;

    • 처음 화면에 나타날 때(GUI Application이 실행 될 때)
    • 다른 화면에 가려져 있던 부분이 다시 화면에 나타날 때
    • 아이콘화 되어 있다가 원래 크기로 화면에 나타날 때
  • 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 이벤트 이슈 처리

event thread

  • AWT은 단일 스레드 모델을 사용하여 작동..
  • GUI의 상태를 변경하거나 이벤트 핸들링 하는 코드는 모두 하나의 스레드에서 실행되어야 함
  • 화면에 보이는 모든 GUI 객체와 각 객체의 상태 변경에 대한 스레드 안정성을 보장하는 것은 비효율적이기에 단일 스레드 모델을 사용함

timer

  • initGame() 메소드 안에 timer 객체를 초기화 한 후 start() 메소드를 호출하는 구간이 있음..
  • 솔직히 처음에 왜 쓰는지 몰랐음;
  • 단일 스레드 때문에 추가적으로 스레드 하나를 더 만들어서 이벤트 처리를 하게끔 함
  • event thread와 timer 때문에 시간을 좀 많이 쓴 것 같다. thread 관련되서 조그마한 글을 작성해야 할 듯...

참고용

  • 사실 참고용이 아니라 거의 클론코딩에 가까운 수준으로 프로젝트를 진행하였고, 추가적으로 점수판 기능과 게임 재시작 기능을 만들었음

janbodnar/Java-Snake-Game

소스

LeeJeongSeok/Snake-Game

0개의 댓글