当前位置:首页 > 开发教程 > java教程 >

java实现飞机大战小游戏

时间:2022-06-07 09:29 来源:未知 作者:Believe yourself 收藏

这篇文章主要为大家详细介绍了java实现飞机大战小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现飞机大战游戏的具体代码,供大家参考,具体内容如下

MyPanel类

package P;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;

import javax.sql.RowSetInternal;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
//xx.2
//创建面板类,继承面板,实现移动监听事件
public class MyPanel extends JPanel implements MouseMotionListener {
 //private ImageIcon bjImage = new ImageIcon("img/bj.png");
 
 //英雄机图片
 private ImageIcon heroImage = new ImageIcon("img/头.png");
 
 //显示logo
 //private ImageIcon logoImage = new ImageIcon("img/头.png");
 
 //英雄机的宽高
 private int width = heroImage.getIconWidth();
 private int height = heroImage.getIconHeight();
 
 //英雄机的坐标
 private int x=180;
 private int y=880;
 
 //创建一个敌机的集合,用于展示多个敌机
 List<Enemy> enemys = new ArrayList<>();
 //存储子弹集合
 List<Bullet> bullets = new ArrayList<>();
 //存储爆炸对象集合
 List<Bomb> bombs = new ArrayList<>(); 
 //存储英雄机爆炸集合
 List<HeroDead> heroDeads = new ArrayList<>();
 
 private int number;//统计当前得分
 private int m;//统计剩余血条量
 
// MyPanel jp = new MyPanel() {
//  {
//   setBackground(Color.gray);// 设置面板背景颜色
//  }

 
 
 public MyPanel() {
  //在构造方法中准备10个敌机
  for(int i=0;i<10;i++){
   enemys.add(new Enemy());
  }
 }
 
 @Override
 public void paint(Graphics g) { //用于绘制图片区域
  super.paint(g);
  
  //在窗口左侧展示打飞机得分
  //设置字体: 参数1:字体家族, 参数2:字体样式:加粗  参数3:字体大小
  g.setFont(new Font("宋体", Font.BOLD, 30));
  g.drawString("当前得分:"+number, 5, 30);
  g.drawString("发量(万根):"+(5-m), 5, 80);
  //g.drawImage(null, x, y, getBackground(), getFocusCycleRootAncestor());
  
  //绘制英雄机图片 参数1,图片 参数2和3:坐标
  g.drawImage(heroImage.getImage(), x, y, null);
  
  //g.drawImage(logoImage.getImage(), 19, 22, null);
  
  //在绘图中显示10辆敌机
  for(int i=0;i<enemys.size();i++){
   Enemy enemy = enemys.get(i); //获取敌机对象
   enemy.drawImage(g);   //然后分别展示
  }
  
  //展示子弹集合的图片
  for (int i = 0; i < bullets.size(); i++) {
   Bullet bullet = bullets.get(i); //取出子弹对象
   bullet.drawImage(g);
  }
  
  //展示爆炸集合的图片
  for(int i=0;i<bombs.size();i++){
   Bomb bomb = bombs.get(i);
   bomb.drawImage(g);
  }
  
  //展示英雄机的销毁图片
  for(int i=0;i<heroDeads.size();i++){
   HeroDead heroDead = heroDeads.get(i);
   heroDead.drawImage(g);
  }
  
 }

 @Override
 public void mouseDragged(MouseEvent e) {
  //System.out.println("鼠标移动并拖拽触发");
  
  //鼠标拖拽时,需要将英雄机也带着移动(只需改变x轴和y轴)
  x = e.getX()-width/2; //英雄机的移动,随着鼠标触发移动的
  y = e.getY()-height/2; //鼠标指定到英雄机中间位置
  
  repaint(); //重新绘制图片
 }

 @Override
 public void mouseMoved(MouseEvent e) {
  //System.out.println("鼠标移动的触发..");
  
  //鼠标移动时,需要将英雄机也带着移动(只需改变x轴和y轴)
  x = e.getX()-width/2; //英雄机的移动,随着鼠标触发移动的
  y = e.getY()-height/2; //鼠标指定到英雄机中间位置
  
  repaint(); //重新绘制图片
 }


 //L-4. 创建子弹类Bullet,操作与敌机类类似
 public void init() {
  //定义一个标记,循环了自定义的次数后,才去添加,这样子弹数量会变少
  int flag = 0;
  while(true) { //循环地跑,模拟依次移动的效果
   flag++; //
   if(flag==50) { //控制子弹数量
    
    bullets.add(new Bullet(x+width/2, y)); //就是从英雄级的x,y轴位置发射子弹的
   
    flag=0; //又回到0,依次计算15次
    //System.out.println("子弹数量:"+ bullets.size());
   }
      
   //展示子弹,让子弹飞起来
   for(int i=0;i<bullets.size();i++) {
     Bullet bullet = bullets.get(i); //取出对象
     if(i%2!=0)//设置子弹左右发射
     bullet.move(); 
     else
     bullet.move1();//移动子弹位置
     
     
     //如果子弹移动到y轴为0,则移除掉
     if(bullet.getY()<0){
      bullets.remove(bullet); //移除子弹对象
     }
   }

   //xx.3.
   //敌机循环移动..
   for(int i=0;i<enemys.size();i++) {
    Enemy en = enemys.get(i);
    en.move(); //循环地移动每一架敌机y轴位置
    
    
    //超出屏幕范围后,需要移除,并重新添加一个对象
    if(en.getY()>GameMain.HEIGHT) {
     //int count1=enemys.size();
     enemys.remove(en);  //移除对象
     
     enemys.add(new Enemy()); //重新再创建对象
    }
    
   //L 3-4 
    //在敌机的循环中,再继续循环子弹; 需要判断是否有子弹和敌机重叠了,
    //则移除敌机对象,重新添加,移除子弹;如果有则添加爆炸对象
    for(int j=0;j<bullets.size();j++){
     Bullet bu = bullets.get(j);
     if(isHit(en,bu)){ //碰撞的判断
      enemys.remove(en); //移除敌机,并重新new一个
      enemys.add(new Enemy());
      
      bullets.remove(bu); //移除子弹
      
      //添加的爆炸位置和敌机位置一致
      bombs.add(new Bomb(en.getX(), en.getY()));
      
      number += 10; //爆炸后,累加得分
     }
    }

    //zz-6
    //判断英雄机与敌机的碰撞(英雄机的消亡)
    if(isHit(en)){
     System.out.println("进入英雄机爆炸...");
     //敌机的对象移除
     enemys.remove(en);
     
     //英雄机爆炸图片位置应该与英雄机重叠
     heroDeads.add(new HeroDead(x, y));

     for(m=0;m<=heroDeads.size();m++) {
      while(heroDeads.size()==5) {
       return;
      }
     }
      //游戏结束,跳出死循环
    }
   }

   //L-5
   //将爆炸的所有对象,过一段时间则干掉
   for(int i=0;i<bombs.size();i++){
    Bomb bomb = bombs.get(i);
    bomb.move(); //计算次数,统一循环多少次后,再干掉
    
    if(bomb.getCount()>6){
     bombs.remove(bomb); //在循环的一定范围后,可以移除爆炸了
    }
   }
   
   //xx.2
   //每次的移动都需要停顿一下
   try {
    Thread.sleep(6);  //单位:毫秒 睡眠6毫秒
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   
   repaint(); //重新绘制图片
  }
 }

 
 
 
  //zz-6
  //英雄机与敌机的碰撞
 private boolean isHit(Enemy en) {
  //英雄机的碰撞区域
  Rectangle rect = new Rectangle(x, y, width, height);
  //碰撞点的位置,是在敌机的中心点
  Point point = new Point(en.getX()+en.getWidth()/2, en.getY()+en.getHeight()/2);
  
  return rect.contains(point);
 }

 
 
 //L-5
 private boolean isHit(Enemy en, Bullet bu) {
  //填充敌机的碰撞区域
  Rectangle rect = new Rectangle(en.getX(), en.getY(), en.getWidth(), en.getHeight());
  //将子弹的位置设置在中间
  Point point = new Point(bu.getX()+bu.getWidth()/2, bu.getY()+bu.getHeight()/2);
  //如果位置有重叠,返回true
  return rect.contains(point);
 }
}

HeroDead类

package P;

import java.awt.Graphics;

import javax.swing.ImageIcon;

public class HeroDead {
 private ImageIcon heroImage = new ImageIcon("img/爆炸.gif");
 private int width = heroImage.getIconWidth();
 private int height = heroImage.getIconHeight();
 private int x;
 private int y;
 
 
 
 public ImageIcon getHeroImage() {
  return heroImage;
 }

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

 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 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 HeroDead(int x,int y){
  this.x=x;
  this.y=y;
 }

 public void drawImage(Graphics g) {
  g.drawImage(heroImage.getImage(), x, y, null);
 }
}

GameMain类

package P;

import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.JFrame;

//游戏入口类
public class GameMain {
 static final int WIDTH = 860; //设置静态常量,作为状态值使用
 static final int HEIGHT = 660;
 public static void main(String[] args) {
  JFrame jFrame = new JFrame(); //实例化顶级窗口类
  jFrame.setSize(WIDTH, HEIGHT); //设置宽高像素
  jFrame.setTitle("小秃头历险记"); //设置标题
  jFrame.setLocationRelativeTo(null); //设置居中效果
  //JFrame.EXIT_ON_CLOSE: 状态值 3
  jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口的同时,把程序关闭
  

  //在窗口中,加入面板
  MyPanel pl = new MyPanel();
  pl.setBackground(Color.pink);
  pl.setBorder(BorderFactory.createLineBorder(Color.cyan, 3));
  jFrame.add(pl); //添加面板组件
  jFrame.addMouseMotionListener(pl); //添加鼠标移动事件 
  
  jFrame.setVisible(true); //使窗口可视化
  
  pl.init(); //在面板中循环将组件跑起来
 }
}

Enemy类

package P;

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

import javax.swing.ImageIcon;

//创建敌机类
public class Enemy {
 //创建敌机图片,宽高,坐标等属性
 private ImageIcon enemyImage = new ImageIcon("img/错误.png");
 
 private int width = enemyImage.getIconWidth();
 private int height = enemyImage.getIconHeight();
 
 private int x;
 private int y;
 
 public ImageIcon getEnemyImage() {
  return enemyImage;
 }

 public void setEnemyImage(ImageIcon enemyImage) {
  this.enemyImage = enemyImage;
 }

 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 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 Enemy(){
  //创建随机类,在窗口宽高范围内随机
  Random random = new Random();
  //随机出来的敌机位置可以显示一半图片
  x = random.nextInt(GameMain.WIDTH-width/2);
  y = -random.nextInt(GameMain.HEIGHT-height/2); //初始敌机位置为负数
 }

 public void drawImage(Graphics g) {
  //绘制敌机图片
  g.drawImage(enemyImage.getImage(), x, y, null);
 }

 public void move() {
  y +=2; //控制y轴速度
 }
}

Bullet类

package P;

import java.awt.Graphics;

import javax.swing.ImageIcon;

//创建子弹类
public class Bullet {
 //创建属性,子弹图片,宽高,位置
 private ImageIcon bulletImage = new ImageIcon("img/aaa.gif");
 
 private int width = bulletImage.getIconWidth();
 private int height = bulletImage.getIconHeight();
 
 private int x;
 private int y;
 
 public ImageIcon getBulletImage() {
  return bulletImage;
 }

 public void setBulletImage(ImageIcon bulletImage) {
  this.bulletImage = bulletImage;
 }

 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 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 Bullet(int x,int y) { //x,y轴位置从外面传入(等于英雄级的位置)
  this.x = x;
  this.y = y;
 }

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

 public void move() {
  x-=1;
  y -= 2; //让子弹y轴从下往上递减
 }
 public void move1() {
  x+=1;
  y -= 2; //让子弹y轴从下往上递减
 }
}

爆炸类bomb类

package P;

import java.awt.Graphics;

import javax.swing.ImageIcon;

//创建爆炸的实体了
public class Bomb {
 //爆炸的图片,宽高,位置属性
 private ImageIcon bombImage=new ImageIcon("img/zz.png");
 private int width = bombImage.getIconWidth();
 private int height = bombImage.getIconHeight();
 private int x;
 private int y;
 
 private int count; //记录多少次数后爆炸
 
 public ImageIcon getBombImage() {
  return bombImage;
 }

 public void setBombImage(ImageIcon bombImage) {
  this.bombImage = bombImage;
 }

 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 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 getCount() {
  return count;
 }

 public void setCount(int count) {
  this.count = count;
 }

 public Bomb(int x,int y){
  this.x = x;
  this.y = y;
 }

 public void drawImage(Graphics g) {
  g.drawImage(bombImage.getImage(), x, y, null);
 }

 public void move() {
  count++;
 }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持源码搜藏网。


下一篇:没有了

java教程阅读排行

最新文章