Java/Java.Swing

Swing - 8 (쓰레드 활용)

H_u 2024. 5. 1. 17:01
728x90
반응형
SMALL

package ch08;

 

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 GameFrame extends JFrame {

 

BufferedImage BackgroundImage;

BufferedImage player1;

BufferedImage enemy1;

BufferedImage die1;

ImagePaner imagePaner;

 

int playerX = 150;

int playerY = 300;

 

int enemyX = 250;

int enemyY = 420;

boolean enemyMoving = true;

 

private final int MOVDE_DISTANCE = 10;

 

public GameFrame() {

initData();

setInitLayout();

addEventlistener();

}

 

// 클래스 안에 클래스 -> 중첩 클래스 -> 외부클래스, 내부클래스

private class ImagePaner extends JPanel implements Runnable {

 

// paintComponents -- x

// paintComponent -- o

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

g.drawImage(BackgroundImage, 0, 0, 600, 600, null);

g.drawImage(player1, playerX, playerY, 50, 50, null);

g.drawImage(enemy1, enemyX, enemyY, 50, 50, null);

// Todo 플레이어, 적군 그림 그려야 함

// 쓰레드를 활용할 예정

 

}

 

@Override

public void run() {

// true : 왼쪽으로 가능 상황

// false : 오른쪽으로 가능 상황

boolean dirction = true;

 

while (true) {

// System.out.println("진행중");

if ((playerX <= enemyX + 30) && (playerY <= enemyY + 30)) {

if ((playerX >= enemyX - 50) && (playerY >= enemyY - 50)) {

player1 = die1;

if (player1 == die1) {

// playerY += 30;

for (playerY = enemyY; playerY <= 650; playerY++) {

try {

Thread.sleep(5);

} catch (InterruptedException e) {

e.printStackTrace();

}

repaint();

}

 

}

}

}

 

if (enemyMoving) {

if (dirction) {

enemyX -= 10;

} else {

enemyX += 10;

}

 

// 방향 바꾸는 개념은 적군 x 좌표값

if (enemyX <= 50) {

// false --> 오른쪽

dirction = false;

}

if (enemyX >= 500) {

// true --> 왼쪽

dirction = true;

}

 

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

repaint();

}

 

}

 

}

 

}

 

private void initData() {

setTitle("Thread 활용한 미니 예제");

setSize(600, 600);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

try {

// 예외가 발생할 수 있는 코드를 작성

BackgroundImage = ImageIO.read(new File("img/backgroundMap.png"));

player1 = ImageIO.read(new File("img/playerL.png"));

die1 = ImageIO.read(new File("img/playerLDie.png"));

enemy1 = ImageIO.read(new File("img/enemyL.png"));

} catch (IOException e) {

e.printStackTrace();

}

 

imagePaner = new ImagePaner();

// 다른작업자에게 일을 위임

Thread thread = new Thread(imagePaner);

thread.start();

 

}

 

private void setInitLayout() {

// 배치 관지라를 좌표기반

// setLayout(null);

// setResizable(false); // 프레임 크기 조절 불가 설정

setVisible(true); // 화면에 뜨게끔 설정

add(imagePaner);

 

}

 

private void addEventlistener() {

// 이벤트 리스너 등록방법 2가지 중

this.addKeyListener(new KeyListener() {

 

@Override

public void keyTyped(KeyEvent e) {

 

}

 

@Override

public void keyReleased(KeyEvent e) {

 

}

 

@Override

public void keyPressed(KeyEvent e) {

System.out.println("여기가 동작함");

int code = e.getKeyCode();

if (code == KeyEvent.VK_UP) {

playerY -= 10;

} else if (code == KeyEvent.VK_DOWN) {

playerY += 10;

} else if (code == KeyEvent.VK_RIGHT) {

playerX += 10;

} else if (code == KeyEvent.VK_LEFT) {

playerX -= 10;

} else if (code == KeyEvent.VK_SPACE) {

// 1. 스페이스를 눌렀을떄 적군을 멈출수 있도록 코드 수정

enemyMoving = !enemyMoving;

}

// 2. player 가 적군과 만났다면 player 그림을 없어지도록 하기

 

repaint();

} // end of keyPressed

});

 

}

 

}

적 캐릭터 움직이기, 맞으면 죽어서 아래로 내려가기 구현!!

728x90
반응형
SMALL