즐거운프로그래밍

[자바] 간단한 슈팅게임 만들기 예제 2

수수께끼 고양이 2023. 10. 24. 17:02
728x90
반응형

 

이전 글에서 이어집니다

2023.10.24 - [즐거운프로그래밍] - [자바] 간단한 슈팅게임 만들기 예제 2

 

 

참고 링크

GitHub - yongjun-hong/Java_Shooting_Game: Java를 이용한 간단한 Shooting game

 

GitHub - yongjun-hong/Java_Shooting_Game: Java를 이용한 간단한 Shooting game

Java를 이용한 간단한 Shooting game. Contribute to yongjun-hong/Java_Shooting_Game development by creating an account on GitHub.

github.com

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.security.Key;
import java.util.Random;
//import java.util.concurrent.CopyOnWriteArrayList;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            ShootingGame game = new ShootingGame();
            game.setVisible(true);
        });
    }
}
class ShootingGame extends JFrame {
    public ShootingGame() {

        this.add(new Screen()); // must be here!

        this.setTitle("Shooting Game");
        this.setResizable(false);
        this.pack();
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 닫기 버튼 누르면 닫히는 명령어
    }
}
class Screen extends JPanel implements ActionListener {
    private Image gameScreenImg;
    private Player player;
    private Timer tAddEnemy; //javax.swing.Timer
    private final int DELAY_ADD=250;
    private Timer tMoveEnemy;
    private final int DELAY_MOVE=30;
    private int screenWidth;
    private int screenHeight;


    public Screen() {
        gameScreenImg = new ImageIcon("images/game_Screen.jpg").getImage();
        screenWidth = gameScreenImg.getWidth(null);
        screenHeight = gameScreenImg.getHeight(null);
        this.setPreferredSize(new Dimension(screenWidth, screenHeight));
        this.setFocusable(true);

        player = new Player(screenWidth, screenHeight); // w,h
        tAddEnemy = new Timer(DELAY_ADD,this);
        tAddEnemy.start();
        tMoveEnemy=new Timer(DELAY_MOVE,this);
        tMoveEnemy.start();

        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    System.exit(0);
                }
                player.update(e);
                repaint(
                        player.getX() - 15,
                        player.getY() - 15,
                        player.getW() + 30,
                        player.getH() + 30);
            }
        });
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(gameScreenImg,0,0,null);

        player.draw(g);
        for(Enemy enemy: Enemy.enemies) {
            enemy.draw(g);
        }

        Toolkit.getDefaultToolkit().sync();
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==tAddEnemy) {
            Enemy enemy = new Enemy(screenWidth,screenHeight);
            Enemy.enemies.add(enemy);
            System.out.println(Enemy.enemies);
        }
        else if(e.getSource()==tMoveEnemy) {
            for(Enemy enemy:Enemy.enemies) {
                enemy.update();
                repaint(
                        enemy.getX()-5,
                        enemy.getY()-5,
                        enemy.getW()+30,
                        enemy.getH()+10);
            }
            if(bCollision()) {
                System.exit(0);
            }
        }
    }
    boolean bCollision() {
        for(Enemy enemy:Enemy.enemies) {
            if(enemy.getX()>player.getX()
                && enemy.getX()<player.getX()+player.getW()
                && enemy.getY()<player.getY()
                && enemy.getY()>player.getY()-player.getH())
                    return true;
        }
        return false;
    }
}

class Character {
    private Image characterImg;
    protected int x, y;
    protected int w, h;
    protected int screenWidth, screenHeight;

    public Character(String imgPath, int screenWidth, int screenHeight) {
        characterImg = new ImageIcon(imgPath).getImage();
        w=characterImg.getWidth(null);
        h=characterImg.getHeight(null);
        this.screenWidth=screenWidth;
        this.screenHeight=screenHeight;
    }
    public int getX() {return x;}
    public int getY() {return y;}
    public int getW() {return w;}
    public int getH() {return h;}
    void draw(Graphics g) {
        g.drawImage(characterImg, x, y, null);
    }
}
class Player extends Character {
//    private Image playerImg;
//    private int x, y;
//    private int w, h;
//    private int screenWidth, screenHeight;

    Player(int screenWidth, int screenHeight) {
        super("images/player.png", screenWidth, screenHeight);
            x = 0;
            y = 0;

//        playerImg = new ImageIcon("images/player.png").getImage();
//        x = 0;
//        y = 0;
//        w = playerImg.getWidth(null);
//        h = playerImg.getHeight(null);
//        this.screenWidth=screenWidth;
//        this.screenHeight=screenHeight;
    }

//    void draw(Graphics g) {
//        g.drawImage(playerImg, x, y, null);
//    }

    void update(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            x -= 15;
            if (x < 0) {
                x = 0;
            }
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            x += 15;
            if (x + w > screenWidth) {
                x = screenWidth - w;
            }
        }
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            y -= 15;
            if (y < 0) {
                y = 0;
            }
        }
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            y += 15;
            if (y + h > screenHeight) {
                y = screenHeight - h;
            }
        }
    }
//    int getX() {return x;}
//    int getY() {return y;}
//    int getW() {return w;}
//    int getH() {return h;}
}

class Enemy extends Character {
//    static CopyOnWriteArrayList<Enemy> enemies = new CopyOnWriteArrayList<>();
    static ArrayList<Enemy> enemies = new ArrayList<>();
    static Random rand = new Random();

//    private Image enemyImg;
//    private int x,y;
//    private int w,h;
//    private int screenWidth, screenHeight;
    private int speed;
    Enemy(int screenWidth, int screenHeight) {
        super("images/enemy_attack (3).png", screenWidth, screenHeight);

//        enemyImg = new ImageIcon("images/enemy_attack (3).png").getImage();;
//        w=enemyImg.getWidth(null);
//        h=enemyImg.getHeight(null);
        x=screenWidth-50;
        y=rand.nextInt(screenHeight-h);
//        this.screenWidth=screenWidth;
//        this.screenHeight=screenHeight;

        speed=rand.nextInt(15)+5;
    }
//    void draw(Graphics g) {
//        g.drawImage(enemyImg,x,y,null);
//    }
//    int getX() {return x;}
//    int getY() {return y;}
//    int getW() {return w;}
//    int getH() {return h;}

    void update() {
        x-=speed;
        if(x<0-w) {
//            enemies.remove(this);
            System.out.println(enemies.size());
        }
    }
}

 

방향키로 움직이며 공격을 피하는 게임입니다

 

 

728x90
반응형