Christmas Pikachu 이미지 움직이기, 이동범위 제한(KeyAdapter, Jpanel 활용) - 2
개발일지/자바

이미지 움직이기, 이동범위 제한(KeyAdapter, Jpanel 활용) - 2

ZI_CO 2022. 9. 17.

package blogpractice;

import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class KeyEventListener2 extends JFrame  {
	
	boolean flag = true;
	
	final int FRAME_WIDTH = 500; // 프레임 가로 사이즈	
	final int FRAME_HEIGHT = 500; // 프레임 세로 사이즈
	int playerX = 200; // 이미지 가로 사이즈 (케릭터 이미지의 좌표)
	int playerY = 200; // 이미지 세로 사이즈 (케릭터 이미지의 좌표)
	
	MyDrawPanel drawPanel; // 그림을 그려주는 내부 클래스
	
	BufferedImage background; // 배경 이미지를 잠시 담아놓는 공간으로 활용
	BufferedImage background1; // 밤하늘 이미지
	BufferedImage background2; // 바다 이미지
	
	BufferedImage player; // 케릭터 이미지를 잠시 담아 놓는 공간으로 활용
	BufferedImage playerRight; // 케릭터 왼쪽 이미지
	BufferedImage playerLeft; // 케릭터 오른쪽 이미지
	
	
	public KeyEventListener2() {
		initData();
		setInitLayout();
		addEventListener();
	}
	
	private void initData() {
		setTitle("이미지 움직이기");
		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// ImageIO를 사용하게되면 try / catch를 꼭 해주어야 한다.
		try {
			background1 = ImageIO.read(new File(("images/background.jpg"))); // 밤하늘 이미지의 이미지를 읽어옴
			background2 = ImageIO.read(new File(("images/background_1.jpg"))); // 바다 이미지의 이미지를 읽어옴
			playerRight = ImageIO.read(new File(("images/player2_1.png"))); // 오른쪽 케릭터의 이미지를 읽어옴
			playerLeft = ImageIO.read(new File(("images/player2.png"))); // 왼쪽 케릭터의 이미지를 읽어옴
		} catch (IOException e) {
			System.out.println("에러발생 경로, 파일명 에러");
			e.printStackTrace();
			
		}
		
		drawPanel = new MyDrawPanel(); // 읽어온 이미지를 내부클래스안에 이미지를 그려놓는 기능을 활용해 그려준다.
		player = playerLeft; // 초기  케릭터의 이미지를 왼쪽을 보는 이미지를 임시 공간에 담아둔다.
		background = background1; //  초기 배경화면의 이미지는 밤하늘 이미지 임시 공간에 담아둔다..
		
	}
	
	private void setInitLayout() {
		setVisible(true); 
		this.add(drawPanel); // 내부클래스에 이미지를 그리는 기능을 추가해준다. 
	}
	
	private void addEventListener() {
		this.addKeyListener(new KeyAd()); // keyListener인터페이스를 구현을 해줬기때문에 this 사용
	}

	
	// 그림을 그려주는 Jpanel 내부클래스
	private class MyDrawPanel extends JPanel {
		
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawImage(background, 0, 0, FRAME_WIDTH, FRAME_HEIGHT, null) ; // 불러온 이미지를 그려준다. (x좌표, y좌표, 가로사이즈, 세로사이즈, null)
			g.drawImage(player, playerX, playerY, 100, 100, null) ;
		}
	}
	
	private class KeyAd extends KeyAdapter{
		@Override
		public void keyPressed(KeyEvent e) {
			int keyCode = e.getKeyCode(); 									// getKeyCode : 키보드를 누르게되면 각각의 키의 코드값
			if(keyCode == KeyEvent.VK_LEFT) { 							// 키보드를 눌렀을시 키의코드값이 왼쪽키이면
				player = playerLeft;                        							// 왼쪽이미지를 호출한다.
				playerX = (playerX > 0) ? playerX - 10 :  -20; 			// 현재 케릭터의 좌표 100, 100 -> 왼쪽키를 눌렀을때 케릭터 이미지의 x의 좌표값이 0 보다 크면 케릭터의 이미지  x좌표값을 10을 뺀다.
																					  			// 그렇지 않고 0보다 작으면 좌표값을 -20으로 준다.(원래는 값을 0을 줘야함 맨왼쪽 좌표값은 0이기때문) 
				
			}else if(keyCode == KeyEvent.VK_RIGHT) {				 // 키보드를 눌렀을시 키의코드값이 오른쪽키이면
				player = playerRight;  												// 오른쪽이미지를 호출한다.
				playerX = (playerX < 400) ? playerX + 10 : 400;		 // 현재 케릭터의 좌표 100, 100 -> 오른쪽키를 눌렀을때 케릭터 이미지의 x의 좌표값이 400 보다 작으면 케릭터의 이미지 x좌표값을 10을 더함.
																								// 그렇지 않고 400보다 크면 좌표값을 400으로 준다. 
				
			}else if(keyCode == KeyEvent.VK_UP) {						// 키보드를 눌렀을시 키의코드값이 위쪽키이면
				playerY = (playerY > 0) ? playerY - 10 :  -20; 			// 현재 케릭터의 좌표 100, 100 -> 오른쪽키를 눌렀을때 케릭터 이미지의 y의 좌표값이 0 보다 크면 케릭터의 이미지 좌표값을 10을 뺀다.
																								// 그렇지 않고 0보다 작으면 좌표값을 -20으로 준다. 	
				
			}else if(keyCode == KeyEvent.VK_DOWN) {				// 키보드를 눌렀을시 키의코드값이 위쪽키이면
				playerY = (playerY < 400) ? playerY + 10 : 400;		// 현재 케릭터의 좌표 100, 100 -> 오른쪽키를 눌렀을때 케릭터 이미지의 y의 좌표값이 400 보다 작으면 케릭터의 이미지 x좌표값을 10을 더함.
																								// 그렇지 않고 400보다 크면 좌표값을 400으로 준다. 
				
			}else if(keyCode == KeyEvent.VK_SPACE) { 			   // 키보드를 눌렀을시 키의코드값이 위쪽키이면
				flag = !flag; 															   // flag = true 초기화 상태 (토글키)
				if(flag == false) {                                                  // falg가 false이면 
					background = background1;	                             // 밤하늘 이미지 그려줌
				}else {
					background = background2;                          	 // ture 이면 하늘이미지 그려줌
				}
			}
			repaint(); 																// 키보드 누를때마다 변경된 좌표값으로 새로 그려준다.
		}
	}
	
	public static void main(String[] args) {
		new KeyEventListener2();
	}
}

댓글