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