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();
}
}
'개발일지 > 자바' 카테고리의 다른 글
Thread란? (쓰레드 생성 및 활용법 1) (0) | 2022.09.19 |
---|---|
이미지 움직이기, 이동범위 제한(KeyAdapter, Jpanel 활용) - 2 (0) | 2022.09.17 |
마우스 리스너 (어댑터 활용) (0) | 2022.09.17 |
마우스 리스너 (MouseListener) - 2 (익명, 구현 클래스) (0) | 2022.09.17 |
마우스 리스너 (MouseListener) - 1 (0) | 2022.09.17 |
댓글