基于JS实现Flappy Bird游戏的示例代码

 更新时间:2022年04月25日 16:44:46   作者:海拥  
Flappy Bird是13年红极一时的小游戏,即摁上键控制鸟的位置穿过管道间的缝隙。本文将用JS实现这一经典的游戏,需要的可以参考一下

前言

Flappy Bird 是一款无尽的游戏,玩家可以控制一只鸟。玩家必须保护小鸟免于与管道等障碍物相撞。每次小鸟通过管道时,分数都会增加一。当小鸟与管道碰撞或因重力而坠落时,游戏结束。以下部分描述了构建此游戏必须采取的步骤。

游戏可以通过这个链接进入

完整源码地址

实现代码

HTML 部分:在此部分中,创建和加载游戏的元素。选择背景、鸟类、障碍和得分元素的图像。接下来,我们创建并链接 style.css 和 index.js 文件。

<!DOCTYPE html>
<html>

<head>
    <link rel="stylesheet" href="style.css" rel="external nofollow" >
</head>

<body>
	<div class="background"></div>
	<img class="bird" src="https://lf3-cdn-tos.bytescm.com/obj/static/xitu_juejin_web/e08da34488b114bd4c665ba2fa520a31.svg" alt="bird-img">
	<div class="message">
    按 Enter 开始游戏
	</div>
	<div class="score">
		<span class="score_title"></span>
		<span class="score_val"></span>
	</div>
    <script src="gfg.js"></script>
</body>

</html>

CSS 部分:在此部分中,根据需要修改游戏对象的大小、位置和样式。

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    height: 100vh;
    width: 100vw;
}

.background {
    height: 100vh;
    width: 100vw;
    background-color: skyblue;
}

.bird {
    height: 100px;
    width: 160px;
    position: fixed;
    top: 40vh;
    left: 30vw;
    z-index: 100;
}

.pipe_sprite {
    position: fixed;
    top: 40vh;
    left: 100vw;
    height: 70vh;
    width: 6vw;
    background-color: green;
}

.message {
    position: fixed;
    z-index: 10;
    height: 10vh;
    font-size: 10vh;
    font-weight: 100;
    color: black;
    top: 12vh;
    left: 20vw;
    text-align: center;
}

.score {
    position: fixed;
    z-index: 10;
    height: 10vh;
    font-size: 10vh;
    font-weight: 100;
    color: goldenrod;
    top: 0;
    left: 0;
}

.score_val {
    color: gold;
}

JavaScript 部分:此部分包含控制游戏状态和移动对象的代码部分。在本节中必须遵循以下步骤。

  • 在 JavaScript 文件中获取对鸟类和背景图像的引用。
  • 为背景滚动速度、小鸟的飞行速度和重力设置一些值。
  • 创建无限滚动背景。可以从此链接阅读执行此操作的指南。
  • 添加一个事件侦听器来侦听“enter”按键以将游戏状态更改为播放状态,并通过每帧从鸟的 y 坐标减小重力值来将重力应用于鸟。
  • 在视图宽度的末端生成障碍(管道),以便它们最初不可见,但随着背景的移动,将管道的 x 坐标减小背景滚动值,使其看起来像鸟在移动。
  • 应用与地面和管道的碰撞,如果小鸟发生碰撞,则将游戏状态更改为结束状态并显示一条消息以重新开始游戏。
  • 每次在管道之间成功导航后增加分数值。

背景滚动速度

let move_speed = 3;

重力常数值

let gravity = 0.5;

获取 bird 元素的引用

let bird = document.querySelector('.bird');

获取 bird 元素属性

let bird_props = bird.getBoundingClientRect();

部分 js 代码

let background =
    document.querySelector('.background')
    .getBoundingClientRect();

// 获取对 score 元素的引用
let score_val =
    document.querySelector('.score_val');
let message =
    document.querySelector('.message');
let score_title =
    document.querySelector('.score_title');

// 设置初始游戏状态开始
let game_state = 'Start';

// 为按键添加事件监听器
document.addEventListener('keydown', (e) => {

// 按下回车键开始游戏
if (e.key == 'Enter' &&
    game_state != 'Play') {
    document.querySelectorAll('.pipe_sprite')
            .forEach((e) => {
    e.remove();
    });
    bird.style.top = '40vh';
    game_state = 'Play';
    message.innerHTML = '';
    score_title.innerHTML = 'Score : ';
    score_val.innerHTML = '0';
    play();
}
});

到这里就完成了。

到此这篇关于基于JS实现Flappy Bird游戏的示例代码的文章就介绍到这了,更多相关JS Flappy Bird游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js正则表达式中test,exec,match方法的区别说明

    js正则表达式中test,exec,match方法的区别说明

    本篇文章主要是对js正则表达式中test,exec,match方法的区别进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • 使用纯原生JS实现大文件分片上传

    使用纯原生JS实现大文件分片上传

    前段时间在工作中接触到了文件上传的内容,但业务中实现的功能比较简单,于是我想着能不能使用纯原生的方式实现一个大文件的上传DEMO,从而在本质上学习大文件上传的思路,本教程使用纯原生的html+node.js实现,需要的朋友可以参考下
    2024-06-06
  • JavaScript中剩余参数的使用详解

    JavaScript中剩余参数的使用详解

    JavaScript中的剩余参数一般使用在**赋值号右侧,或具有迭代属性的数组、函数和对象,这篇文章主要为大家介绍了JavaScript中剩余参数的具体应用,需要的可以参考下
    2023-11-11
  • JavaScript学习笔记之图片库案例分析

    JavaScript学习笔记之图片库案例分析

    这篇文章主要介绍了JavaScript学习笔记之图片库案例,结合具体实例形式分析了javascript图片库相关的页面元素动态操作实现技巧,需要的朋友可以参考下
    2019-01-01
  • JavaScript懒加载详解

    JavaScript懒加载详解

    这篇文章主要为大家详细介绍了JS实现页面数据懒加载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • JS this作用域以及GET传输值过长的问题解决方法

    JS this作用域以及GET传输值过长的问题解决方法

    专IE7浏览器,IE URL参数过长问题,引发HTTP Status 122报错;this作用域问题,对应的解决方法如下,感兴趣的朋友可以参考下,希望对大家有所帮助
    2013-08-08
  • 详解js的事件处理函数和动态创建html标记方法

    详解js的事件处理函数和动态创建html标记方法

    本文主要对javascript的事件处理函数,动态创建html标记的两种方法进行详细介绍,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?

    js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?

    这篇文章主要介绍了js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别,需要的朋友可以参考下
    2015-11-11
  • Qt6基于Qml的文件对话框演示效果

    Qt6基于Qml的文件对话框演示效果

    这篇文章主要介绍了Qt6基于Qml的文件对话框演示,包括打开单个文件配置和打开多个文件配置及保存文件配置的方法,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • 详解ES6实现类的私有变量的几种写法

    详解ES6实现类的私有变量的几种写法

    这篇文章主要介绍了详解ES6实现类的私有变量的几种写法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论