import java.io.IOException;

import javax.swing.JFrame;

public class BirdDeom {

//这是主类用来启动JFrame

public static void main(String[] args) throws IOException{

JFrame jf=new JFrame();

//实例化窗口对象

BirdGame birdgame=new BirdGame();

//实例化BirdGame面板对象,这是自己写的一个继承JPanel的面板类,用来显示整个游戏

jf.add(birdgame);

//将面板加入窗口容器

jf.setSize(432,644);

//设置窗口大小为宽432,高644

jf.setLocationRelativeTo(null);

//窗口居中显示

jf.setVisible(true);

//显示窗口

birdgame.BirdAction();

//调用小鸟运动的游戏,这个方法用来实时改变游戏的状态

}

}

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.io.IOException;

import javax.imageio.ImageIO;

import javax.swing.JPanel;

//继承JPanel,由于原生的JPanel无法完成我们想要的功能

public class BirdGame extends JPanel {

BufferedImage bg,startImage,gameOverImage;

//创建背景,开始,结束的图片对象

Bird bird;

//创建小鸟对象

Column column1,column2;

//创建柱子对象

int score;

//创建分数

boolean startgame,gameover;

//创建开始结束的boolean值

Ground ground;

//创建地面对象

public BirdGame() throws IOException{

//构造方法,初始化各个参数

bg=ImageIO.read(getClass().getResource("bg.png"));

//实例化(读入)背景图片对象

startImage=ImageIO.read(getClass().getResource("start.png"));

//实例化(读入)开始图片对象

gameOverImage=ImageIO.read(getClass().getResource("gameover.png"));

//实例化(读入)结束图片对象

ground=new Ground();

//实例化地面对象

column1=new Column(1);

//实例化柱子对象1

column2=new Column(2);

//实例化柱子对象2

bird=new Bird();

//实例化小鸟对象

score=0;

//初始化

startgame=false;

//初始化开始游戏的booelan值

gameover=false;

//初始化结束游戏的值

}

@Override

public void paint(Graphics g) {

//绘图方法,继承过来的

g.drawImage(bg, 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);

//绘制两根柱子对象,这也说明其实我们只有两根柱子

Font f=new Font(Font.SANS_SERIF, Font.BOLD, 40);

//实例化一个字体对象

g.setFont(f);

//绘制的字的字体为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);

//绘制地面

Graphics2D g2=(Graphics2D)g;

//实例化一个g2的2d效果对象

g2.rotate(-bird.aphal, bird.x, bird.y);

//绘制小鸟的倾斜角度

g.drawImage(bird.image, bird.x-bird.width/2,bird.y-bird.height/2, null);

//绘制小鸟

g2.rotate(bird.aphal, bird.x, bird.y);

//配合上面的控制小鸟的倾斜角度

if(gameover){

//开始gameover为false所以不绘制结束的图像

g.drawImage(gameOverImage, 0, 0, null);

//从点(0,0)的地方开始绘制

}

if(!startgame){

//还没点击开始是为false所以先绘制开始状态的图片,覆盖上面的所有图片

g.drawImage(startImage, 0, 0,null);

//从点(0,0)的地方开始绘制

}

}

//小鸟游戏运动的最重要的方法

public void BirdAction() throws IOException{

MouseListener m=new MouseAdapter() {

//添加鼠标点击的监听事件

@Override

public void mousePressed(MouseEvent e) {

//触发事件

if(gameover){

//如果gameover为true说明游戏结束,重新初始化各个参数

try {

column1=new Column(1);

column2=new Column(2);//实例化两根柱子

bird=new Bird();//实例化小鸟对象

ground=new Ground();//实例化地面对象

startgame=false;//开始状态改为false重新回到最初的开始界面

gameover=false;//结束状态改为false

score=0;//分数重置为0

} catch (IOException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

}else{//如果结束boolean值为false,那么设置开始状态为true,点击小鸟就开始飞

startgame=true;

bird.hitfly();//小鸟的点击飞起方法

}

}

};

this.addMouseListener(m);

//添加鼠标点击监听事件

while(true){

//死循环

if(!gameover&&startgame){

//如果游戏开始了,且没有死,柱子地面开始自己运动,否则停止所有移动

ground.step();//地面运动方法

column1.step();//柱子运动的方法

column2.step();

bird.step();//小鸟运动的方法

bird.fly();//小鸟飞翔的方法,确定是否掉落到地面

if(bird.x==column1.x||bird.x==column2.x){

score++;

//如果过了一根柱子,分数就加1

}

}

synchronized(BirdGame.this){//同步

if(ground.higround(bird)||column1.hitColumn(bird)||column2.hitColumn(bird)){

gameover=true;

//如果掉落到地上游戏结束,触发结束图片显示,停止所有运动

}

}

repaint();

try {

Thread.sleep(1000/60);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

import java.awt.image.BufferedImage;

import java.io.IOException;

import javax.imageio.ImageIO;

//地面类

public class Ground {

BufferedImage image;

//创建地面图片

int x,y;

//定义图片的坐标

public Ground() throws IOException{

//构造方法初始化各参数

image=ImageIO.read(getClass().getResource("ground.png"));

//读取地面图片

x=0;

//初始化x坐标为0

y=500;

//初始化y坐标为500

}

public void step(){

//地面运动方法

x--;

if(x<=-108){

x=0;

}

}

public boolean higround(Bird bird){

//判断是否碰到地面方法

if(bird.y>=500-bird.width/2){

bird.aphal = -3.14159265358979323/2;

//改变为小鸟为垂直状态

return true;//撞击到地面

}

return false;

}

}

import java.awt.AlphaComposite;

import java.awt.image.BufferedImage;

import java.io.IOException;

import javax.imageio.ImageIO;

//小鸟类

public class Bird {

BufferedImage[] images;

//定义图片集

BufferedImage image;

//小鸟当前的图片

int x,y,index;

//小鸟当前坐标和图片的下标

int width,height;

//图片的宽度和高度

double v0,v,t;

//初始速度,实时速度,时间间隔

double g,s;

//重力加速度,运动距离

double aphal;

//小鸟图片倾斜角度

public Bird() throws IOException{

//构造方法初始化各个参数

index=0;

//第一张图片

images=new BufferedImage[8];

for(int i=0;i

//读取所有小鸟图片

images[i]=ImageIO.read(getClass().getResource(i+".png"));

}

//图片的宽度和高度

width=images[0].getWidth();

height=images[0].getHeight();

v0=20;

//促使速度为20

x=132;

y=250;

//坐标为(132,250)

g=4.5;

//重力加速度为4.5(因为9.8太快这里不适合,所以改小了)

t=0.25;

//时间间隔为0.25秒

s=0;

//初始运动距离

v=v0;

//吧初始速度给v(实时速度)

}

public void step(){

//小鸟展翅的效果方法,原理就是切换图片

index++;

image=images[index/8%8];

}

public void fly(){

//小鸟飞的方法

s=v*t-g*t*t/2;

//垂直的运动距离

v=v-g*t;

//实时速度,这是物理公式,实时速度等于初始速度-加速度*时间

y=(int)(y-s);

//算出小鸟的y坐标

aphal = Math.atan(s/8);

//算出倾角

if(y>=500-width/2){

y=500-width/2;

}

//如果掉到地上,就死

}

public void hitfly(){

//点击就飞,其实就是再给一个促使速度

v=20;

}

}

import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; //柱子类 public class Column {      BufferedImage image;      //创建图片对象      int x,y;      //定义柱子的坐标      int width,height;      //定义柱子的高度和宽度      int distance;      //柱子之间的距离      int gap;      //柱子之间的间隙      public Column(int n) throws IOException{     //构造方法,初始化各个参数     image=ImageIO.read(getClass().getResource("column.png"));     //读取柱子图片     distance=240;     //两根柱子之间的距离设置为240     gap=144;     //间隙设置为144     x=500+(n-1)*distance;     //柱子的x坐标,这里以图片中心的坐标为准     Random r=new Random();     //随机生成柱子的y坐标     y=40+gap/2+r.nextInt(460-gap/2-(40+gap/2));     //保证柱子在40+gap/2~460-gap/2     width=image.getWidth();     //获得柱子的宽度     height=image.getHeight();     //获得柱子的高度      }      public void step(){     //柱子运动     x--;     if(x<=-width/2){//当柱子移除界面     x=2*distance-width/2;//初始化下一次柱子的坐标     Random r=new Random();         y=40+gap/2+r.nextInt(460-gap/2-(40+gap/2));     }      }      public boolean hitColumn(Bird bird){     //小鸟是否闯到柱子     int x1=x-width/2-bird.width/2;//得x最小界限     int x2=x+width/2+bird.width/2;//得到x最大范围     int y1=y-gap/2+bird.height/2;//得到y的最小值     int y2=y+gap/2-bird.height/2;//得到y的最大值     //上述是在柱子之间的临界值     if(bird.x>x1&&bird.xy1&&bird.y

小鸟 java_java 飞翔小鸟源码相关推荐

  1. aqs clh java_Java并发包源码学习之AQS框架(二)CLH lock queue和自旋锁

    上一篇文章提到AQS是基于CLH lock queue,那么什么是CLH lock queue,说复杂很复杂说简单也简单, 所谓大道至简: CLH lock queue其实就是一个FIFO的队列,队列 ...

  2. 飞翔的小鸟java_java 飞翔的小鸟 小游戏源码

    [实例简介]小鸟躲避障碍物,以及计分. 游戏规则:只要鼠标 不断点击,小鸟就向上飞,不要小鸟碰到障碍物 为赢 [实例截图] [核心代码] package day06; import java.awt. ...

  3. 案例篇10—css3实现卡通小鸟效果(附源码)

    前言 随着前端技术的不断发展与进步,界面交互的样式要求和美感也越来越高,很多网页的交互都加上了css动画,这里作者给大家分享一个css3实现一个卡通小鸟效果,赶紧学起来吧,跟着本专栏尝试用css3做一 ...

  4. 用Python制作【小游戏合集】之小鸟管道游戏附源码啊~

    导语 哈喽小编今日发现自己已经大半个月没有写小游戏啦~对于喜欢[小游戏合集]的铁汁们 深感歉意! 于是小编连忙给大家补上这一期!

  5. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  6. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

  7. H5飞翔的小鸟游戏微信小程序源码

    Java SpringMVC+H5飞翔的小鸟游戏微信小程序源码 试验性质的一个微信小程序,用canvas做的一个类似flappy-bird的小游戏. 包含一些基本的功能:躲避障碍物.计分.排行榜等等. ...

  8. Java SpringMVC+H5飞翔的小鸟游戏微信小程序源码

    源码介绍 Java SpringMVC+H5飞翔的小鸟游戏微信小程序源码 试验性质的一个微信小程序,用canvas做的一个类似flappy-bird的小游戏. 包含一些基本的功能:躲避障碍物.计分.排 ...

  9. 【教程+源码】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏

    在飞翔的小鸟游戏中,玩家只需通过点击方向键操纵让小鸟避开绿色管道等障碍物即可继续前进.如果小鸟碰到管道,游戏立即结束. 那么如何用Java编写一款属于自己的飞翔的小鸟游戏呢?其过程并不复杂,本课程详细 ...

最新文章

  1. 中科院院士「修正」了麦克斯韦方程?研究发材料期刊,两度热搜,两极评价...
  2. 笔记·mybatis核心对象和全局配置文件
  3. apache2.4.x三种MPM介绍
  4. log4j无厘头异常
  5. 全新拟态个人主页/引导页源码
  6. Multivariate Linear Regression的参数估计
  7. xshell连不上虚拟机linux的解决办法
  8. codeforces #309 div1 D
  9. Zephyr:compatible ‘micro,wm89xx‘ has unknown vendor prefix ‘micro‘
  10. Spring Boot 之注解@Component @ConfigurationProperties(prefix = sms)
  11. Vue Echarts飞机航线图
  12. 【小程序源码】好玩多功能实用工具箱
  13. CryptoJS 加密
  14. codewars 7×7 Skyscrapers 问题解决
  15. bootstrap案例解析
  16. 【2021牛客暑期多校训练营7 】 xay loves count
  17. テクニカルアーティストに必要な資料集めようぜ!
  18. php lumen 框架优点,微框架Lumen 特性
  19. 【试算法题梳理】——二叉树
  20. JavaCV开发详解之3:通用拉流器实现,从流媒体服务器拉流rtsp/rtmp录制成视频文件

热门文章

  1. 笔记本联想(Lenovo)G40-70M加装内存和SSD固态硬盘
  2. 使用微搭低代码制作每日菜单小程序
  3. Python数据挖掘:利用聚类算法进行航空公司客户价值分析
  4. 【鸿蒙学院】鸿蒙(HarmonyOS)IDE迎来重大更新,新特性足以让你尖叫!
  5. 当下移动开发唱衰,iOS开发者如何才能涅槃重生?
  6. win10下的VMware还原网络设置,无法创建VMware网络适配器解决办法
  7. [360] 《如何保持电力接触网与受电弓亲密接触》
  8. ov5640帧率配置_vivo S7e游戏测试:三款热门游戏,帧率表现如何?
  9. Java1.8接口方法都是抽象,判断(1分) Java接口中所有的方法都是抽象的。
  10. 分享淘宝的IP地址库查询接口