시나리오 코드 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();
}
}
화면 넓이를 배경에 맞게 맞추고 공격 까지 에니메이션 으로 구현했다.
'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 |