인터페이스 만들기
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