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
반응형
'즐거운프로그래밍' 카테고리의 다른 글
[자바] ServerSocket 클래스(포트 연결로 데이터 주고 받기) (0) | 2023.10.24 |
---|---|
[자바] 직렬화(Serialization) (0) | 2023.10.24 |
[자바] 간단한 슈팅게임 만들기 예제 1 (0) | 2023.10.24 |
[자바] 대화 상자 프로그램 포팅 : Java JWT 기반(복리 이자 계산기 만들기 2) (0) | 2023.10.24 |
[자바] 대화 상자 프로그램 포팅 : Java JWT 기반(복리 이자 계산기 만들기 1) (0) | 2023.10.24 |