플레이어 수정 코드
package bubble.text03;
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 < 65; 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 < 65; 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.text02;
import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class BubbleFrame extends JFrame {
private JLabel backgroudMap;
private Player player;
public BubbleFrame() {
initData();
setInitLayout();
addEventListeren();
}
private void initData() {
setTitle("버블버블게임");
setSize(1000, 640);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
backgroudMap = new JLabel(new ImageIcon("img/backgroundMap.png"));
//루트 패널에 JLable 을 넣어 보기
setContentPane(backgroudMap);
player = new Player();
}
private void setInitLayout() {
setLayout(null); // 좌표기준(absolut)(절대 레이아웃)
setResizable(false);//리사이즈 조절 막기
setLocationRelativeTo(null);// JFrame 을 화면 가운데 배치
add(player);
setVisible(true);
}
private void addEventListeren() {
//프레임에 키보드 이벤트 리스너 등록 처리
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());
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();
}
}
728x90
'swing' 카테고리의 다른 글
(JAVA) 물방울생성 (0) | 2025.05.02 |
---|---|
(JAVA)bubble - 3 (왼쪽, 오른쪽 벽 감지하기) (0) | 2025.05.01 |
(JAVA)Bubble Game -1 (기본화면 완성) (0) | 2025.05.01 |
(JAVA)Swing (Thread 활용) (1) | 2025.05.01 |
(java)로또 게임 만들어 보기 - 10 (0) | 2025.04.30 |