YeaLow
article thumbnail
Published 2022. 10. 6. 18:50
버블이(?)가 달라졌어요 Java

싸닉님이 날 보고 계셔

요약 할려니 너무 힘든데.. 이파트..

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() {

	}

}

new Thread 생성

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 함수가 필요하다.. 

선생님은 Getter Setter 만들었지만 귀찮아서 @Data 통일..

만약 위에 함수가 없다면 어캐 되냐고?

싸닉...?

얘가 튀어나온다.

 

암튼 넣자.. 동영상 편집 너무 힘들어유...

 


아무튼 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 처리하여 키보드 리스너 만들기 성공

 

힘들다.. 수업 다들어야 하는데.. 동영상이랑 드립 넣는다고 시간 더 쓰는거 같다..

 

메타코딩신님께 오늘도 감사의 인사를 보낸다

profile

YeaLow

@YeaLow

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!