Java/Java.Swing

Swing - 6 (Key Listener)

H_u 2024. 4. 30. 17:14
728x90
반응형
SMALL

시나리오 코드 1

package ch06;

import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JTextArea;

/**
 * 키 이벤트 리스너 사용해보기
 */

 

public class MyKeyEvent extends JFrame implements KeyListener {

 

private JTextArea textArea;

 

public MyKeyEvent() {

initData();

setInitLayout();

addEventListener();

}

 

private void initData() {

setSize(500, 500);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setResizable(false); // 프레임 사이즈 조절 불가

 

textArea = new JTextArea();

}

 

private void setInitLayout() {

// 좌표 기준으로 셋팅 하고 싶다면 null

setLayout(new BorderLayout());

add(textArea);

setVisible(true);

 

}

 

private void addEventListener() {

// textArea 위에서 사용자가 키보드를 누르면 감지해서

// 알려준다

textArea.addKeyListener(this);

}

 

 

 

@Override

public void keyTyped(KeyEvent e) {

// 응답 받고 싶다면1

System.out.println(e.toString());

 

}

 

@Override

public void keyPressed(KeyEvent e) {

// 응답 받고 싶다면2 (눌렀을때)

// System.out.println("keyPressed : " + e.getKeyCode());

}

 

@Override

public void keyReleased(KeyEvent e) {

// 응답 받고 싶다면3 (뗏을때)

// 문제 1

// 제어문을 활용해서 방향키 위 아래 왼쪽 오른쪽을 눌렀다 떼면

// 콘솔창에 한글로 위 아래 왼쪽 오른쪽 글자를 표기 하시오

if(e.getKeyCode() == 38) {

System.out.println("위");

}

if(e.getKeyCode() == 39) {

System.out.println("오른쪽");

}

if(e.getKeyCode() == 40) {

System.out.println("아래");

}

if(e.getKeyCode() == 37) {

System.out.println("왼쪽");

}

}

}

 

 

 

 

시나리오 코드 2

package ch06;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

 

public class MiniGame1 extends JFrame {

 

private JLabel jPlayer;

// 변수는 변하는 수 이기도 하다.

private int jPlayerX = 100;

private int jPlayerY = 100;

private final int MOVE_DISTANCE = 50;

private final int FRAME_WIDTH = 500;

private final int FRAME_HEIGHT = 500;

private final String PLAYER_NAME = "야스오";

private final int PLAYER_WIDTH = 100;

private final int PLAYER_HEIGHT = 100;

 

public MiniGame1() {

initData();

setINitLayout();

addEventListener();

}

 

private void initData() {

setSize(FRAME_WIDTH, FRAME_HEIGHT);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

jPlayer = new JLabel(PLAYER_NAME);

jPlayer.setSize(PLAYER_WIDTH, PLAYER_HEIGHT);

 

}

 

private void setINitLayout() {

// 좌표 기반으로 배치 관리자 변경

setLayout(null);

add(jPlayer);

jPlayer.setLocation(jPlayerX, jPlayerY);

setVisible(true);

}

 

private void addEventListener() {

// jPlayer 객체에게서만 keyListener 동작을 시키고자 한다면

// 익명 구현 클래스로 KeyListener 인터페이스를 재 정의 할 수 있다.

// jPlayer.addKeyListener(this);

 

this.addKeyListener(new KeyListener() {

 

@Override

public void keyTyped(KeyEvent e) {}

@Override

public void keyReleased(KeyEvent e) {}

@Override

public void keyPressed(KeyEvent e) {

if(e.getKeyCode() == KeyEvent.VK_UP) {

System.out.println("위");

// 변수는 변하는 수 이기도 하다.

//jPlayerY = jPlayerY - 10;

jPlayerY -= MOVE_DISTANCE;

 

} else if(e.getKeyCode() == KeyEvent.VK_LEFT) {

System.out.println("왼쪽");

jPlayerX -= MOVE_DISTANCE;

}

else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {

System.out.println("오른쪽");

jPlayerX += MOVE_DISTANCE;

}

else if(e.getKeyCode() == KeyEvent.VK_DOWN) {

System.out.println("아래");

jPlayerY += MOVE_DISTANCE;

}

jPlayer.setLocation(jPlayerX, jPlayerY);

}

});

 

}

 

// 코드테스트

public static void main(String[] args) {

 

new MiniGame1();

 

}

 

}

 

연습문제 2

package ch06;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

 

public class MiniGame2 extends JFrame {

 

private JLabel jPlayer;

private JLabel backgroundImage;

private final int MOVE_DISTANCE = 50;

private final int FRAME_WIDTH = 500;

private final int FRAME_HEIGHT = 500;

private final int PLAYER_WIDTH = 100;

private final int PLAYER_HEIGHT = 100;

private int jPlayerX = 100;

private int jPlayerY = 100;

 

 

public MiniGame2() {

initData();

setINitLayout();

addEventListener();

}

 

private void initData() {

setSize(FRAME_WIDTH, FRAME_HEIGHT);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

jPlayer = new JLabel();

jPlayer.setSize(PLAYER_WIDTH, PLAYER_HEIGHT);

 

ImageIcon backgroundIcon = new ImageIcon("images/backgroundMap.png");

backgroundImage = new JLabel(backgroundIcon);

backgroundImage.setSize(FRAME_WIDTH, FRAME_HEIGHT);

add(backgroundImage);

 

ImageIcon playerIcon = new ImageIcon("images/playerR.png");

jPlayer = new JLabel(playerIcon);

jPlayer.setSize(PLAYER_WIDTH, PLAYER_HEIGHT);

jPlayer.setLocation(jPlayerX, jPlayerY);

backgroundImage.add(jPlayer);

}

 

private void setINitLayout() {

// 좌표 기반으로 배치 관리자 변경

setLayout(null);

setVisible(true);

 

 

 

 

}

 

private void addEventListener() {

// jPlayer 객체에게서만 keyListener 동작을 시키고자 한다면

// 익명 구현 클래스로 KeyListener 인터페이스를 재 정의 할 수 있다.

// jPlayer.addKeyListener(this);

 

this.addKeyListener(new KeyListener() {

 

@Override

public void keyTyped(KeyEvent e) {}

@Override

public void keyReleased(KeyEvent e) {}

@Override

public void keyPressed(KeyEvent e) {

if(e.getKeyCode() == KeyEvent.VK_UP) {

System.out.println("위");

// 변수는 변하는 수 이기도 하다.

//jPlayerY = jPlayerY - 10;

jPlayerY -= MOVE_DISTANCE;

 

} else if(e.getKeyCode() == KeyEvent.VK_LEFT) {

System.out.println("왼쪽");

jPlayerX -= MOVE_DISTANCE;

}

else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {

System.out.println("오른쪽");

jPlayerX += MOVE_DISTANCE;

}

else if(e.getKeyCode() == KeyEvent.VK_DOWN) {

System.out.println("아래");

jPlayerY += MOVE_DISTANCE;

}

jPlayer.setLocation(jPlayerX, jPlayerY);

}

}

)

;

 

}

 

// 코드테스트

public static void main(String[] args) {

 

new MiniGame2();

 

}

 

}

움직이는 것 까지 구현했다!!

연습문제 3

package ch06;

 

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.Timer;

 

public class MiniGame3 extends JFrame {

 

private static final int ATTACK_HEIGHT = 0;

private JLabel jPlayer;

private JLabel backgroundImage;

private JLabel attact;

private final int MOVE_DISTANCE = 50;

private final int FRAME_WIDTH = 1100;

private final int FRAME_HEIGHT = 800;

private final int PLAYER_WIDTH = 100;

private final int PLAYER_HEIGHT = 100;

private int jPlayerX = 100;

private int jPlayerY = 100;

private final String[] playerImages = { "images/playerR.png", "images/playerL.png",

 

// 추가 이미지 경로를 여기에 계속 추가합니다.

};

private int currentImageIndex = 0;

private JLabel attack;

 

public MiniGame3() {

initData();

setINitLayout();

addEventListener();

}

 

private void initData() {

setSize(FRAME_WIDTH, FRAME_HEIGHT);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

jPlayer = new JLabel();

jPlayer.setSize(PLAYER_WIDTH, PLAYER_HEIGHT);

 

ImageIcon backgroundIcon = new ImageIcon("images/backgroundMap.png");

backgroundImage = new JLabel(backgroundIcon);

backgroundImage.setSize(FRAME_WIDTH, FRAME_HEIGHT);

backgroundImage.setBounds(0, 0, FRAME_WIDTH, FRAME_HEIGHT); // 배경 이미지의 위치와 크기 설정

add(backgroundImage);

 

ImageIcon playerIcon = new ImageIcon(playerImages[currentImageIndex]);

jPlayer = new JLabel(playerIcon);

jPlayer.setSize(PLAYER_WIDTH, PLAYER_HEIGHT);

jPlayer.setLocation(jPlayerX, jPlayerY);

backgroundImage.add(jPlayer);

 

ImageIcon bubble = new ImageIcon("images/bubble.pug");

attack = new JLabel(bubble);

attack.setSize(50, 50); // 공격 이미지의 크기 설정

attack.setVisible(false); // 초기에는 보이지 않도록 설정

backgroundImage.add(attack); // 배경 이미지에 attack 추가

}

 

private void setINitLayout() {

// 좌표 기반으로 배치 관리자 변경

setLayout(null);

setVisible(true);

}

 

private void addEventListener() {

this.addKeyListener(new KeyListener() {

 

@Override

public void keyTyped(KeyEvent e) {

}

 

@Override

public void keyReleased(KeyEvent e) {

 

}

 

@Override

public void keyPressed(KeyEvent e) {

switch (e.getKeyCode()) {

case KeyEvent.VK_UP:

jPlayerY -= MOVE_DISTANCE;

jPlayer.setLocation(jPlayerX, jPlayerY);

break;

case KeyEvent.VK_LEFT:

jPlayerX -= MOVE_DISTANCE;

jPlayer.setIcon(new ImageIcon("images/playerL.png"));

jPlayer.setLocation(jPlayerX, jPlayerY);

break;

case KeyEvent.VK_RIGHT:

jPlayerX += MOVE_DISTANCE;

jPlayer.setIcon(new ImageIcon("images/playerR.png"));

jPlayer.setLocation(jPlayerX, jPlayerY);

break;

case KeyEvent.VK_DOWN:

jPlayerY += MOVE_DISTANCE;

jPlayer.setLocation(jPlayerX, jPlayerY);

break;

case KeyEvent.VK_SPACE:

attack.setIcon(new ImageIcon("images/bubble.png"));

attack();

break;

 

}

}

});

}

 

private void attack() {

int attackX = jPlayerX + jPlayer.getWidth();

int attackY = jPlayerY + (jPlayer.getHeight() / 2) - (ATTACK_HEIGHT / 2);

attack.setLocation(attackX, attackY);

attack.setVisible(true);

 

Timer timer = new Timer(20, new ActionListener() {

int distance = 0;

 

@Override

public void actionPerformed(ActionEvent e) {

distance += 10; // 이동 속도

attack.setLocation(attackX + distance, attackY);

if (distance >= 300) { // x축으로 300 이동 후에는 공격 숨김

attack.setVisible(false);

((Timer) e.getSource()).stop(); // 타이머 정지

}

}

});

timer.start();

}

 

// 코드테스트

public static void main(String[] args) {

new MiniGame3();

}

}

화면 넓이를 배경에 맞게 맞추고 공격 까지 에니메이션 으로 구현했다.

728x90
반응형
SMALL

'Java > Java.Swing' 카테고리의 다른 글

Swing - 8 (쓰레드 활용)  (1) 2024.05.01
Swing 로또 게임 만들기 - 7  (0) 2024.04.30
Swing - 5 (이벤트 리스너)  (0) 2024.04.29
Swing - 4 (이미지 겹치는 방법)  (0) 2024.04.29
Swing - 3 (이미지 올리기)  (0) 2024.04.29