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实例[最终版]的更多相关文章
- java邮件工具类【最终版】
http://www.xdemo.org/java-mail/ 对比链接中,添加了抄送和暗抄送功能(已解决,如图代码:抄送不能多个用户,会报错,未解之谜) sendHtmlmail方法可以发送附件以及 ...
- Java变量类型,实例变量 与局部变量 静态变量
实例变量: 实例变量在类中声明,但在方法的外面,构造函数或任何块. 当空间分配给某个对象在堆中,插槽为每个实例变量创建值. 当一个对象与使用关键字 “new” 来创建,在对象被销毁销毁创建的实例变量. ...
- 教你从头到尾利用DQN自动玩flappy bird(全程命令提示,GPU+CPU版)【转】
转自:http://blog.csdn.net/v_JULY_v/article/details/52810219?locationNum=3&fps=1 目录(?)[-] 教你从头到尾利用D ...
- C语言版flappy bird黑白框游戏
在此记录下本人在大一暑假,2014.6~8这段时间复习C语言,随手编的一个模仿之前很火热的小游戏----flappy bird.代码bug基本被我找光了,如果有哪位兄弟找到其他的就帮我留言下吧,谢谢了 ...
- 也来山寨一版Flappy Bird (js版)
随着Flappy Bird的火爆,各种实现的版也不断出现,于是也手痒简单实现了一版. 其实本来只是想实现一下这只笨鸟的飞翔运动的,后来没忍住,就直接实现一个完整游戏了…… 因为这个游戏本身实现起来就没 ...
- Flex通信-与Java实现Socket通信实例
Flex通信-与Java实现Socket通信实例 转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...
- Java的位运算符实例——与(&)、非(~)、或(|)、异或(^)
一.Java的位运算符实例——与(&).非(~).或(|).异或(^) 1.与(&) 0 & 2 = 0 0 0 0 0 1 0 0 1 0 2.非(~) ~0 = 7 0 0 ...
- Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本?
ylbtech-Java-Runoob-高级教程-实例-环境设置实例:4.Java 实例 – 如何查看当前 Java 运行的版本? 1.返回顶部 1. Java 实例 - 如何查看当前 Java 运行 ...
- Java-Runoob-高级教程-实例-环境设置实例:3.Java 实例 - 如何执行指定class文件目录(classpath)?
ylbtech-Java-Runoob-高级教程-实例-环境设置实例:3.Java 实例 - 如何执行指定class文件目录(classpath)? 1.返回顶部 1. Java 实例 - 如何执行指 ...
- Java-Runoob-高级教程-实例-环境设置实例:2.Java 实例 – Java 如何运行一个编译过的类文件?
ylbtech-Java-Runoob-高级教程-实例-环境设置实例:2.Java 实例 – Java 如何运行一个编译过的类文件? 1.返回顶部 1. Java 实例 - 如何执行编译过 Java ...
随机推荐
- IDEA Maven Mybatis generator 自动生成代码
IDEA Maven Mybatis generator 自动生成代码 一.安装配置maven以及在Idea中配置maven 安装过程步骤可以看上面的博文,里面介绍得很详细. 二.建数据表 DROP ...
- 用maven来创建scala和java项目代码环境(图文详解)(Intellij IDEA(Ultimate版本)、Intellij IDEA(Community版本)和Scala IDEA for Eclipse皆适用)(博主推荐)
不多说,直接上干货! 为什么要写这篇博客? 首先,对于spark项目,强烈建议搭建,用Intellij IDEA(Ultimate版本),如果你还有另所爱好尝试Scala IDEA for Eclip ...
- mysql8安装配置备忘
Mysql8安装配置 1. 初始化 进入mysql安装目录中的bin目录,在cmd中输入: mysqld --initialize --console 加上--console参数可以看到初始化之后的默 ...
- 【转】winform程序textbox滚动条保持在最下面 内容不闪烁
在开发winform程序时,会用到textbox控件来显示信息,当把textbox的Multiline属性改为Ture时(即多行显示状态),ScrollBars属性改为Vertical(内容过多时,显 ...
- PictureBox控件
PictureBox控件可以显示来自位图.图标或者元文件,以及来自增强的元文件.JPEG.GIF文件的图形,如果控件不足以显示整幅图像,则裁剪图像以适应控件的大小. Sizemode 图片的大小方式 ...
- jQuery 关于ajaxfileupload.js插件的逐步解析(ajaxfileupload.js第二弹)
如果你看了上一篇<ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)>的话,应该就知道我是逼不得已要认真学 ...
- ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)
在写这篇的时候本来想把标题直接写成报错的提示,如下: “SecurityError:Blocked a frame with origin "http://localhost:55080&q ...
- 一:SpringCloud
一:前提知识+相关说明 前提知识:springmvc+spring/springboot+mybatis+maven+git...... cloud技术的五大神兽: 面试题: 什么是微服务? 微服务之 ...
- 自定义Jquery插件——由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件
由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件下面是代码: // 掉用方式支持 $('select').textBeauty(1 ...
- 借助 Filter 生成静态页面缓存问题
如果有些 jsp 页面,在一次 jsp 页面生成后 html 后, 就不太可能需要更新.可以使用缓存机制来解决这个问题. 解决思路如下 1. 定义一个文件夹 pagestaticize,用来存放 j ...