java实现简易飞机大战

整体思路

1.创建游戏窗体,添加面板JPanel,重写JPanel中的paint方法,遍历所有飞机和子弹绘制,用定时器进行重绘,实现动画效果
2.添加敌机和发射子弹用的是多线程
3.碰撞检测采用的是矩形类Rectangle中的intersects方法

代码实现

用手机查看代码好像只显示62行

英雄战机类

package com.cml.model;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import com.cml.util.ImageUtil;

public class Hero {
	private int x, y;// 坐标
	private int width, height;	//宽高
	private Image heroImage; // 图片
	private boolean isAlive = true;
	private ArrayList<Bullet> bullets = new ArrayList<>();
	public Hero() {
		this.x = 180;
		this.y = 600;
		this.heroImage = ImageUtil.hero;
		width = heroImage.getWidth(null);
		height = heroImage.getHeight(null);
		initBullets();
	}
	private void initBullets() {
		//用线程发射子弹
		new Thread() {
			@Override
			public void run() {
				while (isAlive) {
					bullets.add(new Bullet(Hero.this));
					try {
						sleep(200);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}.start();
	}

	public Hero(int x, int y, Image heroImage) {
		super();
		this.x = x;
		this.y = y;
		this.heroImage = heroImage;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public Image getHeroImage() {
		return heroImage;
	}

	public void setHeroImage(Image heroImage) {
		this.heroImage = heroImage;
	}

	//绘制英雄战机
	public void paint(Graphics g) {
		if (!isAlive) {
			heroImage = ImageUtil.hero_destory;
		}
		g.drawImage(heroImage, x, y, null);
		for (int i = 0; i < bullets.size(); i++) {
			Bullet bullet = bullets.get(i);
			if (bullet.getY() < 0) {
				bullets.remove(bullet);
			}
			bullet.paint(g);
		}
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	//鼠标拖拽移动
	public void mouseDragged(MouseEvent e) {
		if (isAlive) {
			int x0 = e.getX();
			int y0 = e.getY();
			if (isInScopePanel(x0, y0)) {
				if (isInScopeImageWidth(x0) && isInScopeImageheigth(y0)) {
					this.x = x0 - width / 2;
					this.y = y0 - height / 2;
				}
			} else {
				if (isInScopeImageWidth(x0)) {
					this.x = x0 - width / 2;
				}
				if (isInScopeImageheigth(y0)) {
					this.y = y0 - height / 2;
				}
			}

		}
		
	}

	private boolean isInScopePanel(int x0, int y0) {
		if (x0 > 10 && x0 < 460 && y0 > 140 && y0 < 730) {
			return true;
		}
		return false;
	}

	private boolean isInScopeImageheigth(int y0) {
		if (y0 >= y && y0 <= y + height) {
			if (y0 > 140 && y0 < 730) {
				return true;
			}
		}
		return false;
	}

	private boolean isInScopeImageWidth(int x0) {
		if (x0 >= x && x0<= x + width) {
			if (x0 > 10 && x0 < 460) {
				return true;
			}
		}
		return false;
	}
	public ArrayList<Bullet> getBullets() {
		return bullets;
	}
	public void setAlive(boolean isAlive) {
		this.isAlive = isAlive;
	}
	public boolean isAlive() {
		return isAlive;
	}
}

敌机类

package com.cml.model;

import java.awt.Graphics;
import java.awt.Image;
import java.util.Random;

import com.cml.util.ImageUtil;

public class Enemy {
	private Random random = new Random();

	private int x, y;// 坐标
	private int width, height; // 宽高
	private boolean isAlive = true;
	private static final int SPEED = 4;
	private Image enemyImage; // 图片

	public Enemy() {
		RandomEnemyXY();
		enemyImage = ImageUtil.enemy;
		width = enemyImage.getWidth(null);
		height = enemyImage.getHeight(null);
	}

	private void RandomEnemyXY() {
		x = random.nextInt(430);
		y = 0;
	}

	public void paint(Graphics g) {
		if (!isAlive) {
			enemyImage = ImageUtil.bomb;
		}
		g.drawImage(enemyImage, x, y, null);
		move();
	}

	public boolean isAlive() {
		return isAlive;
	}

	public void setAlive(boolean isAlive) {
		this.isAlive = isAlive;
	}

	private void move() {
		if (isAlive) {
			y += SPEED;
		}
		
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}
}

子弹类

package com.cml.model;

import java.awt.Graphics;
import java.awt.Image;

import com.cml.util.ImageUtil;

public class Bullet {
	private int x, y;// 坐标
	private int width, height; // 宽高
	private static final int SPEED = 10; // 速度
	private Image bulletImage; // 图片

	public Bullet(Hero hero) {
		bulletImage = ImageUtil.bullet;
		width = bulletImage.getWidth(null);
		height = bulletImage.getHeight(null);
		this.x = hero.getX() + hero.getWidth() / 2 - width / 2;
		this.y = hero.getY();
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}

	public void paint(Graphics g) {
		g.drawImage(bulletImage, x, y, null);
		move();
	}

	private void move() {
		y -= SPEED;
	}
}

图片工具类

package com.cml.util;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ImageUtil {
	public static BufferedImage hero;
	public static BufferedImage enemy;
	public static BufferedImage bullet;
	public static BufferedImage bg;
	public static BufferedImage bomb;
	public static BufferedImage hero_destory;
	public static BufferedImage login;
	
	static {
		try {
			hero = ImageIO.read(ImageUtil.class.getResource("/img/hero.png"));
			enemy = ImageIO.read(ImageUtil.class.getResource("/img/enemy.png"));
			bullet = ImageIO.read(ImageUtil.class.getResource("/img/bullet.png"));
			bg = ImageIO.read(ImageUtil.class.getResource("/img/bg.png"));
			bomb = ImageIO.read(ImageUtil.class.getResource("/img/bomb.png"));
			hero_destory = ImageIO.read(ImageUtil.class.getResource("/img/hero_destory.png"));
//			login = ImageIO.read(new File("img/login.png"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

游戏窗体类

package com.cml.frame;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import com.cml.model.Bullet;
import com.cml.model.Enemy;
import com.cml.model.Hero;
import com.cml.util.ImageUtil;
import com.sun.java.swing.plaf.windows.resources.windows;

public class GameFrame extends JFrame {

	private JPanel gamePanel;

	private Hero hero;
	private ArrayList<Enemy> enemies = new ArrayList<Enemy>();
	private ArrayList<Bullet> hero_bullet;
	private Timer timer;

	public GameFrame() {
		// 初始化游戏窗体
		initGameFrame();
		// 初始化英雄战机
		initHero();
		// 初始化游戏面板
		initGamePanel();
		// 初始化定时器
		initTimer();
		// 初始化敌军战机
		initEnemies();
	}

	private void initEnemies() {
		new Thread() {
			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					enemies.add(new Enemy());
				}

			}
		}.start();

	}

	private void initTimer() {
		timer = new Timer();
		TimerTask task = new TimerTask() {

			@Override
			public void run() {
				gamePanel.repaint();
			}
		};
		timer.scheduleAtFixedRate(task, 0, 20);
	}

	private void initHero() {
		hero = new Hero();
		hero_bullet = hero.getBullets();
	}

	private void initGameFrame() {
		setTitle("打飞机");
		setSize(480, 800);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setResizable(false);
	}

	private void initGamePanel() {
		gamePanel = new JPanel() {
			private int score = 0;
			/**
			 * 判断敌机与子弹相撞
			 * @param enemy
			 * @param bullet
			 * @return
			 */
			public boolean isHit(Enemy enemy, Bullet bullet) {
				Rectangle r1 = new Rectangle(enemy.getX(), enemy.getY(), enemy.getWidth(), enemy.getHeight());
				Rectangle r2 = new Rectangle(bullet.getX(), bullet.getY(), bullet.getWidth(), bullet.getHeight());
				return r1.intersects(r2);
			}
			
			/**
			 * 判断英雄战机与敌机相撞
			 * @param enemy
			 * @param hero
			 * @return
			 */
			public boolean isHit(Enemy enemy, Hero hero) {
				Rectangle r1 = new Rectangle(enemy.getX(), enemy.getY(), enemy.getWidth(), enemy.getHeight());
				Rectangle r2 = new Rectangle(hero.getX() + hero.getWidth() / 3, hero.getY() + hero.getHeight() / 3,
						hero.getWidth() / 3, hero.getHeight() / 3);
				return r1.intersects(r2);
			}

			@Override
			public void paint(Graphics g) {
				super.paint(g);
				g.drawImage(ImageUtil.bg, 0, 0, 480, 800, null);
				for (int i = 0; i < enemies.size(); i++) {
					Enemy enemy = enemies.get(i);
					for (int j = 0; j < hero_bullet.size(); j++) {
						Bullet bullet = hero_bullet.get(j);
						if (isHit(enemy, bullet) && enemy.isAlive()) {
							enemy.setAlive(false);
							hero_bullet.remove(bullet);
							new Thread() {
								public void run() {
									score += 10;
									try {
										sleep(200);
									} catch (InterruptedException e) {
										// TODO Auto-generated catch block
										e.printStackTrace();
									}
									enemies.remove(enemy);
								};
							}.start();
							break;
						}
					}
					if (isHit(enemy, hero)) {
						timer.cancel();
						hero.setAlive(false);
						enemy.setAlive(false);
						JOptionPane.showMessageDialog(this, "游戏结束,您的得分是:" + score);
						System.exit(0);
					}
					if (enemy.getY() > 800) {
						enemies.remove(enemy);
					}
					enemy.paint(g);
				}
				if (hero != null) {
					hero.paint(g);
				}
				g.setFont(new Font("宋体", Font.BOLD, 24));
				g.drawString("得分:" + score, 350, 30);

			}
		};
		add(gamePanel);
		// 设置拖拽监听事件
		gamePanel.addMouseMotionListener(new MouseAdapter() {

			@Override
			public void mouseDragged(MouseEvent e) {
				if (hero != null) {
					hero.mouseDragged(e);
				}
			}
		});
	}

}

启动游戏类

package com.cml.main;

import com.cml.frame.GameFrame;

public class Start {

	public static void main(String[] args) {
		/**
		 * 初始化窗体
		 */
		new GameFrame().setVisible(true);
	}
}

运行效果图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_48598155/article/details/106959333