제일먼저 플레이어에게 속도를 정해 주겠습니다. 상수이기 때문에 대문자로 적습니다.
// 플레이어 속도 상태
private final int SPEED = 3;
그렇다면 플레이어의 이동 메서드에도 좌표 + SPEED 만큼 이동하게 됩니다.
@Override
public void right() {
System.out.println('R');
right=true;
new Thread(()-> {
while (right) {
setIcon(playerR);
x = x+SPEED;
setLocation(x, y);
try {
Thread.sleep(10); // 0.01초 간격
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}

up 이 실행되면 보글이는 한 칸 만큼 올라갈 수 있도록 해야합니다.
보통 업을 할 때는 단순히 위로만 올라가지 않고 right+up , left+up 이런 식으로 같이 작동하는 경우가 많습니다.
플레이어는 2가지 이상의 상태를 동시에 가질 수있습니다. 이렇게 2가지를 같이 실행 시키기 위해서는 Thread 가 필요합니다.
일단 단순히 올라가는 동작을 작성해 줍니다.
// left + up, right + up
@Override
public void up() {
System.out.println("up");
up = true;
new Thread(()->{
for(int i=0; i<100; i++) {
y = y - 1;
setLocation(x, y);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
실행 시키면 올라가는 모습이 제법 웃깁니다. JUMPSPEED 도 만들어 속도를 주도록 하겠습니다.

i<130/JUMPSPEED
를 해 주어야 항상 동일한 높이만큼 상승을 하게 됩니다. // left + up, right + up
@Override
public void up() {
System.out.println("up");
up = true;
new Thread(()->{
for(int i=0; i<130/JUMPSPEED; i++) {
y = y - JUMPSPEED;
setLocation(x, y);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
up = false;
down();
}).start();
}
@Override
public void down() {
System.out.println("down");
down = true;
new Thread(()->{
for(int i=0; i<130/JUMPSPEED; i++) {
y = y + JUMPSPEED;
setLocation(x, y);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
down = false;
}).start();
}
}

올라갔다 내려오는 동작이 자연스럽지만 보통 바닥이 있다면 그곳에 멈춰야 하죠 ㅎ…
또 다른 문제가 있습니다. 무한으로 up 을 누를 수 있기 때문에 화면을 뚫고 끊임없이 상승할 수 있다는 점입니다.
캐릭터가 up 이 아니고, down 중이 아닐 때만 up 동작을 하도록 설정해 줍니다.
case KeyEvent.VK_UP:
if(!player.isUp() && !player.isDown()) {
player.up();
}
break;
다음 시간에는 캐릭터가 벽에 충돌하는지 감지하여 공간을 뚫지 않도록 설정해 주는 코드를 작성하겠습니다.
Share article