java飞机大战
编程夜游神 人气:0整体思路
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); } }
运行效果图
加载全部内容