본문 바로가기
JAVA

자바 비행기 게임 만들어보기 #1

by binghe819 2020. 4. 30.
자바를 배우고, 한번도 나만의 프로젝트를 해본 적이 없다. 
즉, 처음부터 내가 모든 것을 설계하고, 코드를 짜본적이 없다는 것이다.

자바 공부를 하고는 있는데, 문득 뭔가 정체되있다는 기분이 들었다. 

여러 개발 블로그에 동기부여를 받아, 나의 첫번째 사이드 프로젝트를 시작해보려고 한다.

'시작이 반이다'라는 말이 있지 않은가?? 오늘부터 꾸준히 집중해서 만들어 보려고 한다.

모든 코드는 Github에 공유 할 생각이다.

틀린 개념이나 비효율적인 부분이 많을 것입니다.
여러 문제점에 대한 댓글 환영합니다~

주제

1945같은 2D로 된 비행기 게임을 구현할 예정이다.

Unity를 쓰지않고, 자바의 GUI를 사용할 예정이다.

 

이루고자 하는 목표

  • 자바 익숙해지기 ( 클래스, 스레드 등등 )
  • 객체지향 설계해보기

순서

오늘 자바의 Swing ( JFrame )에 대해 익숙해지기 위해서 GUI화면 상에 비행기를 띄워서 움직이는 것 까지 구현 해볼 예정이다.

  • 자바 GUI로 비행기 출력
  • 비행기 움직이기

 

자바 GUI로 비행기 출력

import javax.swing.*;
import java.awt.*;

// Main
public class Main {

    public static void main(String[] args){
        new Game_View();
    }
}

public class Game_View extends JFrame {

    Toolkit imageTool = Toolkit.getDefaultToolkit();
    Image flight = imageTool.getImage("res/img/F4K.png");

    public Game_View(){
        // 프레임의 대한 설정.
        setTitle("JFrame 테스트"); // 프레임 제목 설정.
        setSize(854,480); // 프레임의 크기 설정.
        setResizable(false); // 프레임의 크기 변경 못하게 설정.
        setVisible(true); // 프레임 보이기;
        setDefaultCloseOperation(DISPOSE_ON_CLOSE); // 프레임의 x버튼 누르면 종료;
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(flight, 100,100,this); // 비행기 이미지 출력.
    }
}

비행기 출력 성공!

JFrame과 paint를 사용해서 비행기를 그려보았다. 이제 비행기의 움직임을 구현해보겠다.

 

비행기 움직이기

2D 슈팅 비행기 게임인 만큼 비행기를 움직이면서 미사일도 발사하고 스킬도 사용하고 해야한다.

 

이번엔 비행기를 움직이는 것까지 구현을 해 볼 예정이다.

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Game_View extends JFrame implements Runnable{

    // 이미지 파일 불러오는 툴킷.
    Toolkit imageTool = Toolkit.getDefaultToolkit();
    Image flight = imageTool.getImage("res/img/F4K.png");

    // 플레이어 비행기의 위치값.
    int xpos = 100;
    int ypos = 100;

    public Game_View(){
        // 프레임의 대한 설정.
        setTitle("JFrame 테스트"); // 프레임 제목 설정.
        setSize(854,480); // 프레임의 크기 설정.
        setResizable(false); // 프레임의 크기 변경 못하게 설정.
        setVisible(true); // 프레임 보이기;
//        setDefaultCloseOperation(DISPOSE_ON_CLOSE); // 프레임의 x버튼 누르면 프레임스레드 종료.
        setDefaultCloseOperation(EXIT_ON_CLOSE); // 프레임의 x버튼 누르면 프로세스 종료.

        // 키 어댑터 ( 키 처리용 )
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                switch(e.getKeyCode()) {
                    case KeyEvent.VK_UP:
                        ypos-=5;
                        break;
                    case KeyEvent.VK_DOWN:
                        ypos+=5;
                        break;
                    case KeyEvent.VK_LEFT:
                        xpos-=5;
                        break;
                    case KeyEvent.VK_RIGHT:
                        xpos+=5;
                        break;
                }
            }
        });
    }

    // 움직임에 따른 그림 그리기.
    @Override
    public void paint(Graphics g) {
        System.out.println("paint called");
        g.clearRect(0,0,854, 480);
        g.drawImage(flight, xpos,ypos,this);
    }

    // repaint 스레드.
    @Override
    public void run() {
        try{
            while(true) {
                repaint();
                Thread.sleep(15);
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

public class Main {

    public static void main(String[] args){
        Game_View game_view = new Game_View();
        new Thread(game_view).start();
    }
}

움직임 성공.

키 어댑터를 사용하여 키를 누를때마다 이벤트가 발생시키게 하였으며, repaint()를 지속적으로 해야해서 스레드를 하나 생성하여 새로운 흐름을 만들게 하였다. ( 뒤 포스터에서 수정 되었다. )

 

지속적으로 전체 화면을 지웠다가 다시 그리는거라 자주 깜빡거린다. 하지만 그래도 키 리스너를 연결시켜서 입력값에 따른 비행기의 움직임을 구현해보았다.

'JAVA' 카테고리의 다른 글

자바 비행기 게임 만들어보기 #4  (0) 2020.05.04
자바 비행기 게임 만들어보기 #3  (0) 2020.05.02
자바 비행기 게임 만들어보기 #2  (0) 2020.05.01

댓글