https://notion6780.tistory.com/62

 

자바 Swing 예제. 플래포머 게임 만들기 1. 설계

자바의 스윙 Swing 도구를 이용하면JFrame, JLabel..간단한 플래포머 게임을 만들어볼 수 있다. 요구사항===== ===== 좌우로 이동하는 기능점프 기능좌우 벽 구현 작업의 전체 그림1.우선 화면을 보여줄

notion6780.tistory.com

 

전체 그림을 그렸으니 코드를 채워넣어야 한다.

 

이제 인터페이스는 건드리지 않고

주로 player 클래스가 구현한 메서드들이 실제 동작하도록 해본다.

 

 

⭐1. player 클래스 보강

 

기존 좌표값과 이미지 변수에 더해...

1) 속도를 상수로 구현

2)흐름제어변수

3)조건에 따라 움직임 상태를 재정의할 setter메서드 등을 추가했다.

public class Player extends JLabel implements Movable {

    //멤버변수
    private int x;
    private int y;

    private ImageIcon playerR, playerL;
    //private ImageIcon playerL;

    //플레이어의 속도를 정의
    private final int SPEED = 4;
    private final int JUMP_SPEED = 2;

    //플레이어의 움직임 상태를 정의
    private boolean left;
    private boolean right;
    private boolean up;
    private boolean down;

    //세터 setter
    public void setLeft(boolean left) {
        this.left = left;
    }

    public void setRight(boolean right) {
        this.right = right;
    }

    //생성자
    public Player() {
        initData();
        setInitLayout();
    }

 

4) 메서드에서는 캐릭터의 초기 위치와 동작상태를 정리해줬다.

좌표는 프레임 왼쪽 아래인 (55.535)이며

모든 동작은 정지된 상태다. 

private void initData() {
    playerR = new ImageIcon("img/playerR.png");
    playerL = new ImageIcon("img/playerL.png");

    //플레이어 초기 상태 설정
    x = 55;
    y = 535;
    left = false;
    right = false;
    up = false;
    down = false;
}

private void setInitLayout() {

    //라벨의 사이즈
    setSize(50, 50);

    //라벨의 아이콘을 바꿔주는 기능
    setIcon(playerR);

    //라벨의 위치를 지정
    setLocation(x, y);
}

 

5) 왼쪽이동

왼쪽으로 이동하게 되면

left = true;

라벨에 붙일 이미지를 왼쪽을 나타내는 이미지로 덮어씌운다.

6) 메서드 안에 익명클래스를 호출해

x좌표를 변경하고

x-= SPEED

 

변경된 값을 반영해준다.

setLocation(x, y);

 

x좌표가 변경되는 속도, 즉 캐릭터 속도는 

Thread.sleep(10)으로,  변경되는 텀을 0.01초로 조절한다.

 

7) 오른쪽 이동은 같은 구문을 반대로 쓰면 된다.

@Override
public void left() {

    left = true;

    setIcon(playerL);

    new Thread(new Runnable() {
        @Override
        public void run() {
            while (left) {

                x -= SPEED;

                setLocation(x, y);

                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }//while
        }//run()
    }).start(); //Thread()
}//left()

 

 

8) 점프

위쪽 방향키를 눌러 점프를 명령한다.

up = true;

 

9) 메서드 안에 익명클래스를 호출해

y좌표를 변경하고

y -= JUMP_SPEED

 

변경된 값을 반영해준다.

setLocation(x, y);

 

x좌표가 변경되는 속도, 즉 캐릭터 속도는 

Thread.sleep(5)으로,  변경되는 텀을 0.005초로 조절한다.

 

10) 목표 좌표(65)에 도달하고 for문이 끝나면

점프상태를 취소로 돌리고

up = false; 

 

11) 하강 메서드를 자동으로 호출한다

down();

@Override
public void up() {
    System.out.println("점프");

    //움직임 상태 변경
    up = true;

    //익명클래스
    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < (130 / JUMP_SPEED); i++) {

                y -= JUMP_SPEED;

                setLocation(x, y);

                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) { // 일단멈춤
                    throw new RuntimeException(e);
                }
            }// for

            //상태값을 잘 다뤄야 버그가 없다.
            up = false;

            //down 호출
            down();

        }
    }).start();
}//up

 

12) 하강

down메서드는 up메서드가 끝나면 자동으로 호출된다.

down = true;

 

13)익명클래스를 호출해 

y 좌표를 변경하고

y += JUMP_SPEED;

 

변경된 값을 반영해준다.

setLocation(x, y);

 

14) 목표 좌표(0)에 도달하고 for문이 끝나면

하강상태를 취소로 돌린다.

down = false; 

    @Override
    public void down() {

        down = true;

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < (130 / JUMP_SPEED); i++) {

                    y += JUMP_SPEED;

                    setLocation(x, y);

                    try {
                        Thread.sleep(3);
                    } catch (InterruptedException e) { // 일단멈춤
                        throw new RuntimeException(e);
                    }
                }// for

                //상태값을 잘 다뤄야 버그가 없다.
                down = false;

            }//run
            
        }).start();

    }//down
    
}//end of Player

많은 기능들이 구현됐지만 아직 갈 길이 멀다.

+ Recent posts