package ui;

import javax.swing.*;
/**

  • 游戏窗体 java窗体类JFrame
    */
    public class GameFrame extends JFrame {

    public GameFrame() {
    setTitle(“飞机大战”);

     setSize(500,700);setLocationRelativeTo(null);setResizable(false);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    

    }
    public static void main(String[] args) {
    GameFrame frame = new GameFrame();
    GamePanel panel = new GamePanel(frame);//方便面板中添加键盘监听器
    //启动游戏的方法
    panel.action();
    //报错是因为GamePanel构造器没有添加GameFrame frame
    frame.add(panel);
    frame.setVisible(true);
    }
    }


package ui;
import com.sun.xml.internal.ws.api.addressing.AddressingVersion;

    import javax.swing.*;import java.awt.*;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.image.BufferedImage;import java.io.StreamCorruptedException;import java.security.spec.ECParameterSpec;import java.time.Year;import java.util.ArrayList;import java.util.List;

/**

  • java 游戏面板 JPanel
    */
    public class GamePanel extends JPanel{
    BufferedImage bg;//背景图

    Hero hero = new Hero();//创建英雄机

    //Ep ep = new Ep();//创建单个敌机
    //创建敌机大本营(所有敌机都在这里出现)
    List eps = new ArrayList();//集合

    //创建英雄机子弹仓库 也可以在hero.java里面创建
    List fs = new ArrayList();//在去下面action里面 控制子弹活动

    //定义分数
    int score;

    /**

    • 开始游戏的方法
      */
      public void action(){//这个最后要到JFrame里被调用
      //创建并启动一个线程 控制游戏场景中物体活动
      //固定格式
      //new Threed(){public void run(){…线程需要做的事情}}.start();
      new Thread(){
      public void run(){
      //写个死循环 让游戏一直运行
      while (true){
      //调用敌机入场的方法
      epEnter();//在下面创建一个方法就不会报错,创建快捷键,点epEnter()在alt+回车,提示里点!,在选择GamePanel 下面成功创建
      //调用让敌机动起来的方法
      epMove();//在下面创建一个方法就不会报错

               //发射子弹shoot();//在下面创建一个方法就不会报错 创建快捷键,点shoot()在alt+回车,提示里点!,在选择GamePanel 下面成功创建//子弹移动的方法fireMove();//在下面创建一个方法就不会报错//判断子弹是否打到敌机shootEp();//在下面创建一个方法就不会报错,创建快捷键,点shootEp()在alt+回车,提示里点!,在选择GamePanel 下面成功创建//每执行一次 休息一会 即让线程休眠 毫秒数//捕获异常try {Thread.sleep(30);} catch (InterruptedException e) {e.printStackTrace();}//刷新页面repaint();}}
      

      }.start();
      }
      //检测子弹是否打到敌机 shoot射击
      private void shootEp() {
      //遍历所以呢子弹
      for (int i = 0; i<fs.size();i++){
      //获取每一颗子弹
      Fire f = fs.get(i);
      //每拿一颗子弹就判断一下这颗子弹是否击中了敌机,bang重击
      bang(f);//出现报错,点 bang(f);在alt+回车 点!,下面创建成功

      }
      }
      //判断一下这颗子弹是否击中了敌机
      private void bang(Fire f) {
      //遍历所有的敌机
      for (int i = 0;i<eps.size();i++){
      //获取每一个敌机
      Ep e = eps.get(i);
      //判断这个子弹是否击中敌机 ; e 表示敌机 f表示子弹;shootBy通过射击
      if (e.shootBy(f)){//出现报错,点shootBy(f),alt+回车,选!,再选EP类
      //如果敌机被子弹击中
      //1:敌机消失即从敌机大本营删除;remove删除
      eps.remove(e);
      //2:删除子弹即从子弹库中删除子弹
      fs.remove(f);
      //3:增加打掉敌机的分数

           score += 100;}
      

      }
      }

    //子弹动移动方法
    protected void fireMove(){
    //每颗子弹移动起来 用遍历
    for (int i = 0;i<fs.size();i++){
    Fire fire = fs.get(i);//获取每一课子弹
    //让子弹移动
    fire.move();//在子弹Fire类里面创建一个方法就不会报错
    }
    }
    //定义一个计数器 控制子弹速度 shoot执行次数
    int findex = 0;
    //发射子弹的方法
    protected void shoot(){
    findex++;
    if (findex>=20){
    //创建子弹
    //Fire fire = new Fire();//这里报错是因为Fire.java里面已经有有参构造器即(int hx,int hy),方法1:在Fire.java
    //里面创建无参构造器 2:或者在Fire()里面加参数 如下:
    Fire fire = new Fire(hero.x,hero.y,0);
    //将子弹加入弹药库
    fs.add(fire);//然后在下面画出子弹
    //发射多颗子弹
    Fire fire1 = new Fire(hero.x+25,hero.y,1);
    //将子弹加入弹药库
    fs.add(fire1);//然后在下面画出子弹
    Fire fire2 = new Fire(hero.x+50,hero.y,2);
    //将子弹加入弹药库
    fs.add(fire2);//然后在下面画出子弹

         findex = 0;//重新开始记录}
    

    }

    /**

    • 敌机动起来的方法
      */
      protected void epMove(){
      //遍历所有敌机
      for (int i = 0;i<eps.size();i++){
      //获取每一个敌机
      Ep e = eps.get(i);
      //让敌机动起来
      e.move();//在敌机EP类里面创建一个方法就不会报错
      }
      }

    //敌机入场的方法;此方法在死循环中调用,所以该方法会一直重复执行
    //解决敌机出现频率太快问题
    int index = 0;//记录方法执行的次数即每隔一段时间释放一个敌机

    protected void epEnter(){
    //记录执行的次数
    index ++;
    if (index>=20){
    //1:创建敌机
    Ep e = new Ep();
    //2:将敌机加入到敌机大本营即上面的集合里
    eps.add(e);
    //将index重新归零
    index = 0;
    }
    }

    public GamePanel(GameFrame frame) {
    setBackground(Color.cyan);
    bg = App.getImg("/img/bg2.jpg");
    //使用鼠标监听器的格式(固定格式)
    //1:创建鼠标适配器
    MouseAdapter adapter = new MouseAdapter(){
    //2:确定需要监听的鼠标事件
    //鼠标的事件
    // 1:mouseMoved() 监听鼠标移动事件
    // 2:mousecliked() 监听鼠标单击事件
    // 3:mousePressed() 监听鼠标按下去事件
    // 4:mouseEntered() 监听鼠标移入游戏界面事件
    // 5:mouseExited() 监听鼠标移出游戏界面事件

         //mouseMoved用法 打出mouseMoved在按alt+回车.再提示里面找//MouseEvent e 监视鼠标事件@Overridepublic void mouseMoved(MouseEvent e) {//super.mouseMoved(e);这个可以不用//当鼠标在游戏界面移动时会触发的方法// System.out.println("移动");测试用的//让英雄机的横纵坐标等于鼠标的横纵坐标int mx = e.getX();int my = e.getY();//让英雄机移动到鼠标的位置上,调用英雄机hero.moveToMouse(mx,my);//刷新界面 否则飞机表面上看不出移动repaint();}};//3:将鼠标适配器加入到监听器中addMouseListener(adapter);addMouseMotionListener(adapter);//镜像//使用键盘监听器(固定格式)//1:创建键盘适配器KeyAdapter kd = new KeyAdapter(){//2:确定需要监听的键盘事件//先打keyPressed 再alt+回车 在提示里面找@Overridepublic void keyPressed(KeyEvent e) {super.keyPressed(e);//当按下键盘的按键时,会触发的方法//System.out.println("键盘运行了");//测试键盘是否运行//监听键盘;每一个按键都对应有一个数字//获取键盘上按键的数字int keyCode = e.getKeyCode();//System.out.println(keyCode);//可以测试按键按下的反应//如果按上键 向上移动if (keyCode==KeyEvent.VK_UP){hero.moveUP();//如果按下键 向下移动}else if (keyCode==KeyEvent.VK_DOWN){hero.moveDown();}else if(keyCode==KeyEvent.VK_LEFT){hero.moveLeft();}else if(keyCode==KeyEvent.VK_RIGHT){hero.moveRight();}repaint();//重绘即刷新}};//3:将键盘适配器加到窗体的键盘监听器中,现在需要在框架中加入frameframe.addKeyListener(kd);//加frame调用
    

    }

    /**

    • 专用画图方法

    • Graphics g 画笔

    • paint方法:先打出paint出来 按alt+回车

    • @param g
      */
      @Override
      public void paint(Graphics g) {
      super.paint(g);
      //画面板图片
      g.drawImage(bg,0,0,500,700,null);
      //画英雄机s
      g.drawImage(hero.img,hero.x,hero.y,hero.w,hero.h,null);
      //画敌机
      //遍历敌机大本营,集合,画出所有的敌机
      for (int i = 0; i<eps.size();i++){
      //获取每一个敌机 从集合里面拿到敌机
      Ep ep = eps.get(i);
      g.drawImage(ep.img,ep.x,ep.y,ep.w,ep.h,null);
      }
      //遍历子弹库
      for (int i = 0;i<fs.size();i++){
      //获取一个子弹
      Fire fire = fs.get(i);
      g.drawImage(fire.img,fire.x,fire.y,fire.w,fire.h,null);
      }
      //画分数
      g.setColor(Color.WHITE);//选择颜色
      g.setFont(new Font(“楷体”,Font.BOLD,20));//字体大小

      g.drawString(“分数:”+score,10,30);//score得分 字体位置
      }
      }


package ui;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**

  • 处理图片的工具类 App
    */
    public class App {
    public static BufferedImage getImg(String path){
    try {
    BufferedImage img = ImageIO.read(App.class.getResource(path));
    return img;
    } catch (IOException e) {
    e.printStackTrace();
    }
    return null;
    }
    }

package ui;

import java.awt.image.BufferedImage;
//英雄机
public class Hero extends FlyObject{
//Hero继承了FlyObject

public Hero() {img = App.getImg("/img/hero.png");x = 200;y = 550;w = img.getHeight();h = img.getWidth();}
//英雄机移动到鼠标位置上的方法
public void moveToMouse(int mx,int my){x = mx-w/2;y = my-h/2;}
//向上移动
public void moveUP(){y -= 10;
}
//向下移动
public void moveDown(){y += 10;
}
//向左移动
public void moveLeft(){x -= 10;
}
//向右移动
public void moveRight(){x += 10;
}

}

package ui;
//敌机
import java.awt.image.BufferedImage;
import java.util.Random;
/**
*敌机
*1:敌机数量很多 java中存放多个数据,1)使用数组,缺点数组必须确定长度,2)使用集合 这里用集合好些
*2:敌机的数量是未知的
*/
public class Ep extends FlyObject {
//Ep 继承了FlyObject
int sp ;//敌机出现的速度
//构造器:给敌机定型
public Ep() {
//定义一个随机类
Random rd = new Random();
//img = App.getImg("/img/ep02.png");//确定敌机显示的固定图片
//随机产生敌机图片 如果读取图片报错显示input==null 表示图片路径错误
int index = rd.nextInt(15)+1;
//System.out.println("/img/ep0"+index+".png");//检查原因
//三目运算符
//格式:条件表达式?值1:值2;表示如果条件表达式成立为true就取值1,否则取值2
//如果index的值小于10就取0,否则就取空;
//注意(index<10?“0”:"")这个括号必须有 否则类型不同会报错
String path = “/img/ep”+(index<10?“0”:"")+index+".png";
System.out.println(path);
img = App.getImg(path);
// x = 100;//位置固定
// y = 50;//位置固定

    w = img.getWidth();h = img.getHeight();//定义随机 nextlnt(num) 表示会在[0,num]之间随机生成一个整数x = rd.nextInt(500-w);//减去敌机宽度y = -h;//减去敌机高度//设置速度//sp = index;//这个相等 代表飞机越大速度越大//采取相反的动作 飞机越小速度越快sp = 17-index;//因为图片是1到16个
}
/*** 敌机移动的方法* 敌机向下移动*/
public  void move(){/*  //y += 10;//敌机出现的速度都一样//改变敌机出现的速度 变成随机Random rd = new Random();y += rd.nextInt(10)+1;//随机速度最少是1,出现敌机停顿现象,是因为每随机一次//就会移动一次,速度在变化 ,重新在上面定义一个敌机的速度*/y += sp;
}
//判断敌机是否被子弹击中
public boolean shootBy(Fire f) {//出现报错  里面加 return false;boolean hit = x<=f.x+f.w && x>=f.x-w &&y<=f.y+f.h && y>=f.y-h;return hit;//把false换成hit  即返回hit
}

}

package ui;
/**游戏场景中飞行物类(英雄机 ,敌机,子弹等)

  • 在开发中,常会将具有相同特点的类放在一起,将这些相同的特点抽离出来,形成一个父类

*/
import java.awt.image.BufferedImage;
//飞行物父类
public class FlyObject {
//飞行物的图片
BufferedImage img;
//飞行物的横纵坐标及大小
int x;
int y;
int w;
int h;
}

package ui;
/**

  • 子弹类 属于飞行物

*/
public class Fire extends FlyObject{

//子弹当前移动的方向
int dir;//dir=0,就往左上角 dir=1 就往中间,dir =2 就往右上角//构造方法:初始化子弹  hx,hy英雄机的横纵坐标/*public Fire() {
}*/public Fire(int hx, int hy,int dir) {//加入dir子弹移动方法 前面GamePanel里shoot()//会报错 添加0,1,2//确定子弹的图片img = App.getImg("/img/fire.png");//确定子弹的大小w = img.getWidth()/4;//改变子弹形状大小h = img.getHeight()/4;//确定子弹的位置(初始位置在英雄机上)x = hx+10;//加10 是校正子弹在飞机出发的位置y = hy;//上面创建好后去GamePanel里面创建子弹库this.dir = dir;//如果参数和构造器的名字一样时,要加this区分开}
public void move(){//y -= 10;//这是统一一个方向//改变子弹发射方向if (dir==0){x -= 2;//用10 子弹发射角度太大 改成2y -= 10;}else if (dir==1){//x = 0;//这个不用写y -= 10;}else {x += 2;y -= 10;}
}

}

java 跟软帝-攀哥学做编程 飞机大战4相关推荐

  1. 怎么用java做全民飞机大战_Java飞机大战游戏设计与实现

    1 概述 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程中的一些窗口类库. ...

  2. 做大数据用java还是python_新手零基础学做大数据工程师,编程学Java还是Python比较好?...

    Python和Java,是大数据行业最常见的两种编程语言,对于想转行大数据的人人来说,学习哪个语言是比较好的选择呢? Python Python和大数据: Python本身的特点是高效率的开发和简单的 ...

  3. 经典回顾:用pygame模块做一个飞机大战

    目录 前言 一.安装pygame: 1.用pip包管理器安装: 2.二进制安装包安装: 二.学习pygame的内置模块: 1.初始化: 2.精灵组: 3.页面的渲染和刷新 三.使用步骤 1.准备游戏素 ...

  4. 怎么用java做全民飞机大战_基于VC++和OpenCV实现的全民飞机大战游戏

    摘要 功能:利用C++语言完成了一个小游戏项目-全民飞机大战,该游戏首先能够给用户提供注册,登录功能:提供了菜单栏及两种游戏模式,一种是无尽模式,另一种是一般模式:一般模式中用户通过控制玩家飞机攻击敌 ...

  5. JAVA入门到精通-第43讲-IO编程-坦克大战10

    //当敌人子弹击中我的时候,死亡 this.hitEnemyTank( ); //每一个敌人的坦克击中我 //我的坦克被击中,爆炸,消失 //当敌人互相有碰撞的时候,不能往前面走了 矩形的任何一点不能 ...

  6. 1小时1篇文学会python再做个飞机大战游戏

    注: 想慢慢学习的同学可以看我的 <python 入门到游戏实战专栏>(更新中) 想学 C 的同学可以看<大话系列之C语言>(基本更新完) 想学 C++ 的同学可以看<大 ...

  7. java飞机大战爆炸效果_Java飞机大战游戏设计与实现

    1 概述 1.1 项目简介 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程 ...

  8. Java网课简易飞机大战

    因之前用unity做过飞机大战的小游戏,用的脚本是C#.现在上了几节网课,又用java做的简单功能的小游戏,再次记录一下.功能非常简单.鼠标控制飞机一定,子弹发射,敌机出现以及子弹和敌机的碰撞检测.爆 ...

  9. java飞机大战编程_[源码和文档分享]Java飞机大战游戏设计与实现

    1 概述 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程中的一些窗口类库. ...

最新文章

  1. 【Codeforces】Round #375 (Div. 2)
  2. 杭州往事之与L项目SME Cathy小聚
  3. inode占满前因后果
  4. Android知识点 - 收藏集 - 掘金
  5. 工具SSHSecure连接远程服务器步骤
  6. SpringBootAdmin监控信息讲解
  7. ML.NET 示例:对象检测-ASP.NET Core Web和WPF桌面示例
  8. UVA - 572 Oil Deposits-dfs找连通块
  9. 业务随行:用户的网络访问策略还能这么玩
  10. java应用程序怎样获取外接设备信号 通过usb
  11. 计算机设备及维护招标公告,列“State”不属于表 。
  12. Tricks(三十五)—— 内积的极简实现
  13. 红米Redmi品牌独立后首发新品 雷军:『友商就不要用性价比这个词了』...
  14. 全国省份及城市按字母顺序进行排序js文件
  15. 【javaEE】——计算机基础知识(进程的理解和通信)01
  16. 一. Scala安装与环境配置
  17. 很多人都说flash as3 经常都是使用MC或者sprite(请问这里的sprite是什么意思?)...
  18. 海豚湾,变态的日本银
  19. HYSBZ 2818 Gcd
  20. 【深度学习学习笔记】数值计算——矩阵

热门文章

  1. python打印所有的水仙花数_python 打印所有的水仙花数
  2. 图片识别文字怎么做?这几种方法轻松解决
  3. elm_flask 项目日志 -- flask后台管理系统开发设计
  4. MES模型与ISA-95标准
  5. 6-2 输出每个月的天数
  6. mycat入门:分片策略详解
  7. 服务器centos安装mysql数据库_阿里云 centos7 安装mysql数据库
  8. 项目管理典型的发展路径是怎样的?
  9. command(command怎么读)
  10. php拜占庭容错算法机制,实用拜占庭容错算法(PBFT)