飞翔的小鸟游戏实现

游戏效果图

92ae99e4f50d4e55956ee740e088028f.png

d104c92e4db941afb06b452a8f5675c0.png 

实现步骤

1.类的设计

飞翔小鸟游戏一共需要四个类:小鸟类、地面类、柱子类、GUI界面类

小鸟类:用于控制小鸟的位置、小鸟飞行、碰撞

地面类:主要用于检测小鸟是否碰撞到地面以及利用运动的相对性,地面每一帧左移一个像素,在视觉上实现小鸟是向右飞行的。

柱子类:同地面类。用于检测碰撞,以及模拟运动。

GUI界面类:负责游戏的逻辑控制以及游戏的整个界面显示。

源码:

bird类

package FlyingBird.games;

 

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

 

public class Bird {

    BufferedImage image;//加载小鸟图片

    int x,y;//小鸟中心点坐标

    int width,height;//小鸟宽度和高度,涉及到碰撞体积

    double g;//重力加速度

    double t;//一次位移设定的时间间隔

    double v0;//上抛初速度

    double speed;//小鸟当前速度

    double s;//一次时间间隔内的位移

    double alpha;//角度

 

    BufferedImage images[];//用于存放小鸟的动画帧

    int index;//动画帧下标

 

    public Bird() throws Exception{

        image=ImageIO.read(getClass().getResource("/FlyingBird/resources/0.png"));

        width=image.getWidth();

        height=image.getHeight();

        x=132;//小鸟初始x位置

        y=280;//小鸟初始y位置

        g=4;

        v0=20;

        t=0.25;

        speed=v0;

        s=0;

        alpha=0;

        images=new BufferedImage[8];//加载动画帧

        for (int i = 0; i < images.length; i++) {

            images[i]=ImageIO.read(

                    getClass().getResource("/FlyingBird/resources/"+i+".png"));

        }

        index=0;

    }

    //飞行动画

    public void fly(){

        index++;

        image=images[(index/12)%8];//每12帧小鸟的动画帧更新一次

    }

    //移动一帧

    public void step(){

        double v1=speed;//这个v1是临时记录speed

        s=v1*t-0.5*g*t*t;//模拟自由落体,小鸟向上移动的距离

        y=y-(int)s;

        double v=v1-g*t;//更新速度

        speed=v;

        alpha=Math.atan(s/10);//更新小鸟的倾角

    }

    //鼠标点击后,小鸟向上飞行

    public void flappy(){

        speed=v0;//将小鸟速度重置

    }

    //检测小鸟是否碰撞到地面

    public boolean hit(Ground ground){

        boolean hit=y+height/2>ground.y;//当小鸟的模型下边缘碰到地面,视为碰撞

        if(hit){

            //更新小鸟倾角设为90度

            alpha=-Math.PI/2;

        }

        return hit;

    }

    //检测小鸟是否碰撞到柱子,这里用了方法重载。

    public boolean hit(Column column){

        if(x+width/2>column.x-column.width/2&&

            x-width/2<column.x+column.width/2){ //柱子左边界与右边界检测

            if(y-height/2>column.y-column.gap/2&&//小鸟是否在柱子缝隙中间

            y+height/2<column.y+column.gap/2) return false;

            return true;

        }return false;

    }

}

Ground类

package FlyingBird.games;

 

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

import java.io.IOException;

 

public class Ground {

    BufferedImage image;//地面背景图

    int x;//地面的位置

    int y;

    int width;

    int height;

 

    public Ground() throws IOException {

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

        width=image.getWidth();

        height=image.getHeight();

        x=0;//设定地面的位置

        y=500;

    }

    //模拟地面移动的动画

    public void step(){

        x--;

        if(x==-109){

            x=0;

        }

    }

}

Column类

package FlyingBird.games;

 

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

 

public class Column {

    BufferedImage image;

    int x,y;//柱子模型中心的坐标

    int width,height;//柱子模型的宽度和高度,这个高度其实是没用的

    int gap;//柱子间间隙

    int distance;//两根柱子间距离

    Random random=new Random();

    //初始化第n根柱子

    public Column(int n) throws IOException {

        image= ImageIO.read(getClass().getResource("/FlyingBird/resources/column.png"));

        width=image.getWidth();

        height=image.getHeight();

        gap=144;

        distance=245;

        x=550+(n-1)*distance;//初始化柱子中心坐标

        y=random.nextInt(218)+132;

    }

    //柱子的移动动画

    //这里用两根柱子的交替出现模拟小鸟所遇到的障碍(柱子)

    public void step(){

        x--;

        if(x==-width/2){

            x=distance*2-width/2;

            y=random.nextInt(218)+132;

        }

    }

}

GUI界面

package FlyingBird.games;
 
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
 
public class FlyingBirdGUI extends JPanel {
    BufferedImage background;//背景图片
    BufferedImage startImage;//开始图片
    BufferedImage gameOverImage;//结束图片
    Bird bird;//小鸟
    Ground ground;//地面
    Column column1;//柱子1
    Column column2;//柱子2
    int score;//得分
    static int maxscore;//历史最高得分
    int state;//游戏状态
    //三个状态常量
    public static final int START=0;//开始
    public static final int RUNNING=1;//运行
    public static final int GAME_OVER=2;//结束
 
    //初始化
    public FlyingBirdGUI() throws Exception{
        this.background= ImageIO.read(getClass().getResource("/FlyingBird/resources/bg.png"));
        this.startImage= ImageIO.read(getClass().getResource("/FlyingBird/resources/start.png"));
        this.gameOverImage= ImageIO.read(getClass().getResource("/FlyingBird/resources/gameover.png"));
        ground=new Ground();
        column1=new Column(1);
        column2=new Column(2);
        bird=new Bird();
        score=0;
        state=START;
 
    }
    //绘制游戏界面
    public void paint(Graphics g) {
        g.drawImage(background, 0, 0, null);// 绘制背景
        g.drawImage(ground.image, ground.x, ground.y, null);//绘制地面
        //绘制柱子1、2
        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);
        //绘制小鸟,涉及到旋转坐标系
        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);
        //设定字体样式
        Font f = new Font(Font.SANS_SERIF, Font.BOLD, 40);
        g.setFont(f);
        //运行阶段,显示当前分数
        if(state==RUNNING){
            g.drawString("" + score, 40, 60);
            g.setColor(Color.WHITE);
            g.drawString("" + score, 40 - 3, 60 - 3);//阴影效果
        }
        //开始截断,显示历史记录分数(历史最高分)
        if(state==START){
            g.setColor(Color.RED);
            g.drawString("历史记录:" + maxscore, 40, 60);
        }
        //绘制开始与结束界面
        switch (state) {
            case START:
                g.drawImage(startImage, 0, 0, null);
                break;
            case GAME_OVER:
                g.drawImage(gameOverImage, 0, 0, null);
                break;
        }
    }
    //main方法
    public static void main(String[] args) throws Exception{
        JFrame jFrame = new JFrame();
        FlyingBirdGUI flyingBirdGUI = new FlyingBirdGUI();
        jFrame.add(flyingBirdGUI);
        jFrame.setSize(440,670);
        jFrame.setLocationRelativeTo(null);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
        flyingBirdGUI.action();
    }
    public void action() throws Exception{
        //设置鼠标监视器
        MouseListener l=new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                try {
                    switch (state) {
                        case START:
                            // 在开始状态,按下鼠标则转为运行状态。
                            state = RUNNING;
                            break;
                        case RUNNING:
                            // 在运行状态,按下鼠标则小鸟向上飞行。
                            bird.flappy();
                            break;
                        case GAME_OVER:
                            // 在结束状态,按下鼠标则重置数据,再次转为开始态。
                            column1 = new Column(1);
                            column2 = new Column(2);
                            bird = new Bird();
                            //更新历史最高分
                            if(score>=maxscore){
                                maxscore=score;
                            }
                            score = 0;
                            state = START;
                            break;
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        };
        addMouseListener(l);
        //用while循环模拟游戏动画,即不断的移动和重绘
        while (true) {
            switch (state) {
                case START:
                    // 小鸟做出飞行动作
                    bird.fly();
                    // 地面向左移动一步
                    ground.step();
                    break;
                case RUNNING:
                    // 地面向左移动一步
                    ground.step();
                    // 柱子向左移动一步
                    column1.step();
                    column2.step();
                    // 小鸟做出飞行动作
                    bird.fly();
                    // 小鸟上下移动一步
                    bird.step();
                    // 计算分数,小鸟飞过柱子右边界分数+1
                 

可以调节下面这行代码控制游戏的速度。1000/120可以理解为1秒钟(1000毫秒)刷新120次界面。刷新次数越快,画面变化越快,即游戏难度越高。可以尝试将120调整为60,90。

Thread.sleep(1000 /120);

 

Yorigami274
关注 关注
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【经典游戏Java实现 飞翔小鸟游戏
m0_46013789的博客
07-20 1221
飞翔小鸟 》是一款休闲益智类的游戏。玩家需要扮演一只可爱的小鸟,在游戏中进行飞行闯关。通过控制小鸟的飞行方向和高度,玩家需要躲避障碍物,收集道具,尽可能地飞行更远的距离。
java游戏------Flappy Bird飞翔小鸟含源码)
qq_74241043的博客
05-18 1678
链接:https://pan.baidu.com/s/1cZkqGN0gfGPjJM-FDxVUtg。链接:https://pan.baidu.com/s/1YcS3AtbHaY_G8JUOQg58Rg。如上图所示:我们需要绘制背景,小鸟,障碍物,当然也包括游戏开始界面以及死亡界面。(3)绘制障碍物(长柱和别的鸟),并使障碍物移动。(1)创建一个窗口绘制背景,绘制开始页面。(2)游戏界面展示的相关类包 main。(2)绘制一只小鸟能上下移动。(1)游戏入口包 app。(3)工具类包 util。
像素鸟多线程java_用java Swing做的小游戏"像素鸟"-Go语言中文社区
weixin_35815766的博客
02-28 346
最终效果整个项目都是基于swing实现的。窗是口将图片加载到JPanel面板,然后将面板添加到到JFrame窗口实现显示。这个类是选择几只像素鸟的类,也是main函数里执行的方法,代码有详细的注释,这里就不废话了public class select extends JPanel {/****/private static final long serialVersionUID = 1L;Imag...
Java开发的飞翔小鸟游戏408 功能非常齐全 完整源码
bangxiecode的博客
03-24 518
java 编写的飞翔小鸟游戏,窗体程序 完整源码游戏,可以直接用来做课程设计或者学习;代码功能完善,下载后可以直接运行!!
java期末大作业飞翔小鸟(无需注入数据库表)
weixin_62399938的博客
11-25 2953
fly⽅法实现了鸟的飞翔。⼀个数对8取余,能够得到0到7之间的数字,正好是images数组中的下标,index/12的⽬的是 使鸟的挥动翅膀次数变慢,即切换照⽚的频率变慢。下⾯介绍⼀下x、y坐标的计算⽅式,第⼀个柱⼦的x坐标为x= 432+118=550,第⼆根主⼦的x坐标为x=550+245,因此,柱⼦的x轴坐。3)修改BirdGame类的action⽅法中的主循环,当游戏没有结束的时,执⾏鸟和柱⼦的移动。接着,在BirdGame类的paint中,为达到鸟的飞翔效果,使⽤Java API,使⼩鸟旋转。
java写了一个简单的飞翔小鸟游戏
wangshuo2020的博客
05-18 3605
最近在学java 只是入了个们,所以写了一个飞行的小鸟游戏,不多说,直接上代码 Birt.java import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class Birt { double g;//重力加
C语言实现飞行小游戏
nothing
03-22 787
是一个简单的C语言实现飞行小游戏的代码示例。这个游戏中,一个飞机需要控制左右移动来避开悬挂在屏幕上方的飞行杂物
PYTHON 游戏飞翔小鸟游戏(基于python实现的可视化游戏
03-19
PYTHON 游戏飞翔小鸟游戏(基于python实现的可视化游戏,局域网可以联机) 解压后直接运行 game 即可,游戏需要安装pygame,可以参考requirements文件 运行 game.py 脚本即可开始游戏 操作方式:空格键跳跃 ...
html 飞翔小鸟(Flappy Bird)小游戏
12-27
HTML5飞翔小鸟(Flappy Bird)小游戏是一款基于网页的简单娱乐应用,利用HTML、CSS和JavaScript技术实现。这个游戏以其简洁的界面和极高的挑战性在2013年推出后迅速走红。在这个游戏中,玩家需要通过点击屏幕控制...
java游戏——小鸟飞翔
05-08
Java游戏——小鸟飞翔》是一款基于Java开发的轻量级休闲游戏,旨在帮助开发者学习和实践Java编程语言以及游戏开发的基本技巧。在这个项目中,我们将深入探讨如何利用Java的面向对象特性、图形库以及事件处理来...
飞翔的鸟-飞行游戏-uniapp-项目源码
12-23
这是一个uniapp应用项目源码完整,是个飞行游戏飞翔的鸟,通过HBuilder X开发工具选uniapp方式打开,uniapp项目可编译发行跨端应用(包括了各种小程序以及APP),可编译正常运行,适合新手入门参考学习。...
java实现飞翔小鸟游戏.zip
12-30
游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整的代码实现。 项目文档:详细的项目文档,介绍了项目的背景、功能、架构以及实现细节,帮助你更好地理解项目。 操作手册与...
No provider available from registry RegistryDirectory
小道仙的后宫
10-20 414
最近在做配置文件升级,服务比较多,之前的Dubbo配置各个服务写的比较乱,有的用Nacos上的 data-id,有的又是在自己的服务引入配置遂准备统一了,全部都用Nacos上的配置,同时修改了Dubbo服务名发到线上的时候,线上崩了,部分服务出现如下错误注: IP和服务名做了隐藏处理。
java 异常包装
fdvvg的博客
10-17 404
通过异常包装,可以在Java中有效地处理和传递异常。这样做不仅能保持原始异常的信息,还能为上层调用者提供更多的上下文信息。
JavaScript 中的定时器与动画基础
最新发布
jht_520的博客
10-20 214
例如,可以使用 setInterval 来每隔一定的时间改变一个元素的位置,从而实现移动效果。它接受两个参数,第一个参数是要执行的函数,第二个参数是时间间隔的毫秒数。它也接受两个参数,第一个参数是要执行的函数,第二个参数是延迟的毫秒数。setInterval 和 setTimeout 都是 JavaScript 中的定时器函数,用于在一定的时间间隔后执行函数。上述示例代码会先延迟两秒后开始淡入动画,然后再延迟两秒后开始淡出动画,从而实现一个简单的淡入淡出动画效果。
JavaWeb合集05-SpringBoot基础知识
qq_57340195的博客
10-17 938
Autowrite :自动装配,通过声明的数据类型来装配对应的bean对象。缺点,只能获取到一个相同类型的bean对象,如果有IOC容器里面有2个Bean对象,使用@Autowrite依赖注入就好报错。由于三层架构中,每一层都需要下次成来提供对应的方法,所有要new 下一次的对象,如果上一层的类名发送改变,那么上一层就需要修改对应的类名,如下。3、@Resource注解:通过它来代替@Autowrite注解,直接指定要注入的Bean对象,参数name的值就是要注入的Bean对象。
SpringBoot智能物流管理系统开发指南
2401_85762266的博客
10-18 1075
在概念模式的设计中,E-R模型法是最常见的设计方法。B/S架构的运行方式是在远程的服务器上把开发的软件系统部署在远程的服务器上,在部署好软件系统之后就可以实现在任何接入互联网的电脑上访问部署好的软件系统。6、网络上的客户端和服务器可以用来编程任何独立的编程环境,也有中国,GB2312,BIG5,日文写作,一般基金,用于支持多国语言,并且可以嵌入在数据表和其他软件shift_jis访问柱可以用作的名称。编程语言,如C, C ++,Python和Java的,的Perl,PHP,埃菲尔铁塔,Ruby和Tcl的。
Java 22 | 8】 深入解析Java 22 :Pattern Matching 特性详解
颜淡慕潇
10-17 7461
Java 22 进一步扩展了模式匹配(Pattern Matching)功能,简化了类型检查和条件表达式的使用。此特性不仅提升了代码的可读性,还减少了常见的错误。以下是对 Java 22 中模式匹配的详细介绍,包括基础概念、增强特性、使用场景、示例代码,以及如何在实际项目中有效利用模式匹配
SpringBoot内置的事件发布与订阅
七禾页话的博客
10-20 250
Getter/*** 文章 ID*/需要继承ApplicationEvent,因为阅读文章加一所以需要传入一个id来实现对阅读量加一的操作。
写文章

热门文章

  • 第二十一章 网络通信 1391
  • 第二十章 多线程 964
  • 用java实现王者荣耀 947
  • 飞翔的小鸟游戏实现 614
  • Java实现TCP一对一通信,实现UDP群聊通信 518

最新评论

  • 飞翔的小鸟游戏实现

    m0_74232880: 可以求一下完整源码吗表情包表情包

  • 熟悉Eclipse开发工具

    Yorigami274: 感谢,我会努力学习改进

  • 熟悉Eclipse开发工具

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)使用标准目录;(2)增加条理清晰的目录;(3)使用更多的站内链接。

最新文章

  • 第二十一章 网络通信
  • Java实现TCP一对一通信,实现UDP群聊通信
  • 第二十章 多线程
2023年43篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家保定佛像玻璃钢雕塑玻璃钢吉祥物雕塑价格安庆玻璃钢雕塑制作江苏镜面玻璃钢雕塑推荐大型玻璃钢荷叶雕塑壁挂浙江玻璃钢仿真水果雕塑厂家南县玻璃钢卡通雕塑长春小区玻璃钢雕塑定做长春玻璃钢仿铜人物雕塑北京大型主题商场美陈价格肇庆主题玻璃钢老鼠雕塑仿铜玻璃钢雕塑报价周年商场美陈售价合肥商场主题美陈上海欧式玻璃钢雕塑价位成都商场美陈研发公司富锦玻璃钢浮雕雕塑玻璃钢雕塑家园儿童画珠海景观雕塑玻璃钢商场大门圣诞美陈小区玻璃钢雕塑报价多少百货商场美陈报价广东创意玻璃钢雕塑方法方形玻璃钢花盆安新玻璃钢花盆花器沧州玻璃钢雕塑制作四川玻璃钢花盆怎么样浚县玻璃钢雕塑加工厂家东沙群岛玻璃钢座椅雕塑厂家苏州酒店玻璃钢花盆香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化