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

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

ZI_CO 2022. 9. 17.

 

 

 

package blogpractice;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
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 KeyBordEventListener1 extends JFrame implements KeyListener{
	
	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 KeyBordEventListener1() {
		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(this); // keyListener인터페이스를 구현을 해줬기때문에 this 사용
	}

	@Override
	public void keyTyped(KeyEvent e) {}

	@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(); 																// 키보드 누를때마다 변경된 좌표값으로 새로 그려준다.
	}

	@Override
	public void keyReleased(KeyEvent e) {}
	
	// 그림을 그려주는 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) ;
		}
	}
	
	public static void main(String[] args) {
		new KeyBordEventListener1();
	}
}

 

댓글