代码分析

解析版: Java实例---flappy-bird实例解析

完整版:

TestBirdFly.java

 package testfly;

 import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.util.Random; import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TestBirdFly extends JPanel {
Bird bird;
Column column1, column2;
Ground ground;
BufferedImage background;
boolean gameOver;
boolean started;
BufferedImage gameoverImg;
//分数
int score;
/** 初始化 BirdGame 的属性变量 */
public TestBirdFly() throws Exception {
score = 0;
bird = new Bird();
column1 = new Column(1);
column2 = new Column(2);
ground = new Ground();
gameOver=false;
background = ImageIO.read(
getClass().getResource("bg.png"));
gameoverImg= ImageIO.read(
getClass().getResource("gameover.png"));
} /** "重写(修改)"paint方法实现绘制 */
public void paint(Graphics g){
g.drawImage(background, 0, 0, null);
g.drawImage(column1.image,
column1.x-column1.width/2,
column1.y-column1.height/2, null);
g.drawImage(column2.image,
column2.x-column2.width/2,
column2.y-column2.height/2, null);
//在paint方法中添加绘制分数的算法
Font f = new Font(Font.SANS_SERIF,
Font.BOLD, 40);
g.setFont(f);
g.drawString(""+score, 40, 60);
g.setColor(Color.WHITE);
g.drawString(""+score, 40-3, 60-3); g.drawImage(ground.image, ground.x,
ground.y, null);
if (gameOver){
g.drawImage(gameoverImg,0,0,null);
return;
}
//旋转(rotate)绘图坐标系,是API方法
Graphics2D g2 = (Graphics2D)g;
g2.rotate(-bird.alpha, bird.x, bird.y);
g.drawImage(bird.image,
bird.x-bird.width/2,
bird.y-bird.height/2, null);
g2.rotate(bird.alpha, bird.x, bird.y);
}//paint方法的结束
//BirdGame中添加方法action()
public void action() throws Exception {
MouseListener l=new MouseAdapter(){
//Mouse 老鼠 Pressed按下
public void mousePressed(
MouseEvent e){
//鸟向上飞扬
started=true;
bird.flappy(); }
};
//将l挂接到当前的面板(game)上
addMouseListener(l); while(true){ //计分逻辑
if(!gameOver||started){
ground.step();
column1.step();
column2.step();
bird.step();
}
bird.fly();
ground.step(); if(bird.hit(ground) ||bird.hit(column1)||bird.hit(column2)){
gameOver=true;
}
bird.fly();
if (bird.x==column1.x||bird.x==column2.x){
score++;
}repaint(); Thread.sleep(1000/60);
}
} /** 启动软件的方法 */
public static void main(String[] args)
throws Exception {
JFrame frame = new JFrame();
TestBirdFly game = new TestBirdFly();
frame.add(game);
frame.setSize(440, 670);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
game.action();
}
}
/** 地面 */
class Ground{
BufferedImage image;
int x, y;
int width;
int height;
public Ground() throws Exception {
image = ImageIO.read(
getClass().getResource("ground.png"));
width = image.getWidth();
height = image.getHeight();
x = 0;
y = 500;
}//地面的构造器结束
//地面的类体中,添加方法,地面移动一步
public void step(){
x--;
if(x==-109){
x = 0;
}
}
}//地面类的结束
/** 柱子类型,x,y是柱子的中心点的位置 */
class Column{
BufferedImage image;
int x,y;
int width, height;
/** 柱子中间的缝隙 */
int gap;
int distance;//距离,两个柱子之间的距离
Random random = new Random();
/** 构造器:初始化数据,n代表第几个柱子 */
public Column(int n) throws Exception {
image=ImageIO.read(
getClass().getResource("column.png"));
width = image.getWidth();
height = image.getHeight();
gap=144;
distance = 245;
x = 550+(n-1)*distance;
y = random.nextInt(218)+132;
}
//在Column中添加方法 step,在action调用此方法
public void step(){
x--;
if(x==-width/2){
x = distance * 2 - width/2;
y = random.nextInt(218)+132;
}
}
}//Column类的结束
/** 鸟类型, x,y是鸟类型中心的位置 */
class Bird{
BufferedImage image;
int x,y;
int width, height;
int size;//鸟的大小,用于碰撞检测 //在Bird类中增加属性,用于计算鸟的位置
double g;// 重力加速度
double t;// 两次位置的间隔时间
double v0;// 初始上抛速度
double speed;// 是当前的上抛速度
double s;// 是经过时间t以后的位移
double alpha;// 是鸟的倾角 弧度单位
//在Bird类中定义
//定义一组(数组)图片,是鸟的动画帧
BufferedImage[] images;
//是动画帧数组元素的下标位置
int index; public Bird() throws Exception {
image=ImageIO.read(
getClass().getResource("0.png"));
width = image.getWidth();
height = image.getHeight();
x = 132;
y = 280;
size = 10;
g = 1;
v0 = 10;
t = 0.25;
speed = v0;
s = 0;
alpha=0;
//创建数组,创建8个元素的数组
//是8个空位置,没有图片对象,
//8个位置的序号: 0 1 2 3 4 5 6 7
images = new BufferedImage[8];
for(int i=0; i<8; i++){
//i = 0 1 2 3 4 5 6 7
images[i] = ImageIO.read(
getClass().getResource(i+".png"));
}
index = 0;
}
//在Bird中添加飞翔(fly)的代码
public void fly(){
index++;
image = images[(index/12) % 8];
}
//在Bird中添加鸟的移动方法
public void step(){
double v0 = speed;
s = v0*t + g*t*t/2;//计算上抛运动位移
y = y-(int)s;//计算鸟的坐标位置
double v = v0 - g*t;//计算下次的速度
speed = v;
// if(y>=500){//如果到达地面,就重新抛起
// y = 280;
// speed = 35;
// }
//调用Java API提供的反正切函数,计算倾角
alpha = Math.atan(s/8);
}
//在Bird中添加方法
public void flappy(){
//重新设置初始速度,重新向上飞
speed = v0;
}
//在鸟中添加方法hit
// 检测当前鸟是否碰到地面ground
//如果返回true表示发生碰撞
//否则返回false表示没有碰撞 public boolean hit (Ground ground){
boolean hit =y+size/2>ground.y;
if(hit){
y=ground.y-size/2; }
return hit;
}
//检测当前鸟是否撞倒柱子
public boolean hit(Column column){
//先检查是否在柱子的范围以内
if (x>column.x-column.width/2-size/2&&x<column
.x+column.width/2+size/2){
if(y>column.y-column.gap/2+size/2&&y<column.y+column.gap/2-size/2){
return false; }
return true; }
return false;
}
}

截图

源码下载

点击下载

Java实例---flappy-bird实例[最终版]的更多相关文章

  1. java邮件工具类【最终版】

    http://www.xdemo.org/java-mail/ 对比链接中,添加了抄送和暗抄送功能(已解决,如图代码:抄送不能多个用户,会报错,未解之谜) sendHtmlmail方法可以发送附件以及 ...

  2. Java变量类型,实例变量 与局部变量 静态变量

    实例变量: 实例变量在类中声明,但在方法的外面,构造函数或任何块. 当空间分配给某个对象在堆中,插槽为每个实例变量创建值. 当一个对象与使用关键字 “new” 来创建,在对象被销毁销毁创建的实例变量. ...

  3. 教你从头到尾利用DQN自动玩flappy bird(全程命令提示,GPU+CPU版)【转】

    转自:http://blog.csdn.net/v_JULY_v/article/details/52810219?locationNum=3&fps=1 目录(?)[-] 教你从头到尾利用D ...

  4. C语言版flappy bird黑白框游戏

    在此记录下本人在大一暑假,2014.6~8这段时间复习C语言,随手编的一个模仿之前很火热的小游戏----flappy bird.代码bug基本被我找光了,如果有哪位兄弟找到其他的就帮我留言下吧,谢谢了 ...

  5. 也来山寨一版Flappy Bird (js版)

    随着Flappy Bird的火爆,各种实现的版也不断出现,于是也手痒简单实现了一版. 其实本来只是想实现一下这只笨鸟的飞翔运动的,后来没忍住,就直接实现一个完整游戏了…… 因为这个游戏本身实现起来就没 ...

  6. Flex通信-与Java实现Socket通信实例

    Flex通信-与Java实现Socket通信实例  转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...

  7. Java的位运算符实例——与(&)、非(~)、或(|)、异或(^)

    一.Java的位运算符实例——与(&).非(~).或(|).异或(^) 1.与(&) 0 & 2 = 0 0 0 0 0 1 0 0 1 0 2.非(~) ~0 = 7 0 0 ...

  8. Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本?

    ylbtech-Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本? 1.返回顶部 1. Java 实例 - 如何查看当前 Java 运行 ...

  9. Java-Runoob-高级教程-实例-环境设置实例:3.Java 实例 - 如何执行指定class文件目录(classpath)?

    ylbtech-Java-Runoob-高级教程-实例-环境设置实例:3.Java 实例 - 如何执行指定class文件目录(classpath)? 1.返回顶部 1. Java 实例 - 如何执行指 ...

  10. Java-Runoob-高级教程-实例-环境设置实例:2.Java 实例 – Java 如何运行一个编译过的类文件?

    ylbtech-Java-Runoob-高级教程-实例-环境设置实例:2.Java 实例 – Java 如何运行一个编译过的类文件? 1.返回顶部 1. Java 实例 - 如何执行编译过 Java ...

随机推荐

  1. IDEA Maven Mybatis generator 自动生成代码

    IDEA Maven Mybatis generator 自动生成代码 一.安装配置maven以及在Idea中配置maven 安装过程步骤可以看上面的博文,里面介绍得很详细. 二.建数据表 DROP ...

  2. 用maven来创建scala和java项目代码环境(图文详解)(Intellij IDEA(Ultimate版本)、Intellij IDEA(Community版本)和Scala IDEA for Eclipse皆适用)(博主推荐)

    不多说,直接上干货! 为什么要写这篇博客? 首先,对于spark项目,强烈建议搭建,用Intellij IDEA(Ultimate版本),如果你还有另所爱好尝试Scala IDEA for Eclip ...

  3. mysql8安装配置备忘

    Mysql8安装配置 1. 初始化 进入mysql安装目录中的bin目录,在cmd中输入: mysqld --initialize --console 加上--console参数可以看到初始化之后的默 ...

  4. 【转】winform程序textbox滚动条保持在最下面 内容不闪烁

    在开发winform程序时,会用到textbox控件来显示信息,当把textbox的Multiline属性改为Ture时(即多行显示状态),ScrollBars属性改为Vertical(内容过多时,显 ...

  5. PictureBox控件

    PictureBox控件可以显示来自位图.图标或者元文件,以及来自增强的元文件.JPEG.GIF文件的图形,如果控件不足以显示整幅图像,则裁剪图像以适应控件的大小. Sizemode 图片的大小方式 ...

  6. jQuery 关于ajaxfileupload.js插件的逐步解析(ajaxfileupload.js第二弹)

    如果你看了上一篇<ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)>的话,应该就知道我是逼不得已要认真学 ...

  7. ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)

    在写这篇的时候本来想把标题直接写成报错的提示,如下: “SecurityError:Blocked a frame with origin "http://localhost:55080&q ...

  8. 一:SpringCloud

    一:前提知识+相关说明 前提知识:springmvc+spring/springboot+mybatis+maven+git...... cloud技术的五大神兽: 面试题: 什么是微服务? 微服务之 ...

  9. 自定义Jquery插件——由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件

    由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件下面是代码: // 掉用方式支持 $('select').textBeauty(1 ...

  10. 借助 Filter 生成静态页面缓存问题

    如果有些 jsp 页面,在一次 jsp 页面生成后 html 后, 就不太可能需要更新.可以使用缓存机制来解决这个问题. 解决思路如下 1.  定义一个文件夹 pagestaticize,用来存放 j ...