[STS] 버블버블 - 캐릭터 이동

HootJem's avatar
Oct 24, 2024
[STS] 버블버블 - 캐릭터 이동
 
인터페이스 만들기
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라는 세 가지 추상 메서드를 가지고 있습니다. 이 인터페이스를 구현하는 클래스는 이 세 가지 메서드를 모두 구현해야 합니다.
notion image
익명 클래스로 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() { }); }
notion image
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
notion image
이를 눌러보면 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); }
그리고 실행 시켜보면 이렇게 움직입니다.(귀엽고 문워크를 하고 있습니다)
notion image
 
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); }
notion image
오늘은 여기까지 👍
 
 
 
Share article

[HootJem] 개발 기록 블로그