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