swing
(JAVA)Swing (Thread 활용)
mynote6676
2025. 5. 1. 09:27
참고 : 이 코드의 캐릭터 충돌사애 마리오 캐릭터는 사라진다.
다만 마리오 캐릭터를 움직이지 않을 시에는 캐릭터가 삭제 되지 않으며 사용자 중심의 충돌 감지이다,
package game;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class GameFrame extends JFrame implements KeyListener {
private BufferedImage backgroundImage;
private BufferedImage player1;
private BufferedImage player2;
private ImagePanel imagePanel;
private int playerX = 200;
private int playerY = 300;
private int player2X = 300;
private int player2Y = 400;
private boolean flag = true;
public GameFrame() {
initData();
setInitLayout();
addEventListener();
// 메인 작업자가 서브 작업자를 생성한다.
Thread thread1 = new Thread(imagePanel);
thread1.start();
// imagePanel 안에 구현한 run() {} 메서드가 시작 된다.
}
private void initData() {
setSize(1000, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
backgroundImage = ImageIO.read(new File("images/background5.png"));
player1 = ImageIO.read(new File("r4.png"));
player2 = ImageIO.read(new File("player2.png"));
} catch (IOException e) {
e.printStackTrace();
}
imagePanel = new ImagePanel();
}
private void setInitLayout() {
add(imagePanel);
setVisible(true);
}
private void addEventListener() {
// JFrame 자체에 키 이벤트 리스너를 등록한다.
addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
// System.out.println("keyCode : " + e.getKeyCode());
// TODO 화살표만 추출해 낼 예정..
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;
}
// 1. playerX == player2X && playerY == player2Y --> 동일 좌표에 있는 상태 판별
if(playerX == player2X && playerY == player2Y ) {
System.out.println("X 좌표선상에서 같은 위치를 가리킨다");
player1 = null;
}
// 그림을 다시 그려라
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
}
// 내부 클래스 생성
private class ImagePanel extends JPanel implements Runnable {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroundImage, 0, 0, 1000, 600, null);
g.drawImage(player1, playerX, playerY, 100, 100, null);
g.drawImage(player2, player2X, player2Y, 150, 150, null);
}
@Override
public void run() {
// direction -> true 라면 오른쪽 가고 있는 상태
// direction -> false 라면 왼쪽으로 가고 있는 상태
boolean direction = true;
// 서브 작업자가 해야하는 일을 명시하도록 약속 되어 있다.
while (flag) {
if(direction == true) {
player2X += 5;
} else {
player2X -= 5;
}
if(player2X >= 800) {
direction = false;
}
if(player2X <= 100) {
direction = true;
}
try {
Thread.sleep(1000);
// 그림을 다시 그려라
repaint();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("palyerX : " + playerX + " || palyer2X : " + player2X);
System.out.println("palyerY : " + playerY + " || palyer2Y : " + player2Y);
System.out.println("-------------------------------------------------");
}
}
} // end of inner class
}
package game;
public class GameFrameMainTest {
public static void main(String[] args) {
new GameFrame();
}//end of main
}
다른 코드
위 코드와의 차이점
적 중심의 충돌 코드이고 움직이지 않아도 코드가 겹칠 시 캐릭터가 삭제된다.
다만 처리속도가 드릴 수 있다.
위 코드에서는 사용자 움직임 감지시 if문의로 사용했다면 밑식은
swit
package test;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class GameFrame extends JFrame implements KeyListener {
BufferedImage backgroudImage;
BufferedImage player1;
BufferedImage player2;
ImagePanel1 imagePanel;
private int playerX = 200;
private int playerY = 300;
private int player2X = 300;
private int player2Y = 400;
private boolean flag = true;
public GameFrame() {
initData();
setInitLayout();
addEeventLisener();
// 메인 작업자가 서브 작업자를 생성한다.
Thread thread1 = new Thread(imagePanel);
thread1.start();
//imagePanel안에 구현한 run(){}tlwkrehlsek.
}
private void initData() {
setSize(1000, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
backgroudImage = ImageIO.read(new File("images/background5.png"));
player1 = ImageIO.read(new File("images/r4.png"));
player2 = ImageIO.read(new File("images/player2.png"));
} catch (IOException e) {
e.printStackTrace();
}
imagePanel = new ImagePanel1();
}
private void setInitLayout() {
add(imagePanel);
setVisible(true);
}
private void addEeventLisener() {
// keyListener<--인터페이승야
//자바 문법 인터페스, 추상클래스를 구현 클래스(즉 객체로 사용하는 문번을 제공)
// new keyListener
addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_UP:
playerY -= 10;
break;
case KeyEvent.VK_DOWN:
playerY += 10;
break;
case KeyEvent.VK_LEFT:
playerX -= 10;
break;
case KeyEvent.VK_RIGHT:
playerX += 10;
break;
}
// 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;
// }
//그림을 다시 그려라
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("keyCode : " + e.getKeyCode());
}
//내부 클래스 생성
private class ImagePanel1 extends JPanel implements Runnable {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(backgroudImage, 0, 0, 1000, 600, null);
g.drawImage(player1, playerX, playerY, 100, 100, null);
g.drawImage(player2, player2X, player2Y, 150, 150, null);
}
@Override
public void run() {
//direction ->true라면 오른쪽 가는 상태
//direction ->false라면 왼쪽 가는 상태
boolean direction = true;
//서브 작업자가 해야하는 일을 명시하도록 약속되어있다.
while (flag) {
if (direction == true) {
player2X += 5;
} else {
player2X -= 5;
}
if (player2X >= 800) {
direction = false;
}
if (player2X <= 100) {
direction = true;
}
if (playerX == player2X && playerY == player2Y) {
System.out.println("X 좌표선상에서 같은 위치를 가리킨다");
player1 = null;
}try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("palyer x : " + playerX + " || palyer x: " + player2X);
System.out.println("palyer y : " + playerY + " || palyer y : " + player2Y);
System.out.println("----------------------------------------------");
repaint();
}
}
}// end of inner class
}
package test;
import test.GameFrame;
public class GameFrameMainTest {
public static void main(String[] args) {
new GameFrame();
}//end of main
}
728x90