인터페이스 만들기
public interface Moveable {
public abstract void left();
public abstract void right();
public abstract void up();
public abstract void down();
}
플레이어에서 구현합니다.
// class Player -> 메모리에 띄울 수 있는 애들. 게임에 존재할 수 있다. (추상메서드를 가질 수 없다. 따라서 무조건 구현해 줄 의무를 가짐)
public class Player extends JLabel implements Moveable {
private int x;
private int y;
private ImageIcon playerR, playerL;
public Player() {
initObject();
initSetting();
}
private void initObject() {
playerR = new ImageIcon("image/playerR.png");
playerL = new ImageIcon("image/playerL.png");
}
private void initSetting() {
x = 55;
y = 535;
this.setIcon(playerR);
setSize(50, 50);
setLocation(x, y);
}
@Override
public void left() {
// TODO Auto-generated method stub
}
@Override
public void right() {
// TODO Auto-generated method stub
}
@Override
public void up() {
// TODO Auto-generated method stub
}
@Override
public void down() {
// TODO Auto-generated method stub
}
}
지금 플레이어는 x, y 라는 위치 상태를 갖고 있습니다. 움직임을 구현하기 위해서는 움직임 상태도 갖고 있어야 합니다.
// 위치 상태
private int x;
private int y;
// 움직임 상태
private boolean left;
private boolean right;
private boolean up;
private boolean down;
이를 init 에서 셋팅해 줍니다. 시작될때는 움직임이 존재하지 않기 때문에 false 로 초기화를 합니다.
private void initSetting() {
x = 55;
y = 535;
left = false;
right = false;
up = false;
down = false;
}
이제 이 플레이어를 움직이게 만들기 위해 키가 눌러지면 x, y 값을 변경 시켜 주어야 합니다.
BubbleFrame 에서 구현해 보겠습니다.
private void initListener() {
addKeyListener(null);
}
KeyListener는 인터페이스로,
keyPressed
, keyReleased
, keyTyped
라는 세 가지 추상 메서드를 가지고 있습니다. 이 인터페이스를 구현하는 클래스는 이 세 가지 메서드를 모두 구현해야 합니다.
익명 클래스로
new KeyListener()
를 작성하면 keyPressed
, keyTyped
, keyReleased
세 가지 메서드를 모두 구현해야 합니다.
하지만 우리가 keyPressed
만 필요로 하기 때문에 다른 메서드를 삭제하면 오류가 발생합니다.
이때는 KeyAdapter
라는 추상 클래스를 사용하여, 필요한 메서드만 오버라이딩할 수 있습니다. private void initListener() {
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
});
}
private void initListener() {
addKeyListener(new KeyAdapter() {
});
}

KeyAdapter 는 addKeyListener 를 상속받아 인터페이스를 미리 구현해 놓은 추상 클래스입니다.
따라서 필요한 메서드만 오버라이드하면 됩니다.
private void initListener() {
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
System.out.println(e.getKeyCode());
}
});
}
getKeyCode 한 뒤 실행하여 키보드 상하좌우 버튼을 눌러보면 이런 코드가 뜹니다.
38 // 상
40 // 하
37 // 좌
39 // 우
이렇게 코드를 통해 어떤 키가 눌러졌는지 조작이 자능해 집니다.
조작을 위해 이렇게 스위치 문을 작성하게 되면 조작은 가능하겠지만 가독성에 불편함이 생깁니다.
이 숫자들이 말하는 의미를 알기 어렵거나 잊어버릴 수 있기 때문입니다.
switch (e.getKeyCode()) {
case 37:
break;
case 38:
break;
case 39:
break;
case 40:
break;
}
이런게 이미 만들어 져 있습니다.
case KeyEvent.VK_LEFT

이를 눌러보면 0X25 라고 정의되어 있는데 이는 16진수 이고, 이를 변환시켜 보면 37 이라는 동일한 숫자가 나옵니다. 이렇게 변경하여 작성하겠습니다.
private void initListener() {
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
System.out.println(e.getKeyCode());
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
player.left();
break;
case KeyEvent.VK_RIGHT:
player.right();
break;
case KeyEvent.VK_UP:
player.up();
break;
}
}
});
}
키가 눌릴 때 마다 player 의 right, left 메서드를 사용해 행위를 설정해 줄 수 있게 되었습니다.
Player 클래스로 가서 코드를 작성해 줍니다.
@Override
public void left() {
x = x-10;
setLocation(x, y);
}
@Override
public void right() {
x = x+10;
setLocation(x, y);
}
그리고 실행 시켜보면 이렇게 움직입니다.(귀엽고 문워크를 하고 있습니다)

setIcon 을 사용하여 이동 방향에 따른 이미지를 지정해 줍니다.
@Override
public void left() {
setIcon(playerL);
x = x-10;
setLocation(x, y);
}
@Override
public void right() {
setIcon(playerR);
x = x+10;
setLocation(x, y);
}

오늘은 여기까지 👍
Share article