飞翔小鸟思路及代码

昨天跳着看视频把飞翔小鸟做出来了,下面分享一下我的思路。

先放成品图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

和上一篇飞机大战的思路相似:

1.先把窗体做出把背景图放在面板中
2.把游戏背景中地面移动实现
3.把柱子在面板中实现进场及移动
4.把小鸟放在面板中
5.鼠标监听控制小鸟飞行轨迹
6.写判断小鸟与柱子碰撞和与地面碰撞的方法
7.添加计分和游戏结束游戏开始的画面

上面步骤最难的是写判断碰撞的方法…
——————————————————————————————————————————

首先是窗体类:
public class GameFrame extends JFrame{public static void main(String[] args) {GameFrame frame=new GameFrame();GamePanel panel =new GamePanel();//显示窗体frame.setVisible(true);//向窗体内添加一块画板frame.add(panel);	}public GameFrame() {setTitle("飞翔小鸟");// 设置标题setSize(432, 644);//窗体尺寸setLocationRelativeTo(null);// 相对于屏幕左上角居中setResizable(false);// 设置不允许玩家拖动界面setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置Logo图标 img/0.pngsetIconImage(ImageUtil.getImage("/img/0.png"));}
}
这是一个获取图片字节流的工具类:
public class ImageUtil {public static BufferedImage getImage(String path) {try {BufferedImage image = ImageIO.read(ImageUtil.class.getResource(path));return image;} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return null;}
}
地面类:
public class Ground {/** 定义地方的x,y坐标和宽高*/int x;int y;int w;int h;BufferedImage img;//地面的构造器用来构建地面对象public Ground() {img=ImageUtil.getImage("/img/ground.png");h=img.getHeight();w=img.getWidth();x=0;y=644-h;}public void Move() {//让地面能够一直往左边移动if(x<=-(w-432)) {x=25; //初始化x为25 刷新时没有明显的断层}else {x--;}}
}
这个是柱子类:
public class Column {/** 定义地方的x,y坐标和宽高*/int x;int y;int w;int h;Random ran = new Random();BufferedImage img;// 安全间隙int gap;// 构造器初始化构造柱子对象(i表示第几根柱子)public Column(int i) {img = ImageUtil.getImage("/img/column.png");h = img.getHeight() / 2;w = img.getWidth() / 2;x = 320 + (i - 1) * 245;y = -ran.nextInt(h + 146 - 644 + 1);// 初始化安全间隙gap = 75;}// 柱子移动public void Move() {if (x <= -w) {x = 432 + w;y = -ran.nextInt(h + 146 - 644 + 1);} else {x--;}}}
这个是小鸟类(判断碰撞方法写在这里):
public class Bird {/** 定义地方的x,y坐标和宽高*/int x;int y;int w;int h;// 初速度double v0;// 时间间隔(往上移动的时间)double t;// 距离double s;// 重力double g;Random ran = new Random();BufferedImage img;List<BufferedImage> list;public Bird() {img = ImageUtil.getImage("/img/0.png");w = img.getWidth() / 2;h = img.getHeight() / 2;x = 100;y = 200;// 初始化初速度v0 = 2;// 时间t = 0.15;// 距离s = 0;// 重力g = 8;// 初始化装图片的容器list = new ArrayList<BufferedImage>();// 向容器中添加图片for (int i = 0; i < 8; i++) {list.add(ImageUtil.getImage("/img/" + i + ".png"));}}int index = 0;// 小鸟飞行时图片的切换效果public void fly() {if (index < 8) {img = list.get(index);index++;} else {index = 0;}}// 小鸟移动方法public void move() {// 计算小鸟上抛的距离s = v0 * t;// 得到小鸟上抛到最高点时的y坐标y = (int) (y - s);// 计算出小鸟到达最高点时的速度double v2 = v0 - g * t;// 最高点的速度就是小鸟下落时的初速度v0 = v2;}public void moveUp() {v0 = 15;}// 判断是否碰撞到天花板和地面public boolean hit() {if (y <= 0 || y >= 644 - 146 - h) {return true;}return false;}// 判断是否碰撞柱子public boolean hit(Column column) {if (x >= column.x - w && x <= column.x + column.w) {if (y > column.h / 2 + column.y - column.gap / 2 && y < column.h / 2 + column.y + column.gap / 2 - h) {return false;// 安全通过}return true;// 撞到了}return false;// 没撞到}}
最后是画板类:
public class GamePanel extends JPanel {BufferedImage bg;//背景图/** 声明地面和柱子的对象*/Ground ground;Column column1;Column column2;Bird bird;//声明小鸟对象/** 接收三个碰撞条件的变量*/boolean bool1 ;boolean bool2;boolean bool3;// 游戏准备状态boolean start;//是否startboolean GameOver;//是否Gameoverint socre;//分数public GamePanel() {bg = ImageUtil.getImage("/img/bg.png");ground = new Ground();column1 = new Column(1);column2 = new Column(2);bird = new Bird();// 监听鼠标MouseAdapter md = new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {// TODO 自动生成的方法存根super.mouseClicked(e);/** 当游戏为未开始时,点击鼠标为开始,执行start中的线程任务*/if (start == false) {start = true;start();} else if(GameOver){//当游戏结束时,点击鼠标为未开始,Gameover为否,并初始化画板中的各个对象start=false;GameOver=false;ground = new Ground();//初始化柱子对象column1 = new Column(1);//x = 300//初始化第二根柱子column2 = new Column(2);//x = 545//初始化鸟对象bird = new Bird();System.out.println("你的得分为 : "+socre);socre=0;repaint();}else{//游戏进行时,点击鼠标执行moveUp()方法bird.moveUp();}}};addMouseListener(md);addMouseMotionListener(md);}// 游戏开始的方法public void start() {MyThread mt = new MyThread();// 将线程所有执行的任务装入到线程对象中Thread t = new Thread(mt);// 将线程纳入线程调度t.start();// 告诉CPU可以给我这个线程分配时间片段了}@Overridepublic void paint(Graphics g) {super.paint(g);g.drawImage(bg, 0, 0, null);// 添加背景g.drawImage(column1.img, column1.x, column1.y, column1.w, column1.h, null);// 添加第一根柱子g.drawImage(column2.img, column2.x, column2.y, column2.w, column2.h, null);// 添加第二根柱子g.drawImage(ground.img, ground.x, ground.y, null);// 添加地面g.drawImage(bird.img, bird.x, bird.y, bird.w, bird.h, null);// 添加第二根柱子/** 当游戏为未开始时,把准备页面画上去*/if(start==false) {g.drawImage(ImageUtil.getImage("/img/start.png"), 0, 0, null);}/** 当游戏为结束时,把结束页面面画上去*/if(GameOver) {g.drawImage(ImageUtil.getImage("/img/gameover.png"), 0, 0, null);}	//画板中字体设置Font f=new Font("宋体",Font.BOLD,18);g.setFont(f);g.setColor(Color.white);g.drawString("分数 :"+ socre, 20, 30);}//线程类class MyThread implements Runnable {//写在run()方法中,就可以用线程的方法同时进行判断@Overridepublic void run() {/** 用死循环方式不断运行对象的方法*/while (true) {ground.Move();column1.Move();column2.Move();bird.fly();bird.move();bool1 = bird.hit();bool2 = bird.hit(column1);bool3 = bird.hit(column2);if (bool1||bool2||bool3) {GameOver = true;// 窗体内的对象全部静止break;// 结束循环}if(bird.x==column1.x+column1.w||bird.x==column2.x+column2.w) {socre++;//分数加一}try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}repaint();//刷新画面}}}
}

需要问题可以留言哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/68214.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

luogu p4556 [Vani有约会]雨天的尾巴 树上差分,最近公共祖先,线段树合并

命运的选择 题意神一般的过程及题解. 本来有信仰用 m a p map map套 s e t set set跑过去的,结果调了一天都没调出来,时间还比暴力都慢.只好写线段树合并. 题意 给 一 棵 树 , 每 次 用 一 种 颜 色 覆 盖 树 上 一 条 路 径 . 求 每 一 个 点 覆 盖 次 数 最 多 的 颜 色 , 如…

一文详解数字源表

一、数字源表的基本功能 集多种功能为一体的精密测量仪器&#xff0c;主要是测量电气性能 SMU可以当电源,万用表或电源/测量组合. 当电源时&#xff1a; 可编程电压源 可编程电流源 当万用表时&#xff1a; 数字电压表(电流源,输出电流为0,测电压) 数字电流表(电压源,输…

1044 火星数字( ( ఠൠఠ )搞我心态 )【!!常看!!】

火星人是以 13 进制计数的&#xff1a; 地球人的 0 被火星人称为 tret。地球人数字 1 到 12 的火星文分别为&#xff1a;jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。火星人将进位以后的 12 个高位数字分别称为&#xff1a;tam, hel, maa, huh, tou, kes, h…

机械制图之图线基础知识

1.图线的型式 1)常用基本图线: 8 种。 粗实线、细实线、细虚线、细点画线、波浪线、细双点画线、双折线、粗点画线。 2)线宽: 粗、细两种。 线宽比2:1 &#xff0c; 粗线宽度优先采用0.5 mm、0.7㎜。 不同的线型具有不同的含义。 2.图线的应用 3.图线的画法 1)同一图样中同…

机械制图哪个软件好用?浩辰CAD机械2021你值得拥有!

浩辰CAD机械 2021不仅能完美兼容主流CAD设计数据&#xff0c;还拥有业内更完备的智能专业设计功能&#xff0c;集机械制图、机构设计和数据管理等功能模块于一体。本篇机械制图CAD教程小编将详细介绍浩辰CAD机械 2021&#xff0c;帮助大家更好地了解和上手这款最新版本CAD软件。…

UML画图工具汇总

最近学习了UML&#xff0c;搜集了一把各类的画图工具以及它们的特点。最后选出我认为最好用的一款工具。 rose 《大象》书里面就是用的这款软件&#xff0c;但是这个貌似要钱&#xff0c;破解版版本很低&#xff0c;界面看起来也比较复古。不推荐。 star uml 挺有名的软件&…

超详细的热图绘制教程(5000余字),真正的保姆级教程

生物信息学习的正确姿势 NGS系列文章包括NGS基础、高颜值在线绘图和分析、转录组分析 &#xff08;Nature重磅综述|关于RNA-seq你想知道的全在这&#xff09;、ChIP-seq分析 &#xff08;ChIP-seq基本分析流程&#xff09;、单细胞测序分析 (重磅综述&#xff1a;三万字长文读懂…

机械制图-画、读组合体的视图

制图是什么&#xff1f;制图就是投影&#xff01; 依照惯例&#xff0c;雷老师上课前还是带领大家复习了上节课组合体的组合形式和物体分类的知识点&#xff0c;并且讲解了上次作业中需要注意的问题。比如对于涉及弧的问题&#xff0c;一些人没有投影线&#xff0c;一般点和特…

超好用的两款作图工具,用起来~~~

前言 作为程序员&#xff0c;项目开发过程中肯定会需要画一大堆图&#xff0c;原型图、流程图、UML图、思维导图、拓扑图等等&#xff0c;找到一个好工具肯定是能大大提高工作效率&#xff0c;这里就来分享两款我平时用得比较多的画图工具(这不是广告&#xff0c;也不是推广&a…

机械制图——常见的机件表达

文章目录 标准件与常用件1. 螺纹与螺纹紧固件螺纹旋合画法螺栓装配简化画法螺钉装配简化画法双头螺钉装配简化画法六角头螺栓连接画法双头螺柱连接画法开槽圆柱头螺钉连接画法开槽沉头螺钉连接画法 2. 键&#xff08;平键&#xff09;3. 销圆柱销圆锥销 4. 齿轮 零件图与装配图…

绘图小能手gunplot

下面的安装过程是在ubuntu20.04上进行的。 安装gnuplot需要依赖lua5.2。所以先安装lua5.2。 安装lua5.2 下载安装包 wget http://www.tecgraf.puc-rio.br/lua/ftp/lua-5.2.0.tar.gz编译安装lua5.2 解压后进入源码目录 make linux sudo make install安装gnuplot gnuplot主…

CAD机械制图入门知识

在计算机技术不断发展的过程中&#xff0c;CAD技术水平也得到了很大的提升&#xff0c;这使得CAD技术在机械制图当中的使用范围越来越大。CAD是常用的制图软件&#xff0c;具有很强的功能性&#xff0c;特别是在3D制图方面CAD有着较强的实用性。 对于大部分的人来说&#xff0c…

机械制图笔记

机械图纸上Φ50H7什么意思&#xff1f; 一般代表直径50的孔&#xff0c;H7的公差在这里是0.025mm/-0mm。 理论值M6的外径就是6毫米&#xff0c;实际上达不到&#xff0c;因为螺纹的尖顶都是圆角,通过查表m6的最大外径是5.92MM,这是基本数值。 机械制图中EQS&#xff0c;表示…

使用MapBox自定义地图

一、什么是MapBox&#xff0c;相对国内地图厂商的优势 MapBox是一家美国的地图厂商&#xff0c;2010 年成立于美国华盛顿&#xff0c;2017 年获得软银 1.64 亿美元 C 轮融资&#xff0c;完全开源的开发工具&#xff0c;帮助您在现有产品中实现灵活、轻量、稳定的地图、搜索、导…

企业网络设计,看这6个案例就够了

百度、美团的网络我们都可以称他们为企业网络。因为他们的网络本身是为自己提供服务&#xff0c;不提供网络的接入服务。 企业网主要包括三块内容&#xff1a;园区网、广域网和数据中心。按照网络用途来分&#xff0c;也可以分为办公网和生产网。 以上术语都是根据自己公司的…

雷军10周年演讲全文:没有任何成功是不冒风险的

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 2020年8月11日19:30&#xff0c;小米十周年&#xff0c;雷军公开演讲如约而至。在近3小时的演讲中&#xff0c;雷军用20个故事回顾了小米过去的热血10年&#xff0c;也展望了新的10年&#xff1a; 创新之火将会照亮每个疯…

一行代码值 200 万?雷军公开小米新 Logo 引吐槽

↓推荐关注↓ 今年是小米成立的第 10 年&#xff0c;从最初的 10 几个人创始团队&#xff0c;发展到如今的 3 万多员工。 为了迎接第十年&#xff0c;雷军透露在三年前&#xff08;2017年&#xff09;市场部同事曾建议他“升级品牌识别系统&#xff0c;先从 logo 开始。” 说干…

小米上市,雷军或成中国首富?作为科技粉也许你该关注的是这些

作者 | Leo 作为股票市场的老韭菜&#xff0c;这几天营长关注到的科技圈新闻有两个。 一个是 21 世纪经济报道的消息&#xff1a;证监会要对四大新兴行业独角兽 IPO “即报即审”&#xff0c;四个行业具体为生物科技、云计算、人工智能、高端制造。这意味着包括人工智能在内的四…

高端小米,雷军求“稳”

雷军21日在微博宣布&#xff0c;小米高端手机开始对标苹果&#xff0c;在产品品质和规格方面“向苹果学习”。 对此&#xff0c;有网友调侃&#xff1a; “对标苹果没有问题&#xff0c;但不要只对标价格。”苹果在高端手机市场中的成功&#xff0c;没有一家国产手机想要缺席。…

雷军,也卸任了……

兄弟们&#xff0c;大家中午好呀。 前几天咱们提到过&#xff0c;小米最近这段时间&#xff0c;有比较大的人事变动。 先是原来的小米集团总裁王翔在12月底退休&#xff0c;接任他的是前Redmi的负责人卢伟冰。 这才刚到1月份&#xff0c;新官上任的卢伟冰就又有新的职务了。 1月…