位置: IT常识 - 正文

原生JS实现FlappyBird游戏 超详细解析 快来做一个自己玩吧(原生js实现promise.all)

编辑:rootadmin
原生JS实现FlappyBird游戏 超详细解析 快来做一个自己玩吧

目录​

1.适配设备🐾

2.背景滚动💐

3.管道的创建与移动🌸

4.小鸟操作🌷

5.碰撞检测🍀

6.触屏事件🌹

7.制作开始与结束面板🌻

8.得分统计🌺


推荐整理分享原生JS实现FlappyBird游戏 超详细解析 快来做一个自己玩吧(原生js实现promise.all),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:原生js实现表头不动,内容滚动,js原生方法大全,原生js项目怎么运行,原生js实现promise,原生js实现promise,原生js实现表头不动,内容滚动,原生js实现表头不动,内容滚动,原生js实现promise.all,内容如对您有帮助,希望把文章链接给更多的朋友!

我们先来看看接下来我们要做的效果:🙋🙋🙋

有需要源码和素材的同学,在文章末尾有链接。 

1.适配设备💨

PC端下背景320px*568px(游戏背景图片大小),移动端下占满窗口

新建一个public.js文件,这个文件放一些我们公共的方法,下面我们先定义一个isPhone方法来判断是否是移动端设备

function isPhone() { var arr = ["iPhone","iPad","Android"] var is = false; for(var i = 0;i<arr.length;i++) { if(navigator.userAgent.indexOf(arr[i])!=-1) { is = true; } } return is;}

在isPhone方法里我们定义了一个数组arr用来存储移动端的设备名,UserAgent是HTTP请求中的用户标识,一般发送一个能够代表客户端类型的字符串,indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置,如果要检索的字符串值没有出现,则该方法返回 -1

我们默认是PC端,如果indexOf不返回-1说明与数组中的元素匹配,代表是移动端设备,那么我们的isPhone方法就返回true。

这个判断移动端的方法大家可以保存下来,以后很多的项目我们也用的到

因为我们规定移动端下背景图片要占满屏幕,所以需要一个if语句进行判断,如果isPhone返回的是true,说明当前在移动端,我们需要修改背景图片的宽高:

sw和sh是在在外面定义的全局变量,默认情况下sw=320,sh=568,因为在后面我们还会用到sw,sh,所以如果设备是移动端的话,需要对它们进行重新赋值。

if (isPhone()) { var bg = document.querySelector('.contain'); sw = document.documentElement.clientWidth + 'px'; sh = document.documentElement.clientHeight + 'px'; bg.style.width = sw; bg.style.height = sh;}

document.documentElement.clientWidth 就是当前设备的屏幕宽度,注意加符号

我们可以在chrome浏览器下模拟移动端不同设备下是否占满全屏,每次换完设备时要刷新页面: 

这样的话我们适配设备的效果就完成了,成功做到了可以在移动端下占满全屏,下面就开始制作我们的flappybird游戏吧!

2.背景滚动💨

在下面的代码中bg是我们获取的最外层装背景图片的盒子,背景图片是在x轴平铺的,所以我们只需要一个定时器不断调用背景移动函数就行,背景移动函数里我们每次调用背景的位置就向左移动5像素

var timer = setInterval(function(){ bgMove();},30)function bgMove() { var bg = document.querySelector('.contain'); bgDis -= 5; bg.style.backgroundPosition = `${bgDis}px 0`;}

在我们制作的这个游戏中,不论是背景移动还是待会要做的管道的移动,小鸟的移动,最后封装的函数都需要在这个定时器里调用,这样才会有我们看到的那种动画一样的效果。 

3.管道的创建与移动💨原生JS实现FlappyBird游戏 超详细解析 快来做一个自己玩吧(原生js实现promise.all)

在实现管道的移动之前我们先需要创建管道,因为我们要让生成的管道高度不一致,所以需要先写一个随机数函数,我们就在public.js里完成:

function rand(min, max) { return Math.round(Math.random() * (max-min) + min);}

我们先整理一下创建管道的思路:

先写管道的样式,html与css部分的代码在文章最后都有,大家在看解析的时候要先看一眼html结构和css样式。 规定上下管道间隔120px,通过定义好的rand随机函数实现上管道高度随机,背景图片高度减去间隔减去上管道高度就是下管道高度,这里下管道高度不要给随机。通过insertAdjacentHTML将生成管道的代码添加到ul里

 因为管道也是不断生成的,我们需要在timer定时器里调用管道移动函数pipeMove():

var timer = setInterval(function(){ bgMove(); pipeMove();},30)我们在外面定义这个pipeMove方法,在pipeMove里完成管道的创建与移动function pipeMove() { //1.创建管道 createPipe(); //2.管道移动}

下面先来根据在开头写的思路来完善管道创建函数createPipe: 

function createPipe() { var pipeheight = rand(100,300); var ul = document.querySelector('ul'); var str = `<li class="top" style="height:${pipeheight+'px'};left:${sw+'px'}"><div></div></li><li class="bottom" style="height:${sh-pipeheight-120+'px'};left:${sw+'px'}"><div></div></li>`; ul.insertAdjacentHTML('beforeend',str);}

运行代码看一看管道有没有被创建出来:

很明显管道数量太多了啊,因为定时器每隔三十毫秒就会调用管道创建函数,所以管道生成的就非常多,我们定义一些全局变量进行限制:

var space = 100; //创建管道的间隔var count = 0; //管道的计数

修改一下createPipe函数,当计数达到创建管道的间隔100时才执行下面创建管道的代码,否则不执行,这样就对生成管道的数量进行了限制

function createPipe() { count ++; if (count != space) { return ; } count = 0; var pipeheight = rand(100,300); var ul = document.querySelector('ul'); var str = `<li class="top" able="0" style="height:${pipeheight+'px'};left:${sw+'px'}"><div></div></li><li class="bottom" style="height:${sh-pipeheight-120+'px'};left:${sw+'px'}"><div></div></li>`; ul.insertAdjacentHTML('beforeend',str);}

现在管道可以在背景的右面不断的生成,这样管道的创建就全部完成了,下面在pipeMove方法里继续完善管道移动的部分:

function pipeMove() { //1.创建管道 createPipe(); //2.管道移动 var li = document.querySelectorAll('li'); li.forEach(function(value,index,arr){ arr[index].style.left = arr[index].offsetLeft-2+'px'; }) }

我们先获取创建的所有管道,然后通过foreach循环每次调用都让管道左移两像素,管道就能成功移动起来了。

注意:直接通过obj.style.left和obj.style.top可以获取位置,但是有局限性,这种获取的方法只能获取到行内样式的left和top的属性值,不能获取到style标签和link 外部引用的left和top属性值。所以这里用offsetleft获取

然后我们再给管道加一个边界,让他超出背景时就在ul里删除这个元素:

li.forEach(function(value,index,arr){ arr[index].style.left = arr[index].offsetLeft-5+'px'; if(arr[index].offsetLeft<=-62) { ul.removeChild(arr[index]); }})

我们运行代码看一看效果:

 ​

这样管道的创建与运动就基本上完成了,下面我们开始小鸟的操作。

4.小鸟操作💨

首先我们先把小鸟的html结构和css样式搭建好,下一步就是让小鸟“动起来”。

同样我们需要在定时器中调用小鸟移动函数birdMov

var timer = setInterval(function(){ bgMove(); pipeMove(); birdMove(); },30)

因为游戏开始的时候小鸟要向下掉落所以先写一个小鸟的移动函数:

function birdMove() { var bird = document.querySelector('#bird'); bird.style.top = bird.offsetTop +5 + 'px';}

这样的话,小鸟就实现了一直匀速下落的效果,但是游戏中我们的小鸟并不是匀速的所以我们还需要定义一个全局变量speed,初始化它的值为0,来控制小鸟的速度。

因为我们在游戏中单击屏幕时小鸟会向上飞而且向上飞的速度和向下的速度不相同,所以我们在全局

本文链接地址:https://www.jiuchutong.com/zhishi/296119.html 转载请保留说明!

上一篇:支付宝手机网站H5支付(支付宝手机网站支付不风控)

下一篇:[3D检测系列-PointRCNN]复现PointRCNN代码,并实现PointRCNN3D目标检测可视化,包含预训练权重下载链接(从0开始以及各种报错的解决方法)(3d检测软件)

  • 手机助手怎么连接电脑(手机助手)(手机助手怎么连接手机)

    手机助手怎么连接电脑(手机助手)(手机助手怎么连接手机)

  • 荣耀play5tpro怎么设置软件应用锁(荣耀play5tPro怎么装内存卡)

    荣耀play5tpro怎么设置软件应用锁(荣耀play5tPro怎么装内存卡)

  • iwatch怎么锁屏(iwatch怎么锁屏iphone)

    iwatch怎么锁屏(iwatch怎么锁屏iphone)

  • wifi6速度(wifi6速度快吗)

    wifi6速度(wifi6速度快吗)

  • nike取消订单多久到账(nike取消订单钱返回到哪里)

    nike取消订单多久到账(nike取消订单钱返回到哪里)

  • 安卓手机微信分身在哪里设置(安卓手机微信分身怎么弄)

    安卓手机微信分身在哪里设置(安卓手机微信分身怎么弄)

  • 支付宝收藏怎么找不到(支付宝收藏怎么删除)

    支付宝收藏怎么找不到(支付宝收藏怎么删除)

  • 京东所选地区没货怎么办(京东所选地区没货能不能下单)

    京东所选地区没货怎么办(京东所选地区没货能不能下单)

  • 微信设置不看对方朋友圈对方知道吗(微信设置不看对方朋友圈,对方还能点赞吗?)

    微信设置不看对方朋友圈对方知道吗(微信设置不看对方朋友圈,对方还能点赞吗?)

  • 支付宝如何注销账号(支付宝如何注销营业执照)

    支付宝如何注销账号(支付宝如何注销营业执照)

  • 移动5g合约版是什么意思(移动5g合约版是5g吗)

    移动5g合约版是什么意思(移动5g合约版是5g吗)

  • 怎么设置壁纸自动换(怎么设置壁纸自动更换vivo)

    怎么设置壁纸自动换(怎么设置壁纸自动更换vivo)

  • 用开发者模式伤手机吗(用开发者模式伤内存吗)

    用开发者模式伤手机吗(用开发者模式伤内存吗)

  • scms-t需要开启吗(scmst)

    scms-t需要开启吗(scmst)

  • ms dos是多任务操作系统吗(ms-dos怎么操作)

    ms dos是多任务操作系统吗(ms-dos怎么操作)

  • 域名字符的长度限制是多少(域名字符具有的特征)

    域名字符的长度限制是多少(域名字符具有的特征)

  • vivoy9s有呼吸灯吗(vivos9的呼吸灯)

    vivoy9s有呼吸灯吗(vivos9的呼吸灯)

  • qq上的解除关系是啥意思(qq的解除关系在哪)

    qq上的解除关系是啥意思(qq的解除关系在哪)

  • 下载东西解析包出现问题怎么办

    下载东西解析包出现问题怎么办

  • vivos5怎么显示网速(vivoz5x怎么显示网速)

    vivos5怎么显示网速(vivoz5x怎么显示网速)

  • beats无线耳机怎么开(beats无线耳机怎么恢复出厂设置)

    beats无线耳机怎么开(beats无线耳机怎么恢复出厂设置)

  • 苹果手机突然变暗了怎么回事(苹果手机突然变暗了怎么调到正常)

    苹果手机突然变暗了怎么回事(苹果手机突然变暗了怎么调到正常)

  • 扣扣怎么拉黑一个人(扣扣如何拉黑人)

    扣扣怎么拉黑一个人(扣扣如何拉黑人)

  • 手机丢了绑定的银行卡怎么办(手机丢了绑定的东西怎么办)

    手机丢了绑定的银行卡怎么办(手机丢了绑定的东西怎么办)

  • 微信定位怎么发给别人(微信定位怎么发给QQ好友)

    微信定位怎么发给别人(微信定位怎么发给QQ好友)

  • 导航键在哪里(导航键在哪里找)

    导航键在哪里(导航键在哪里找)

  • oppoFindx拍照有美颜吗(oppofindx拍照很模糊)

    oppoFindx拍照有美颜吗(oppofindx拍照很模糊)

  • IDEA如何完美配置Servlet(适用于IDEA 2022及以下版本)(idea配置meaven)

    IDEA如何完美配置Servlet(适用于IDEA 2022及以下版本)(idea配置meaven)

  • 目标检测:Faster-RCNN算法细节及代码解析(目标检测yolo算法)

    目标检测:Faster-RCNN算法细节及代码解析(目标检测yolo算法)

  • 企业为职工提供无偿服务
  • 冲减计提
  • t3怎么查资产负债表
  • 小规模纳税人零申报是每季度报吗
  • 有两处收入的怎么报个税汇算清缴
  • 商贸公司营业执照范围
  • 进口增值税抵扣信息委托核查函
  • 固定资产变动时应如何处理
  • 自查补缴的企业怎么处理
  • 企业生产设备发生的日常维修费用
  • 发票报销哪些能用专票
  • 分公司开票怎么做账
  • 个人汽车租赁发票网上怎么开
  • 前三季度盈利第四季度亏损 所得税记账
  • 所得税季度申报表营业成本怎么填
  • 地税三方协议是什么意思
  • 公司注销固定资产怎么处理税怎么交
  • 往年计提有误 跨年处理
  • 简易征收是优惠政策吗
  • 高薪补贴需要交什么税
  • 其他综合收益的含义
  • 把管理费用记到什么科目
  • 单位预算支出包括哪些
  • 出口业务怎么做分录
  • 应收账款周转天数和应收账款周转率的关系
  • 苹果系统权限管理在哪找
  • 联想笔记本在bios中怎么把图标和字变大
  • 系统之家一键重装系统步骤
  • androirc下载
  • 销售免税农产品进项税可以抵扣吗
  • 出口退税运费的账务处理
  • ✝️ 强制 Vue 重新渲染组件的正确方法
  • 享受所得税优惠情况说明
  • 单位车辆车船使用税滞纳金如何交
  • 小规模纳税人低于30万怎么填报申报表
  • react框架和vue哪个用的人多
  • 凭证过账后发现了错误,如何处理
  • 增值税抵扣进项税额什么意思
  • 政府补助可以挂账吗
  • 简易记账和复式记账
  • 办理银行承兑汇票保证金比例
  • phpcms怎么用
  • c#代码怎么写
  • 啤酒的消费税
  • 契税并入土地价值吗
  • 合同未约定开票但对方不给开
  • 股权转让如何缴纳个税
  • 以前年度的销售退回能否直接冲减销售收入
  • 长期股权投资权益法初始成本的确定
  • 固定资产租赁费评估
  • 进项都抵扣完了怎么做账
  • 商贸公司库存商品进销存报表怎么做
  • 企业营运能力分析
  • mysql 基本操作
  • sql游标怎么用
  • win10系统迅雷
  • mac版安装教程
  • linux命令sed -i
  • 无法ping通虚拟机
  • asmb进程
  • windows ftp软件
  • 如何管理和维护宿舍卫生
  • Windows7忘记开机密码一键还原
  • win8系统教程
  • unity3d读取gis数据
  • ndk sdk
  • linux文件压缩和备份实验
  • opengl安装教程
  • 虚拟机中使用keil
  • linux修改目录路径
  • android study
  • shell脚本实现文件移动、复制等操作
  • js中split方法的作用
  • 深入理解新发展理念
  • python dict.get()和dict['key']的区别详解
  • 郑州税务局电话客服电话
  • 先征后返的增值税计入哪个科目
  • 别人用你的收款码能骗到钱吗
  • 电子税务局网页版
  • 去税务局补缴税款医疗费不带证件可以吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设