我们要做出这个样子的游戏

首先就要分析我们需要创建几个类,有鸟类、柱子类、地面类,然后就是游戏判定。我的思路就是,先创建这几个类,然后把这些类,对应的东西,画到游戏界面上,再确定游戏碰撞机制,当小鸟碰撞到地面和柱子的时候,就游戏结束。这就是游戏的整体思路。

接下来我们就要按照这个思路,编写代码。

一、游戏界面背景呈现

bg_image = ImageIO.read(BirdGame.class.getResource("bg.png"));

有了游戏界面背景,我们才能,继续编写。

二、柱子类

package com.flying.flybird_img;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Objects;/*** 柱子类*/
public class Column {private int x;//x 坐标private int y;//y 坐标private int width;//宽private int height;//高private BufferedImage image;//柱子图片private int gap = 144;//上下柱子间隙private int distanse = 266;//水平 两个柱子 距离private int min;//柱子 纵坐标 最小值private int max;//柱子 纵坐标 最大值/***构造方法 初始化成员变量*/public Column() throws IOException {this.x = BirdGame.GAME_WIDTH;//读取 本地图片资源 给 image 赋值image = ImageIO.read(Objects.requireNonNull(Ground.class.getResource("column.png")));this.width = image.getWidth();this.height = image.getHeight();min = -(height / 2 - gap / 2) + 40;//max = (BirdGame.HEIGHT - 146) - height / 2 - gap / 2;max = 498 - (height / 2 + gap / 2) - 40;y = (int) (Math.random() * (max - min) + min);}/*** 定义柱子上下移动的方法*/public void step() {x -= 1;//越界if (x < -width) {x = BirdGame.GAME_WIDTH;y = (int) (Math.random() * (max - min) + min);}}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public BufferedImage getImage() {return image;}public void setImage(BufferedImage image) {this.image = image;}public int getGap() {return gap;}public void setGap(int gap) {this.gap = gap;}public int getDistanse() {return distanse;}public void setDistanse(int distanse) {this.distanse = distanse;}}

三、地面类

package com.flying.flybird_img;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.Buffer;/*** 地面类*/
public class Ground {private int x;//x 坐标private int y;//y 坐标private int width;//宽private int height;//高private BufferedImage image;//地面图片/***构造方法 初始化成员变量*/public Ground() throws IOException {this.x = 0;this.y = 644 - 146;//读取 本地图片资源 给 image 赋值image = ImageIO.read(Ground.class.getResource("ground.png"));this.width = image.getWidth();this.height = image.getHeight();}/*** 定义地面走一步的方法*/public void step() {x -= 1;//越界if (x <= -(this.width - BirdGame.GAME_WIDTH)) {x = 0;}}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public BufferedImage getImage() {return image;}public void setImage(BufferedImage image) {this.image = image;}
}

四、鸟类

package com.flying.flybird_img;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;public class Bird {private int x;//x 坐标private int y;//y 坐标private int width;//宽private int height;//高private BufferedImage image;//鸟图片private BufferedImage[] images;//小鸟所有状态的图片private double h = 0;//垂直方向下落的距离private double g = 5;//重力加速度private double v = 0;//初速度private double t = 0.18;//下落时间/*** 构造方法 初始化成员变量*/public Bird() throws IOException {images = new BufferedImage[8];for (int i = 0; i < images.length; i++) {images[i] = ImageIO.read(Bird.class.getResource(i + ".png"));}//读取 本地图片资源 给 image 赋值image = images[0];this.width = image.getWidth();this.height = image.getHeight();this.x = 166;this.y = 222;}/*** 定义小鸟向上飞的方法*/public void up() {v = 10;}/*** 定义小鸟下降的方法*/public void down() {//小鸟 垂直方向 下落的距离v = v - g * t;h = v * t + g * t * t / 2;y -= h;}/*** 小鸟撞地面的方法** @param ground* @return*/public boolean hitGround(Ground ground) {return this.y + this.height >= ground.getY();}/*** 小鸟撞柱子的方法** @return*/public boolean hitColumn(Column c) {boolean b1 = this.x + this.width >= c.getX();boolean b2 = this.x <= c.getX() + c.getWidth();boolean b3 = this.y <= c.getY() + c.getHeight()/2 - c.getGap()/2;boolean b4 = this.y + this.height >= c.getY() + c.getHeight()/2 + c.getGap()/2;return b1 && b2 && (b3 || b4);}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}int index;public BufferedImage getImage() {return images[(index++) % images.length];}public void setImage(BufferedImage image) {this.image = image;}public BufferedImage[] getImages() {return images;}public void setImages(BufferedImage[] images) {this.images = images;}
}

五、游戏测试

柱子类、地面类、鸟类这三个类编写完成,就可以对游戏的主题进行编写。

package com.flying.flybird_img;// 哥们儿  借我窗口用一下
import com.flying.flybird_img.Bird;
import com.flying.flybird_img.Column;
import com.flying.flybird_img.Ground;import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;/***  游戏启动类*  同时充当  游戏的界面*  BirdGame 继承 JPanel 就具备了  面板的功能*  由于BirdGame  是我们自定义的,所以我们可以在BirdGame 这个面板上随意作画*/
public class BirdGame extends JPanel{// 定义游戏界面的  宽高public static final int GAME_WIDTH = 432;public static final int GAME_HEIGHT = 644;// 定义游戏状态public static final int GAME_START = 0;  // 开始状态public static final int GAME_RUNNING = 1; // 运行状态public static final int GAME_OVER = 2; // 结束状态// 表示游戏当前状态  默认是开始状态private int status = GAME_START;private BufferedImage bg_image ; // 游戏界面的背景private Ground ground ; // 地面对象private Column column1 ;private Column column2 ; // 柱子对象private Bird bird ; // 小鸟对象// 构造方法  初始化成员变量public BirdGame() throws IOException {bg_image = ImageIO.read(BirdGame.class.getResource("bg.png"));ground = new Ground();column1 = new Column();column2 = new Column();// 设置column2的 x   保证两根柱子水平间隔  244pxcolumn2.setX( column1.getX() + column2.getDistanse());bird = new Bird();}int i = 0;/*** 在画板上  绘制内容的方法* 希望画板上有什么东西  在paint方法中  绘制即可* @param g  画笔*/@Overridepublic void paint(Graphics g) {g.drawImage(bg_image , 0, 0 , null);//画背景paintColumn(g);// 画柱子if (status == GAME_OVER){g.drawImage(bird.getImages()[0], bird.getX() , bird.getY() , null);}else {paintBird(g);//画小鸟}paintGround(g);// 画地面switch (status){case GAME_START:paintStart(g);break;case GAME_OVER:paintGameOver(g);}String str = "分数 :";g.drawString(str+(i++/100),20,20);}private void paintGameOver(Graphics g) {try {BufferedImage gameover = ImageIO.read(BirdGame.class.getResource("gameover.png"));g.drawImage(gameover , 0 , 0 , null);} catch (IOException e) {e.printStackTrace();}}private void paintStart(Graphics g) {try {BufferedImage start = ImageIO.read(BirdGame.class.getResource("start.png"));g.drawImage(start , 0 , 0 , null);} catch (IOException e) {e.printStackTrace();}}// 画小鸟的方法private void paintBird(Graphics g) {g.drawImage(bird.getImage() , bird.getX() , bird.getY() , null);}// 画柱子的方法private void paintColumn(Graphics g) {g.drawImage(column1.getImage() , column1.getX() , column1.getY() , null); // 1号柱子g.drawImage(column2.getImage() , column2.getX() , column2.getY() , null); // 2号柱子}// 画地面的方法private void paintGround(Graphics g){g.drawImage(ground.getImage() , ground.getX() , ground.getY(), null);}//    游戏流程控制的总方法 : 即控制界面中 所有对象移动的方法public void action() throws InterruptedException {// 添加监听鼠标单击事件this.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {switch (status){case GAME_START:status = GAME_RUNNING; // 切换为运行状态break;case GAME_RUNNING:bird.up(); // 小鸟向上飞break;case GAME_OVER:status = GAME_START ;// 切换为开始状态try {bird =  new Bird();column1 = new Column();column2 = new Column();// 设置column2的 x   保证两根柱子水平间隔  244pxcolumn2.setX( column1.getX() + column2.getDistanse());} catch (IOException ex) {ex.printStackTrace();}}//                System.out.println("您单击了一次鼠标...");}});while (true){//根据游戏状态  控制对象的行为switch (status){case GAME_START:ground.step();// 地面移动break;case GAME_RUNNING:ground.step();// 地面移动column1.step();column2.step();// 柱子移动bird.down(); // 小鸟自由落体isGameOver(); // 检测游戏是否结束的方法}//重新绘制  即:调用paint()repaint();Thread.sleep(30);}}// 检测游戏是否结束 : 小鸟是否撞上了  地面 或者柱子private void isGameOver() {if (bird.hitGround(ground) || bird.hitColumn(column1) || bird.hitColumn(column2)){//说明撞上了  则将游戏状态设置  GAME_OVERstatus = GAME_OVER;}}//    程序的入口public static void main(String[] args) throws Exception {// 创建窗口对象JFrame frame = new JFrame();// 创建面板对象BirdGame game = new BirdGame();// 设置窗口的可见性  true表示显示在屏幕上frame.setVisible(true);// 设置宽高frame.setSize(GAME_WIDTH, GAME_HEIGHT);// 设置默认居中显示在屏幕上frame.setLocationRelativeTo(null);//固定窗口大小frame.setResizable(false);// 设置关闭窗口 同时退出程序frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 将面板game  放在窗口frame上frame.add(game);// 调用action()game.action();}
}

六、游戏展示

上图分别展示的是 游戏开始、游戏运行、游戏结束的三个场景。

Java小游戏------飞翔的小鸟相关推荐

  1. java小游戏——飞翔的小鸟(java初学作品)

    注:学习了java基础后,做出来的一个小作品,可以用来巩固学习 概述: 飞翔的小鸟能够作为Java基础的收官之作,包涵了Java很多的基础知识,在学习完Java基础后,尝试编写一些东西,能够起到很好的 ...

  2. java小游戏-飞翔的小鸟

    java小游戏-ava小游戏-飞翔的小鸟 1 游戏窗口的显示 2 游戏背景添加 3 背景颜色的添加 4 屏幕中绘制小鸟 5 实现小鸟上下移动 6 解决屏幕闪烁问题 7 云彩的添加与移动 8 云彩的自动 ...

  3. java小游戏 飞翔的小鸟,校园新手入门,分分钟带你玩转编程

    本课程讲解了飞翔的小鸟游戏的详细编写流程,即使你是刚入门java的新手,只要你简单掌握了该游戏所需要的javase基础知识,便可以跟随教程视频完成属于你自己的飞翔的小鸟游戏!同时还可以加深和巩固你对面 ...

  4. Java小游戏-飞翔小鸟

    摘 要 Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,Eclipse 附带了一个标准的插件集,包括J ...

  5. unity2D小游戏---飞翔的小鸟

    飞翔的小鸟 一.柱子的移动 二.小鸟的控制 三.游戏暂停开始 一.柱子的移动 1.制作柱子:新建空物体,包含上方柱子,下方柱子和空物体(用于计算得分) 2.给柱子和空物体加上适合大小的碰撞体 空物体需 ...

  6. java小游戏------Flappy Bird(飞翔的小鸟含源码)

    前言:本小游戏可作为java入门阶段收尾创作. 需:掌握面向对象的使用,了解多线程和异常处理等知识. 如上图所示:我们需要绘制背景,小鸟,障碍物,当然也包括游戏开始界面以及死亡界面. 一:思路解析: ...

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

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

  8. 【源码+图片素材】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java小游戏_Java初级项目_Java课程设计项目

    开发环境: jdk1.8 开发工具: IDEA JavaEE基础: 变量.数据类型.判断语句.循环结构.数组.集合.简单窗口创建.图形图片绘制.双缓存技术.事件-键盘事件.物体的碰撞检测.File [ ...

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

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

最新文章

  1. 配置中心Apollo的设计原理
  2. MVC-Razor(3)
  3. 题目1252:回文子串
  4. Qt动态多语言的实现(VS2012开发)
  5. 青蛙跳台(含变种)及汉诺塔递归,母牛生小牛
  6. Linux部署动态网页,linux构建动态WEB服务器安装篇
  7. Python爬虫批量下载糗事百科段子,怀念的天王盖地虎,小鸡炖蘑菇...
  8. go调用ffmpeg
  9. 几个经典的递归小程序
  10. 制药企业常用质量管理软件TrackWise概述
  11. 读《人工智能,李开复王咏刚》
  12. android音乐16bit,16bit音乐是无损吗
  13. 一级标题段前段后一行设置方法
  14. 【打一局王者荣耀掉星的时间,我制作了一款支持 重力感应 的 3D动态壁纸】
  15. UTONMOS数字藏品走红之后,为艺术打开了另一条路
  16. web前端 vue axios 网页设计
  17. 大卫 异星觉醒 机器人_《异星觉醒》披着科幻外衣的老套惊悚片
  18. 利用计算机审计新闻,计算机审计显身手 审计员钻出账本堆被审单位麻烦减少...
  19. paddleocr训练自己的数据最简单方式软件一键训练
  20. 【python爬虫实战】python3.7+selenium3.7 登录天眼查网站查询企业的公开信息

热门文章

  1. 3dsMax2022插件开发-对齐样条线中顶点的插件(英)
  2. 让你在ManjaroLinux下也能只用你喜欢的中文输入法
  3. Windows 微秒级 延时
  4. Uedit32-视图-查看方式(高亮),显示失效.
  5. ESP8266 NodeMcu机智云SOC方案开发经验分享
  6. vue根据对象id删除数组中的对象,实现局部刷新的功能
  7. nfc java_NFC 开发
  8. php简单的商城系统,DouPHP轻量级商城管理系统
  9. mysql获取中文拼音_mysql获取汉字拼音
  10. VC++解决Windows快捷方式图标不刷新问题(附源码)