Java实例---flappy-bird实例[最终版]
代码分析
解析版: Java实例---flappy-bird实例解析
完整版:
TestBirdFly.java
1 package testfly; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.Graphics2D; 7 import java.awt.event.MouseAdapter; 8 import java.awt.event.MouseEvent; 9 import java.awt.event.MouseListener; 10 import java.awt.image.BufferedImage; 11 import java.util.Random; 12 13 import javax.imageio.ImageIO; 14 import javax.swing.JFrame; 15 import javax.swing.JPanel; 16 public class TestBirdFly extends JPanel { 17 Bird bird; 18 Column column1, column2; 19 Ground ground; 20 BufferedImage background; 21 boolean gameOver; 22 boolean started; 23 BufferedImage gameoverImg; 24 //分数 25 int score; 26 /** 初始化 BirdGame 的属性变量 */ 27 public TestBirdFly() throws Exception { 28 score = 0; 29 bird = new Bird(); 30 column1 = new Column(1); 31 column2 = new Column(2); 32 ground = new Ground(); 33 gameOver=false; 34 background = ImageIO.read( 35 getClass().getResource("bg.png")); 36 gameoverImg= ImageIO.read( 37 getClass().getResource("gameover.png")); 38 } 39 40 /** "重写(修改)"paint方法实现绘制 */ 41 public void paint(Graphics g){ 42 g.drawImage(background, 0, 0, null); 43 g.drawImage(column1.image, 44 column1.x-column1.width/2, 45 column1.y-column1.height/2, null); 46 g.drawImage(column2.image, 47 column2.x-column2.width/2, 48 column2.y-column2.height/2, null); 49 //在paint方法中添加绘制分数的算法 50 Font f = new Font(Font.SANS_SERIF, 51 Font.BOLD, 40); 52 g.setFont(f); 53 g.drawString(""+score, 40, 60); 54 g.setColor(Color.WHITE); 55 g.drawString(""+score, 40-3, 60-3); 56 57 g.drawImage(ground.image, ground.x, 58 ground.y, null); 59 if (gameOver){ 60 g.drawImage(gameoverImg,0,0,null); 61 return; 62 } 63 //旋转(rotate)绘图坐标系,是API方法 64 Graphics2D g2 = (Graphics2D)g; 65 g2.rotate(-bird.alpha, bird.x, bird.y); 66 g.drawImage(bird.image, 67 bird.x-bird.width/2, 68 bird.y-bird.height/2, null); 69 g2.rotate(bird.alpha, bird.x, bird.y); 70 }//paint方法的结束 71 //BirdGame中添加方法action() 72 public void action() throws Exception { 73 MouseListener l=new MouseAdapter(){ 74 //Mouse 老鼠 Pressed按下 75 public void mousePressed( 76 MouseEvent e){ 77 //鸟向上飞扬 78 started=true; 79 bird.flappy(); 80 81 } 82 }; 83 //将l挂接到当前的面板(game)上 84 addMouseListener(l); 85 86 while(true){ 87 88 89 //计分逻辑 90 if(!gameOver||started){ 91 ground.step(); 92 column1.step(); 93 column2.step(); 94 bird.step(); 95 } 96 bird.fly(); 97 ground.step(); 98 99 if(bird.hit(ground) ||bird.hit(column1)||bird.hit(column2)){ 100 gameOver=true; 101 } 102 bird.fly(); 103 if (bird.x==column1.x||bird.x==column2.x){ 104 score++; 105 }repaint(); 106 107 Thread.sleep(1000/60); 108 } 109 } 110 111 /** 启动软件的方法 */ 112 public static void main(String[] args) 113 throws Exception { 114 JFrame frame = new JFrame(); 115 TestBirdFly game = new TestBirdFly(); 116 frame.add(game); 117 frame.setSize(440, 670); 118 frame.setLocationRelativeTo(null); 119 frame.setDefaultCloseOperation( 120 JFrame.EXIT_ON_CLOSE); 121 frame.setVisible(true); 122 game.action(); 123 } 124 } 125 /** 地面 */ 126 class Ground{ 127 BufferedImage image; 128 int x, y; 129 int width; 130 int height; 131 public Ground() throws Exception { 132 image = ImageIO.read( 133 getClass().getResource("ground.png")); 134 width = image.getWidth(); 135 height = image.getHeight(); 136 x = 0; 137 y = 500; 138 }//地面的构造器结束 139 //地面的类体中,添加方法,地面移动一步 140 public void step(){ 141 x--; 142 if(x==-109){ 143 x = 0; 144 } 145 } 146 }//地面类的结束 147 /** 柱子类型,x,y是柱子的中心点的位置 */ 148 class Column{ 149 BufferedImage image; 150 int x,y; 151 int width, height; 152 /** 柱子中间的缝隙 */ 153 int gap; 154 int distance;//距离,两个柱子之间的距离 155 Random random = new Random(); 156 /** 构造器:初始化数据,n代表第几个柱子 */ 157 public Column(int n) throws Exception { 158 image=ImageIO.read( 159 getClass().getResource("column.png")); 160 width = image.getWidth(); 161 height = image.getHeight(); 162 gap=144; 163 distance = 245; 164 x = 550+(n-1)*distance; 165 y = random.nextInt(218)+132; 166 } 167 //在Column中添加方法 step,在action调用此方法 168 public void step(){ 169 x--; 170 if(x==-width/2){ 171 x = distance * 2 - width/2; 172 y = random.nextInt(218)+132; 173 } 174 } 175 }//Column类的结束 176 /** 鸟类型, x,y是鸟类型中心的位置 */ 177 class Bird{ 178 BufferedImage image; 179 int x,y; 180 int width, height; 181 int size;//鸟的大小,用于碰撞检测 182 183 //在Bird类中增加属性,用于计算鸟的位置 184 double g;// 重力加速度 185 double t;// 两次位置的间隔时间 186 double v0;// 初始上抛速度 187 double speed;// 是当前的上抛速度 188 double s;// 是经过时间t以后的位移 189 double alpha;// 是鸟的倾角 弧度单位 190 //在Bird类中定义 191 //定义一组(数组)图片,是鸟的动画帧 192 BufferedImage[] images; 193 //是动画帧数组元素的下标位置 194 int index; 195 196 public Bird() throws Exception { 197 image=ImageIO.read( 198 getClass().getResource("0.png")); 199 width = image.getWidth(); 200 height = image.getHeight(); 201 x = 132; 202 y = 280; 203 size = 10; 204 g = 1; 205 v0 = 10; 206 t = 0.25; 207 speed = v0; 208 s = 0; 209 alpha=0; 210 //创建数组,创建8个元素的数组 211 //是8个空位置,没有图片对象, 212 //8个位置的序号: 0 1 2 3 4 5 6 7 213 images = new BufferedImage[8]; 214 for(int i=0; i<8; i++){ 215 //i = 0 1 2 3 4 5 6 7 216 images[i] = ImageIO.read( 217 getClass().getResource(i+".png")); 218 } 219 index = 0; 220 } 221 //在Bird中添加飞翔(fly)的代码 222 public void fly(){ 223 index++; 224 image = images[(index/12) % 8]; 225 } 226 //在Bird中添加鸟的移动方法 227 public void step(){ 228 double v0 = speed; 229 s = v0*t + g*t*t/2;//计算上抛运动位移 230 y = y-(int)s;//计算鸟的坐标位置 231 double v = v0 - g*t;//计算下次的速度 232 speed = v; 233 // if(y>=500){//如果到达地面,就重新抛起 234 // y = 280; 235 // speed = 35; 236 // } 237 //调用Java API提供的反正切函数,计算倾角 238 alpha = Math.atan(s/8); 239 } 240 //在Bird中添加方法 241 public void flappy(){ 242 //重新设置初始速度,重新向上飞 243 speed = v0; 244 } 245 //在鸟中添加方法hit 246 // 检测当前鸟是否碰到地面ground 247 //如果返回true表示发生碰撞 248 //否则返回false表示没有碰撞 249 250 251 public boolean hit (Ground ground){ 252 boolean hit =y+size/2>ground.y; 253 if(hit){ 254 y=ground.y-size/2; 255 256 } 257 return hit; 258 } 259 //检测当前鸟是否撞倒柱子 260 public boolean hit(Column column){ 261 //先检查是否在柱子的范围以内 262 if (x>column.x-column.width/2-size/2&&x<column 263 .x+column.width/2+size/2){ 264 if(y>column.y-column.gap/2+size/2&&y<column.y+column.gap/2-size/2){ 265 return false; 266 267 268 269 } 270 return true; 271 272 } 273 return false; 274 } 275 }
View Code
截图
源码下载
点击下载
转载于:https://www.cnblogs.com/ftl1012/p/flappyBird.html
Java实例---flappy-bird实例[最终版]相关推荐
- 阿里巴巴Java开发手册一周年最终版
阿里巴巴Java开发手册一周年最终版 摘要:阿里巴巴集团推出的<阿里巴巴Java开发手册>是阿里巴巴近万名开发同学集体智慧的结晶,以开发视角为中心,详细列举如何开发更加高效.更加容错.更加 ...
- java实现Flappy Bird游戏(附免费素材+代码+详细注解)
目录 前言 一.实现效果 二.实现代码 前言 该小游戏我设计成BackGroundView类(背景图).Bird类.Pipe类,Main类四部分 图片素材地址:https://download.csd ...
- flappy+bird+android源代码,Flappy Bird(安卓版)逆向分析(一)
更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的.打开/r ...
- 【新手上路】Java必备小游戏——Flappy Bird(飞翔的小鸟)
<飞翔的小鸟>是一款曾经比较火热的小游戏,本文可以带你你从零开始,一步一步的开发出这款小游戏.如果你只是刚入门java的新手,不用担心,只要你简单掌握了该游戏所需要的javase基础知识, ...
- Java并发编程最佳实例详解系列
Java并发编程最佳实例详解系列: Java并发编程(一)线程定义.状态和属性 Java并发编程(一)线程定义.状态和属性 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中, ...
- 【源码+图片素材】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java小游戏_Java初级项目_Java课程设计项目
开发环境: jdk1.8 开发工具: IDEA JavaEE基础: 变量.数据类型.判断语句.循环结构.数组.集合.简单窗口创建.图形图片绘制.双缓存技术.事件-键盘事件.物体的碰撞检测.File [ ...
- java 调用window程序_Windows下Java调用可执行文件代码实例
这篇文章主要介绍了Windows下Java调用可执行文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 缘起: 由于没有找到java转换文件 ...
- flappy bird java源码_android高仿flappy bird源码
[实例简介]android高仿flappy bird源码,可以在任何机型上完美运行,难度可以自己调整,适合新手,当做一个小项目练练手. [实例截图] [核心代码] package liqiang.fl ...
- Flappy Bird 一款C语言小游戏(图形优化版)(成功解决EasyX中putimage()未能实现第二张图片显示问题)
首先要下载EasyX库,如果网上找不到或者想要老版本的可以在评论区或者直接私信我 首先导入图片 #include<graphics.h> #include<conio.h>in ...
- java 界面实例,javagui界面实例
gui界面设计动态图实例,南宁UI设计培训学哪些知识,javagui界面设计实例,javagui界面实例 (整理)javaGUI开发初学经典案例._计算机软件及应用_IT/计算机_专业资... Jav ...
最新文章
- #1045 无法登录 MySQL 服务器 phpmyadmin
- NOIP2018 模拟 9.11
- 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t
- 2019牛客第八场A All-one Matrices(单调栈)
- 利用一维数组求菲波那契数列前40项的和并输出结果。_[W2D2]斐波那契数列
- volatile关键字的作用-适用场景
- jpg怎么转换成pdf?
- python语音转文字软件_免费的语音转文字电脑版软件-批量语音转文字小工具(不限时长)下载V1.1完全免费版-西西软件下载...
- windows开发机做路由器映射大坑
- 自定义文件格式注册和图标设置
- Cisco认证题库、中英文精选资料下载
- H3C交换机常用命令(初学)
- 【jquery事件】
- 一分钟让你知道黑白照片修复彩色软件有哪些?
- SCAU8579、SCAU8580、SCAU8581 链式表的基本操作
- 怎么卸载脚手架_脚手架施工方案钢丝绳卸载
- UniAccess Agent 的删除方法
- mongodb 服务器性能监控,mongodb监控 | mongodb数据库监控 - ManageEngine Applications Manager...
- ffmpeg 添加-bsf:a aac_adtstoasc 参数的方法
- 微信头像下载并上传到阿里云OSS,PHP文件上传到阿里云OSS简单代码(OSS文件上传,微信头像下载,CURL下载文件,微信头像链接过期)
热门文章
- php 去掉无关数据,php 读取 mysql 表中的double数据,去掉多余的0
- 电脑无法检查计算机更新,安装win7系统弹出错误提示无法检查更新的方法
- BigDecimal用法介绍
- java.sql.SQLException: null, message from server: “Host ‘xxx.xxx.xxx.xxx‘ is not allowed to
- Win1远程出现“这可能是由于credssp加密oracle修正”解决办法
- SpringBoot - 使用ExecutorService线程池执行异步任务教程(以Runnable任务为例)
- maven clean警告:The requested profile “pom.xml“ could not be activated because it does not exist
- 使用管理员账户远程连接WMQ7.5的“AMQ4036”错误
- RabbitMQ控制台队列标签的含义
- Android开发笔记(一百二十)两种侧滑布局