Java小游戏之飞翔的小鸟
Java小游戏之飞翔的小鸟
大家好,今天给大家带来一个Java经典小游戏—飞翔的小鸟。鉴于小博主初学,文章不足之处,还请见谅。
开发目录
- Java小游戏之飞翔的小鸟
- 一、所用知识
- 二、开发工具
- 三、开发过程
- 四、 素材与源码打包
- 五、 结语
一、所用知识
- JFrame
- 线程
二、开发工具
- myeclipse
- jdk 1.8
三、开发过程
- 创建项目
- 右键—new—Java Project
- 为项目起个名字flappybird
- 导入素材
- 右键项目—new—Package包
- 把包命名为img,用来存放素材
- 将素材图片全部粘贴到img包里
- 素材一览
3. 窗体设计
(1) 创建JFrame容器
- 右键项目—new—Package包,命名为ui
- 右键ui包—new----class,新建一个类,命名为GameFrame
public class GameFrame extends JFrame{public GameFrame(){//设置窗体标题this.setTitle("飞翔的小鸟");//设置窗体大小this.setSize(432, 644);//设置窗体居中this.setLocationRelativeTo(null);//不允许用户改变窗体大小this.setResizable(false);//关闭窗体的同时关闭程序this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {GameFrame frame = new GameFrame();frame.setVisible(true);}
}
(2) 在进行其他操作之前,我们可以想一下,素材图片这么多,我们不能每次都要写一大串的io代码吧,本着能省就省的原则,我们定一个工具类GameUtil,专门用来读取图片。
public class ImageUtil {//添加读取指定路径下的图片方法(给洗衣机添加洗衣服的功能)//path 需要读取图片的路径(相当于将衣服丢入洗衣机中)//如果不写下面的方法,每传输一张图片就要执行一次try……public static BufferedImage getImg(String path){try {//尝试根据地址找到图片BufferedImage img=ImageIO.read(ImageUtil.class.getResource(path));//如果找到,就返回图片return img;} catch (IOException e) {// TODO Auto-generated catch block//如果找不到,就捕获找不到的原因,并将其输出出来e.printStackTrace();}//把图片变成流return null;}
}
这样的话,如果需要读取图片,仅需要调用该工具类的getImg方法即可。
- 在GameFrame中用新创建额工具类设置窗体图标。
//获取图标图片BufferedImage icon=FlayUtil.getImg("/img/0.png");//将图标图片设置成窗体图标this.setIconImage(icon);
(3) 创建JPanel容器
- 用来存放诸多控件
- 可以把JFrame当成一张桌子,把JPanel当成一个盘子,把控件当成菜,我们总不能直接把菜倒到桌子上吧。
-右键ui包—new----class,新建一个类,命名为GamePanel,我们先把背景图加载出来,代码如下:
package ui;
import java.awt.Graphics;
import java.awt.image.BufferedImage;import javax.swing.JPanel;
public class GamePanel extends JPanel{GameFrame fr;//定义背景图片BufferedImage bg;public GamePanel(GameFrame frame) {// TODO Auto-generated constructor stubthis.fr = frame;bg = GameUtil.getImg("/img/bg.png");}public void paint(Graphics g) {// TODO Auto-generated method stubsuper.paint(g);//画背景图片g.drawImage(bg, 0, 0, null);}
}
效果如下:
(4) 窗体基本上就搭建好了,下一步我们要做的就是加载地面图片,并让它动起来。
- 首先定义一个地面类Ground,用来定地面的属性和方法。代码如下:
package ui;import java.awt.image.BufferedImage;/*** 地面类* 注释方法:1./** 2.shift+alt+j* @author Lenovo**/
public class Ground {//定义地面的横坐标纵坐标int x;int y;//定义地面的宽高int w;int h;BufferedImage img;//地面的构造器,用来构造一个地面对象public Ground(){//在此处双击,可以选中括号中所有内容//地面图片img=GameUtil.getImg("/img/ground.png");w=img.getWidth();h=img.getHeight();x=0;y=644-h;}
}
- 像画背景的步骤一样,在GamePanel中把地面画出来。代码如下:
package ui;
import java.awt.Graphics;
import java.awt.image.BufferedImage;import javax.swing.JPanel;
public class GamePanel extends JPanel{GameFrame fr;//定义背景图片BufferedImage bg;Ground ground;public GamePanel(GameFrame frame) {// TODO Auto-generated constructor stubthis.fr = frame;bg = GameUtil.getImg("/img/bg.png");//初始化地面类对象,这样就可以引用ground中的属性和方法了ground = new Ground();}public void paint(Graphics g) {// TODO Auto-generated method stubsuper.paint(g);//画背景图片g.drawImage(bg, 0, 0, null);//画地面g.drawImage(ground.img,ground.x,ground.y,null);//不设置宽高,默认为图片原始尺寸}
}
- 此时地面图片已经加载出来了,下一步我们要做的就是让它动起来。
- 在Ground类中创建一个move方法,负责地面的移动。
//地面移动的方法public void move(){//访问修饰符 返回值类型 方法名x=x-2;//越界问题if(x<=-(w-432)){//1.地面图片比窗体的宽度要大。//2.当地面图片右侧移动到窗体右侧时,让地面图片横坐标归零x=0;}}
- 在GamePanel中创建一个线程,在GameFrame中调用上面的方法,真正让地面动起来。代码如下:
//游戏开始的方法public void action(){new Thread(){public void run() {while(true){//让地面一直移动ground.move();//线程休眠时间try {Thread.sleep(20);//图片已经改动位置,因此要重画显示效果repaint();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}.start();}
(5) 创建柱子对象,用来当做障碍物。
- 首先定义一个柱子类Column,用来定义柱子的属性和方法。代码如下:
package ui;import java.awt.image.BufferedImage;
import java.util.Random;/**柱子类* * @author Lenovo**/
public class Column {//柱子的图片BufferedImage img;//柱子的横纵坐标int x;int y;//柱子的宽高int w;int h;//柱子间距int distance;Random rd = new Random();public Column(int i){img=FlayUtil.getImg("/img/column.png");//建议y在-400到-250之间w=img.getWidth();h=img.getHeight();distance=300;x=400+distance*(i-1);y=-(rd.nextInt(150)+250);// y=rd.nextDouble(-151)-250;}
}
- 在GamePanel中定义柱子对象,并初始化。
//定义柱子1Column column1;//由于同一画面中可能会出现两根柱子,因此我们定义两个柱子对象Column column2;
//初始化柱子1对象column1 = new Column(1);//初始化柱子2对象column2 = new Column(2);
- 在GamePanel的paint方法中画出柱子。
- 注:画柱子的代码要写在画地面的代码之后,否则地面图片将无法将多余的柱子图片覆盖。
//画柱子1g.drawImage(column1.img, column1.x, column1.y, column1.w, column1.h, null);//画柱子2g.drawImage(column2.img, column2.x, column2.y, column2.w, column2.h, null);
- 在Ground类中定义move方法,并在GamePanel的线程中调用(调用代码略)。让柱子移动起来,move方法代码如下:
//柱子移动的方法
public void move(){x=x-2;if(x<=-w){x=300+distance;y=-(rd.nextInt(150)+250);}}
(6)创建一个小鸟对象。
- 新建一个小鸟类Bird,用来定义小鸟的属性和方法。代码如下:
package ui;import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;/*** 小鸟类* @author Lenovo**/
public class Bird {//小鸟的横纵坐标int x;int y;//小鸟的宽高int w;int h;BufferedImage img;int index=0;//List<BufferedImage> animation = new ArrayList();//初速度double v0;//时间间隔(往上移动的时间)double t;//距离double s;//重力double g;Ground ground = new Ground();public Bird(){img=GameUtil.getImg("/img/0.png");w=img.getWidth()*2/3;h=img.getHeight()*2/3;x=200;y=200;v0=3;t=0.2;s=0;g=5;}
}
- 在GamePanel中定义柱子对象,并初始化。
//定义小鸟类Bird bird;
//初始化小鸟对象bird = new Bird();
- 在GamePanel的paint方法中画出小鸟。
//画小鸟g.drawImage(bird.img,bird.x,bird.y,bird.w,bird.h,null);
- 在GamePanel中添加键盘监听事件,通过键盘的空格键来控制小鸟上抛。
//键盘监听// TODO Auto-generated method stubKeyAdapter adapter = new KeyAdapter(){public void keyPressed(java.awt.event.KeyEvent e) {int keyCode = e.getKeyCode();//按下空格键if(keyCode==32){//小鸟上抛System.out.println("123");bird.moveUp();}//按Ctrl键,游戏重新开始}}; fr.addKeyListener(adapter);}
- 在Bird类中定义fly方法(让小鸟实现飞翔效果)、move方法(小鸟做落体运动)、moveUp方法(键盘调用的小鸟上抛运动)、bang方法(小鸟撞到窗体顶部或底部)、beng方法(小鸟撞到柱子)。代码如下:
//加载多张小鸟图片,让小鸟实现飞翔效果int step_num=0;public void fly(){index++;if(index>5){step_num++;img=FlayUtil.getImg("/img/"+step_num%8+".png");w=img.getWidth()*2/3;h=img.getHeight()*2/3;index=0;}}
//小鸟的落体运动public void move(){//计算小鸟上抛的距离 距离等于速度×时间s = v0*t;//得到小鸟上抛到最高点时的坐标y=y-(int)s;//s为double类型,y为int类型,类型不匹配,因此要做强制类型转换//计算小鸟到达最高点时的速度double v2 = v0-g*t;//最高点的速度就是小鸟下落时的初速度v0 = v2;}
//小鸟上抛public void moveUp(){v0=20;}
//撞到窗体顶部或底部public Boolean bang() {// TODO Auto-generated method stubif((y<0)||(y+h>644-ground.h)){return true;}//没撞到return false;}
//小鸟和柱子碰撞public Boolean beng(Column column){if((x>column.x-w && x<column.x+column.w) &&//鸟的宽进入柱子宽的范围((y>column.y+column.h-526-h)||(y<column.y+526))){//鸟的高不在安全区的范围return true;}return false;}
- 在GamePanel的线程中调用这些方法。
//加载鸟飞的动画bird.fly();//小鸟做落体运动bird.move();//小鸟和柱子相撞Boolean boo1 = bird.beng(column1);Boolean boo2 = bird.beng(column2);if(bird.bang()||boo1||boo2){//游戏窗体类对象全部静止//结束当前循环break;}
(7) 设置分数与关卡数。游戏规则:每过一根柱子分数便+1,每过10根柱子关卡数便+1,每次关卡升级,游戏速度加快。
- 在FlayPanel中定义分数和关卡变量。
//定义分数int fraction=0;//定义关卡数int level=1;
- 在线程中判断小鸟是否飞过柱子,并设置分数与关卡数的值。
//判断小鸟是否飞过柱子
if(bird.x==column1.x+column1.w || bird.x==column2.x+column2.w){fraction++;//给关卡属赋值,每过10根柱子关卡数便+1level=(fraction/10)+1;
}
- 更改休眠时间
Thread.sleep(11-level);
- 在paint方法中画出分数和关卡数。
//画分数g.setColor(Color.red);Font f = new Font("宋体",Font.BOLD,20);g.setFont(f);g.drawString("分数:"+fraction, 120, 30);g.drawString("关卡数:"+level,20,30);
(8) 添加控制游戏(线程)开始和结束以及重新开始游戏的代码,由于代码位置过于琐碎,因此小博主只将思路简单概括出来,详细代码见下方链接。
- 定义开始(start)与结束(gmov)图片,并初始化。
- 定义一布尔变量show,用来决定游戏是否开始以及是否显示开始(start)图片,设置初始值为true。
- paint方法中添加一if判断条件,当show=true时,画出游戏开始图片。
- 定义一布尔变量gameover,用来决定游戏是否结束以及是否显示结束(gmov)图片,设置初始值为false。
- paint方法中添加一if判断条件,当gameover=true时,画出游戏结束图片。
- 键盘监听事件中添加一if判断条件,当KeyCode=17(按下Ctrl键)且gameover=true(游戏已经结束)时,重新开始游戏:重置柱子、地面、小鸟对象,将start的值设置成true、gameover值设置成false,调用action方法。
- 键盘监听事件中添加一if判断条件,在按下空格键开始游戏之后,如果show=true时(显示开始图片),让show=false。这样既能在开始游戏之后不再显示开始图片,又能使用空格键操控小鸟上抛。
- 在线程的while(true)死循环下添加一个if条件,当show=false,即按下空格键开始游戏之后才实现地面柱子等移动。
至此,飞翔的小鸟已基本完成。
四、 素材与源码打包
网盘链接:https://pan.baidu.com/s/1KSd8dX4oVmYPJusd6RN0Pg
提取码:bxmd
五、 结语
小博主才疏学浅,文章有不足之处,还请各位见谅,有不足之处,万望指出。整理素材、图文排版实属不易,请各位大牛们嘴下留情,我以诚待诸君,望诸君以诚待我。
Java小游戏之飞翔的小鸟相关推荐
- 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇
马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...
- 纪念自己编写的第一个java小游戏,飞翔小鸟
我是一名Java初学者 这是我写的第一个小游戏,特此纪念下 -------------------------------------------------------- 效果图: -------- ...
- C语言跳过障碍物小游戏,html5飞翔的小鸟越过障碍物小游戏代码
一款简单好玩的html5 canvas飞翔的小鸟越过障碍物小游戏代码,玩法:点击鼠标控制小鸟飞行. 查看演示 下载资源: 11 次 下载资源 下载积分: 30 积分 js代码 var cvs = do ...
- 【Java实现小游戏】飞翔的小鸟(源码)
游戏玩法:通过鼠标点击使小鸟上下移动穿过柱子并完成得分,小鸟碰到柱子或掉落到地面上都会结束游戏. (游戏内图片) 下面是实现这个游戏的代码: Brid类: package bird;import or ...
- C语言小游戏:飞翔的小鸟(完整版)
每天一个C语言小项目,提升你的编程能力! <Flappy Bird>是曾经一款流行的一款手机游戏,你只要让小鸟保持飞行,不要碰到绿色的管道就可以啦.操作虽然简单,但是非常具有挑战!本次我 ...
- 学着做的第一个小游戏 flappyBrid 飞翔的小鸟 有图片资源
<!DOCTYPE html> <html> <head><title>飞鸟</title><style type="tex ...
- java小游戏——飞翔的小鸟(java初学作品)
注:学习了java基础后,做出来的一个小作品,可以用来巩固学习 概述: 飞翔的小鸟能够作为Java基础的收官之作,包涵了Java很多的基础知识,在学习完Java基础后,尝试编写一些东西,能够起到很好的 ...
- java小游戏------Flappy Bird(飞翔的小鸟含源码)
前言:本小游戏可作为java入门阶段收尾创作. 需:掌握面向对象的使用,了解多线程和异常处理等知识. 如上图所示:我们需要绘制背景,小鸟,障碍物,当然也包括游戏开始界面以及死亡界面. 一:思路解析: ...
- java小游戏-飞翔的小鸟
java小游戏-ava小游戏-飞翔的小鸟 1 游戏窗口的显示 2 游戏背景添加 3 背景颜色的添加 4 屏幕中绘制小鸟 5 实现小鸟上下移动 6 解决屏幕闪烁问题 7 云彩的添加与移动 8 云彩的自动 ...
- java实现stg游戏_一些Java小游戏源码
一些Java小游戏源码 2016-04-18·Mr.Xia 10092 次浏览 ## SRPGWar(黄金护卫队) 链接:[http://pan.baidu.com/s/1c2BHZUS](http: ...
最新文章
- linux 文件查找与文件中注释去除
- pytorch 卷积网络入门实例
- python 加锁_python之给文件加锁(fcntl模块)
- Windows 10重装系统时,提示Windows只能安装到GPT磁盘的解决方法(更新于2021.4.28)
- android中级组件,第3章 Android组件--3.3 Android中级组件【含答案】 Android应用开发基础...
- hbase中为何不能向表中插入数据_Python自带的数据库,用起来真方便!
- “做人难,人难做,难做人,做男人更难啊!
- 无限宽神经网络 - 神经网络正切核理论【NTK】
- asp.net core 系列 10 配置configuration (上)
- 深入solidity内部 -以太坊EVN插槽存储关系
- Windows 11系统如何将“此电脑”显示在桌面?
- 使用java将word文档docx,doc(包含图形,文本框)完美转换成所有格式图片(pdf,png,gif,jpeg等等)
- Python实例29:利用python自动创建多个Excel表格
- node js批量导出PDF 导出压缩为zip 拆分设计 文件压缩 批量导出设计
- <时间复杂度和空间复杂度计算>《数据结构(C语言版)》
- 【cofface】MTK 67xx系列机型线刷recovery教程(基本通用)
- 文档批量统计页码工具PageAID(Word、Excel、PPT、PDF)
- 男人你应该去尝试创业
- uniconverter 12中文版(万兴全能格式转换器) v12.0.7.4
- 【STM32H7教程】第74章 STM32H7的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)
热门文章
- 前端Unicode字符图标汇总
- html怎么用excel打开乱码,我的Excel表格打开就乱码了,请问该如何修复?
- 汇编语言 王爽 第四版 第二章 检测点2.3
- 深度学习 arm linux移植过程整理
- SwitchHosts下载安装使用
- 单片机烧录文件的几种格式
- python大数据基础学习环境变量_《Python大数据基础与实战》[56M]百度网盘pdf下载...
- 通达信资金净流入公式_通达信资金净流量指标公式
- origin游戏服务器引擎
- 【SQL server】数据库的彻底卸载