- 플레이어 코드
package bubble.test02;
import javax.swing.*;
public class Player extends JLabel implements Moveable {
private int x;
private int y;
// 멤버변수
private ImageIcon playerR;
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();
}
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);
}
@Override
public void left() {
left = true;
setIcon(playerL);
new Thread(new Runnable() {
@Override
public void run() {
while (left) {
x = x - SPEED;
setLocation(x, y);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} // end of while
} // end of run()
}).start();
}
@Override
public void right() {
right = true; // 움직인 상태 값 변경
setIcon(playerR);
// 익명 클래스 - thread.start() --> run() 메서드 안에서 구문 동작
new Thread(new Runnable() {
@Override
public void run() {
while (right) {
x = x + SPEED;
setLocation(x, y);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}).start();
}
@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 = y - JUMP_SPEED;
setLocation(x, y);
try {
Thread.sleep(5);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} // end of for
up = false; // 상태값을 잘 다루어야 버그가 없다.
down();
}
}).start();
}
@Override
public void down() {
down = true;
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 130 / JUMP_SPEED; i++) {
y = y + JUMP_SPEED;
setLocation(x, y);
try {
Thread.sleep(3);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
} // end of for
down = false;
}
}).start();
}
}
- 버블 프레임 코드
package bubble.test02;
import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class BubbleFrame extends JFrame {
private JLabel backgroundMap;
private Player player;
//생성자
public BubbleFrame() {
initData();
setInitLayout();
addEventListener();
}
private void initData() {
setTitle("버블버블게임");
setSize(1000, 640);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
backgroundMap = new JLabel(new ImageIcon("img/backgroundMap.png"));
// 루트 패널에 JLabel 넣어보기
setContentPane(backgroundMap);
player = new Player();
}
private void setInitLayout() {
setLayout(null); // 좌표기준(절대 레이아웃)
setResizable(false); // 리사이즈 조절 막기
setLocationRelativeTo(null); // JFrame 화면 가운데 배치해줌
add(player);
setVisible(true);
}
private void addEventListener() {
// 프레임에 키보드 이벤트 리스너 등록 처리
this.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
// 키를 누를때 .. 누르고 있으면 계속 이벤트 발생
@Override
public void keyPressed(KeyEvent e) {
System.out.println("code : " + 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;
}
}
//
@Override
public void keyReleased(KeyEvent e) {
System.out.println("code : " + e.getKeyCode());
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
// 왼쪽으로 가고 있다면 멈춰 (while 종료) -- 스레드 종료됨
player.setLeft(false);
break;
case KeyEvent.VK_RIGHT:
player.setRight(false);
break;
case KeyEvent.VK_UP:
break;
}
}
});
}
public static void main(String[] args) {
new BubbleFrame();
}
}
'JAVA' 카테고리의 다른 글
버블버블 게임 4단계 (물방울 생성하기) (0) | 2025.05.02 |
---|---|
버블버블 게임 3단계 (왼쪽, 오른쪽 벽 감지하기) (0) | 2025.05.01 |
버블버블 게임 1단계 (기본 화면 , 키 이벤트) (0) | 2025.05.01 |
swing - thread 활용 이미지 움직이기 (0) | 2025.04.30 |
로또 만들어보기 (0) | 2025.04.30 |