요약 할려니 너무 힘든데.. 이파트..
Player.Java
package bubble.test.ex04;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import lombok.Data;
// class player -> new 가능한 애들!! 게임에 존재할 수 있음. (추상메서드를 가질 수 없다.)
@Data
public class Player extends JLabel implements Moveable { // player 자체가 label이다
// 위치 상태
private int x;
private int y;
// 움직임 상태
private boolean left;
private boolean right;
private boolean up;
private boolean down;
private ImageIcon playerR, playerL;
public Player() {
initObject();
initSetting();
}
private void initObject() {
playerR = new ImageIcon("image/playerR.png"); // 이미지 ImageIcon에 사진 추가
playerL = new ImageIcon("image/playerL.png");
}
private void initSetting() { // 기본 시작 위치
x = 55;
y = 535;
// 최초 상태 -> 움직인다 (좌표가 이동한다)
// 키보드 오른쪽을 누른다 -> 오른쪽으로 간다
left = false;
right = false;
up = false;
down = false;
setIcon(playerR);
setSize(50, 50);
setLocation(x, y);
}
// 이벤트 핸들러
@Override
public void left() {
left = true;
new Thread(() -> { // Thread 생성
while (left) {
x = x - 1; // x축 1만큼 - 이동
setIcon(playerL); // 왼쪽으로 갈때는 왼쪽 이미지
setLocation(x, y);
try {
Thread.sleep(10);//0.01초
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start(); // Thread에는 Runable의 익명 클래스가 필요하다
}
@Override
public void right() {
right = true;
new Thread(() -> {
while (right) {
setIcon(playerR); // 왼쪽으로 갈때는 오른쪽 이미지
x = x + 1; // x축 1만큼 +이동
setLocation(x, y);
try {
Thread.sleep(10);//0.01초
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start(); // Thread에는 Runable의 익명 클래스가 필요하다
}
@Override
public void up() {
System.out.println("짬푸");
}
@Override
public void down() {
}
}
try ~ catch로 슬립 타입 만들어야 한다. 아니면 순간 이동 해버림..
BubbleFrame.java
package bubble.test.ex04;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import lombok.Data;
// class player -> new 가능한 애들!! 게임에 존재할 수 있음. (추상메서드를 가질 수 없다.)
@Data
public class Player extends JLabel implements Moveable { // player 자체가 label이다
// 위치 상태
private int x;
private int y;
// 움직임 상태
private boolean left;
private boolean right;
private boolean up;
private boolean down;
private ImageIcon playerR, playerL;
public Player() {
initObject();
initSetting();
}
private void initObject() {
playerR = new ImageIcon("image/playerR.png"); // 이미지 ImageIcon에 사진 추가
playerL = new ImageIcon("image/playerL.png");
}
private void initSetting() { // 기본 시작 위치
x = 55;
y = 535;
// 최초 상태 -> 움직인다 (좌표가 이동한다)
// 키보드 오른쪽을 누른다 -> 오른쪽으로 간다
left = false;
right = false;
up = false;
down = false;
setIcon(playerR);
setSize(50, 50);
setLocation(x, y);
}
// 이벤트 핸들러
@Override
public void left() {
left = true;
new Thread(() -> { // Thread 생성
while (left) {
x = x - 1; // x축 1만큼 - 이동
setIcon(playerL); // 왼쪽으로 갈때는 왼쪽 이미지
setLocation(x, y);
try {
Thread.sleep(10);//0.01초
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start(); // Thread에는 Runable의 익명 클래스가 필요하다
}
@Override
public void right() {
right = true;
new Thread(() -> {
while (right) {
setIcon(playerR); // 왼쪽으로 갈때는 오른쪽 이미지
x = x + 1; // x축 1만큼 +이동
setLocation(x, y);
try {
Thread.sleep(10);//0.01초
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start(); // Thread에는 Runable의 익명 클래스가 필요하다
}
@Override
public void up() {
System.out.println("짬푸");
}
@Override
public void down() {
}
}
player.isRight 함수가 필요하다..
만약 위에 함수가 없다면 어캐 되냐고?
얘가 튀어나온다.
암튼 넣자.. 동영상 편집 너무 힘들어유...
아무튼 keyPressed 리스너 밖에 설정이 안되어 있어 단방향으로는 부드럽게 이동이 잘되는데 지구 끝까지 갈꺼 같다.
그리하여 필요한 리스너
// 키보드 해제 이벤트 핸들러
@Override
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:
player.setLeft(false);
break;
case KeyEvent.VK_RIGHT:
player.setRight(false);
break;
}
}
키보드 해제 이벤트 리스너 만들어 준다.
실행 시켜 보자!!!
아무튼 이것으로 Thread 처리하여 키보드 리스너 만들기 성공
힘들다.. 수업 다들어야 하는데.. 동영상이랑 드립 넣는다고 시간 더 쓰는거 같다..
메타코딩신님께 오늘도 감사의 인사를 보낸다
'Java' 카테고리의 다른 글
bubble - 물방울 메모리에서 소멸시키고 화면 다시 그리기 (0) | 2022.10.10 |
---|---|
전체 스레드 동작 원리 짚어보기 (0) | 2022.10.07 |
버블버블 etc - 이벤트 리스너 원리 (0) | 2022.10.06 |
자바 버블버블5 - 캐릭터 좌우이동 (0) | 2022.10.06 |
버블버블 - 4 게임맵 캐릭터 추가 (0) | 2022.10.04 |