Java

2024.05.01 swing -8 (쓰레드 활용)

정훈5 2024. 5. 1. 11:05
package ch08;

import java.awt.Graphics;
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 : 이미지를 올리는
	BufferedImage backgroundImage;
	BufferedImage player1;
	BufferedImage enemy1;
	ImagePanel imagePanel;

	public GameFrame() {
		initData();
		setInitData();
		addEventListener();
	}

	// 클래스 안에 클래스를 작성하는 방법 -> 중첩 클래스 -> 외부 클래스, 내부 클래스
	private class ImagePanel extends JPanel { // panel 그룹화 시킬수 있는 영역

		// paintComponents --> X
		// paintComponent ---> O
		@Override
		protected void paintComponent(Graphics g) {
			// TODO Auto-generated method stub
			super.paintComponent(g);
			g.drawImage(backgroundImage, 0, 0, 600, 600, null);
			// 시작 0,0 끝 600,600

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

			// 쓰레드를 활용할 예정

		}
	}

	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"));
			enemy1 = ImageIO.read(new File("img/enemyL.png"));

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		imagePanel = new ImagePanel();

	}

	private void setInitData() {
		// 배치 관리자를 좌표 기반
		// setLayout(null);
		// setResizable(false); // 프레임 크기 조절 불가 설정
		setVisible(true); // 화면 보이기

		add(imagePanel);
	}

	private void addEventListener() {

	}

}

 

package ch08;

public class GameTest {

	public static void main(String[] args) {
		new GameFrame();

	} // end of main

} // end of class

 

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 : 이미지를 올리는
	BufferedImage backgroundImage;
	BufferedImage player1;
	BufferedImage enemy1;
	ImagePanel imagePanel;

	public GameFrame() {
		initData();
		setInitData();
		addEventListener();
	}

	// 클래스 안에 클래스를 작성하는 방법 -> 중첩 클래스 -> 외부 클래스, 내부 클래스
	private class ImagePanel extends JPanel { // panel 그룹화 시킬수 있는 영역

		// paintComponents --> X
		// paintComponent ---> O
		@Override
		protected void paintComponent(Graphics g) {
			// TODO Auto-generated method stub
			super.paintComponent(g);
			g.drawImage(backgroundImage, 0, 0, 600, 600, null);
			// 시작 0,0 끝 600,600
			g.drawImage(player1, 150, 300, 50, 50, null);
			g.drawImage(enemy1, 250, 420, 50, 50, null);

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

			// 쓰레드를 활용할 예정

		}
	}

	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"));
			enemy1 = ImageIO.read(new File("img/enemyL.png"));

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		imagePanel = new ImagePanel();

	}

	private void setInitData() {
		// 배치 관리자를 좌표 기반
		// setLayout(null);
		// setResizable(false); // 프레임 크기 조절 불가 설정
		setVisible(true); // 화면 보이기

		add(imagePanel);
	}

	private void addEventListener() {
		// 이벤트 리스너 등록 방법 2가시 중
		// 익명 구현 클래스 사용 해본다.
		// this.addKeyListener(new K) 에서 익명 enter
		this.addKeyListener(new KeyListener() {

			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub

			}

			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub

			}

			@Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				System.out.println("여기가 동작 합니다.");
			}
		});

	}

}

 

package ch08;

public class GameTest {

	public static void main(String[] args) {
		new GameFrame();

	} // end of main

} // end of class

 

결과물


 

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 : 이미지를 올리는
	BufferedImage backgroundImage;
	BufferedImage player1;
	BufferedImage enemy1;
	ImagePanel imagePanel;
	
	int playerX = 150;
	int playerY = 180;
	
	int enemyX = 250;
	int enemyY = 420;

	public GameFrame() {
		initData();
		setInitData();
		addEventListener();
	}

	// 클래스 안에 클래스를 작성하는 방법 -> 중첩 클래스 -> 외부 클래스, 내부 클래스
	private class ImagePanel extends JPanel { // panel 그룹화 시킬수 있는 영역

		// paintComponents --> X
		// paintComponent ---> O
		@Override
		protected void paintComponent(Graphics g) {
			// TODO Auto-generated method stub
			super.paintComponent(g);
			g.drawImage(backgroundImage, 0, 0, 600, 600, null);
			// 시작 0,0 끝 600,600
			g.drawImage(player1, playerX, playerY, 50, 50, null);
			g.drawImage(enemy1, enemyX, enemyY, 50, 50, null);

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

			// 쓰레드를 활용할 예정

		}
	}

	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"));
			enemy1 = ImageIO.read(new File("img/enemyL.png"));

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		imagePanel = new ImagePanel();

	}

	private void setInitData() {
		// 배치 관리자를 좌표 기반
		// setLayout(null);
		// setResizable(false); // 프레임 크기 조절 불가 설정
		setVisible(true); // 화면 보이기

		add(imagePanel);
	}

	private void addEventListener() {
		// 이벤트 리스너 등록 방법 2가시 중
		// 익명 구현 클래스 사용 해본다.
		// this.addKeyListener(new K) 에서 익명 enter
		this.addKeyListener(new KeyListener() {

			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				System.out.println(e.toString());
			}

			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				System.out.println(e.getKeyCode());
			}

			@Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				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_LEFT) {
					playerX -=10;
				} else if (code == KeyEvent.VK_RIGHT) {
					playerX +=10;
				} else if (code == KeyEvent.VK_SPACE) {

				}
				
				repaint(); // 다시 그림을 그려준다.
			} // end of keyPressed
		});

	}

}

 

package ch08;

public class GameTest {

	public static void main(String[] args) {
		new GameFrame();

	} // end of main

} // end of class

동작가능

결과물


쓰레드를 활용함

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 : 이미지를 올리는
	BufferedImage backgroundImage;
	BufferedImage player1;
	BufferedImage enemy1;
	ImagePanel imagePanel;

	int playerX = 150;
	int playerY = 180;

	int enemyX = 250;
	int enemyY = 420;

	public GameFrame() {
		initData();
		setInitData();
		addEventListener();
	}

	// 클래스 안에 클래스를 작성하는 방법 -> 중첩 클래스 -> 외부 클래스, 내부 클래스
	private class ImagePanel extends JPanel implements Runnable { // panel 그룹화 시킬수 있는 영역

		// paintComponents --> X
		// paintComponent ---> O
		@Override
		protected void paintComponent(Graphics g) {
			// TODO Auto-generated method stub
			super.paintComponent(g);
			g.drawImage(backgroundImage, 0, 0, 600, 600, null);
			// 시작 0,0 끝 600,600
			g.drawImage(player1, playerX, playerY, 50, 50, null);
			g.drawImage(enemy1, enemyX, enemyY, 50, 50, null);

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

			// 쓰레드를 활용할 예정

		}

		@Override
		public void run() {

			// true : 왼쪽으로 가는 상황
			// false : 오른쪽으로 가는 상황
			boolean direction = true;
			while (true) {
				System.out.println("진행중");

				if (direction) {
					enemyX -= 10;
				} else {
					enemyX += 10;
				}

				// 방향 바꾸는 개념은 적군 X 좌표값이
				if (enemyX <= 50) {
					// false 이면 오른쪽으로
					direction = false;
				}

				if (enemyX >= 500) {
					// true 이면 왼쪽으로
					direction = true;
				}

				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					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"));
			enemy1 = ImageIO.read(new File("img/enemyL.png"));

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		imagePanel = new ImagePanel();
		// 다른작업자에게 일을 위임 시킨다.
		Thread thread = new Thread(imagePanel);
		thread.start();

	}

	private void setInitData() {
		// 배치 관리자를 좌표 기반
		// setLayout(null);
		// setResizable(false); // 프레임 크기 조절 불가 설정
		setVisible(true); // 화면 보이기

		add(imagePanel);
	}

	private void addEventListener() {
		// 이벤트 리스너 등록 방법 2가시 중
		// 익명 구현 클래스 사용 해본다.
		// this.addKeyListener(new K) 에서 익명 enter
		this.addKeyListener(new KeyListener() {

			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				System.out.println(e.toString());
			}

			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				System.out.println(e.getKeyCode());
			}

			@Override
			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				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_LEFT) {
					playerX -= 10;
				} else if (code == KeyEvent.VK_RIGHT) {
					playerX += 10;
				} else if (code == KeyEvent.VK_SPACE) {
					// 1. 스페이스바를 눌렀을 때 적군을 멈출 수 있도록 코드 수정
				}
				
				// 2. player 가 적군과 만났다면 player 그림을 없애주세요. 

				repaint(); // 다시 그림을 그려준다.
			} // end of keyPressed
		});

	}

}

 

package ch08;

public class GameTest {

	public static void main(String[] args) {
		new GameFrame();

	} // end of main

} // end of class

 

결과물

 


 

 

1. 스페이스바를 눌렀을 때 적군을 멈출 수 있도록 코드 수정
2. player 가 적군과 만났다면 player 그림을 없애주세요.