原生js实现Flappy Bird小游戏


Posted in Javascript onDecember 24, 2018

这是一个特别简单的用原生js实现的一个小鸟游戏,比较简单,适合新手练习。

原生js实现Flappy Bird小游戏

html结构

<div id="game">
  <div id="bird"></div>
</div>

css样式

#game {
    width: 800px;
    height: 600px;
    border: 1px solid #000;
    background: url(images/sky.png);
    overflow: hidden;
    position: relative;
  }

  #game .pipeD {
    background: url(images/pipe1.png) top center;
    position: absolute;
  }

  #game .pipeU {
    background: url(images/pipe2.png) bottom center;
    position: absolute;
  }

  #bird {
    width: 34px;
    height: 25px;
    /*border-radius: 10px;*/
    /*background-color: red;*/
    position: absolute;
    top: 100px;
    left: 100px;
    background: url(images/birds.png) -8px -10px no-repeat;
  }

下面就是原生js代码了,这个小案例还运用了自己前期封装的一个小的动画方法

function animate(obj, json, fn) {
  clearInterval(obj.timer);
  obj.timer = setInterval(function () {
    var flag = true;
    for (var k in json) {
      if (k === "opacity") {
        var leader = getStyle(obj, k) * 100;
        var target = json[k] * 100;
        var step = (target - leader) / 10;
        step = step > 0 ? Math.ceil(step) : Math.floor(step);
        leader = leader + step;
        obj.style[k] = leader / 100;
      } else if (k === "zIndex") {
        obj.style.zIndex = json[k];
      } else {
        var leader = parseInt(getStyle(obj, k)) || 0;
        var target = json[k];
        var step = (target - leader) / 10;
        step = step > 0 ? Math.ceil(step) : Math.floor(step);
        leader = leader + step;
        obj.style[k] = leader + "px";
      }
      if (leader !== target) {
        flag = false;
      }
    }
    if (flag) {
      clearInterval(obj.timer);
      if (fn) {
        fn();
      }
    }
  }, 15);
}
function getStyle(obj, attr) {
  if (window.getComputedStyle) {
    return window.getComputedStyle(obj)[attr];
  } else {
    return obj.currentStyle[attr];
  }
}

下面就是控制游戏的js代码了

var birdElement = document.getElementById("bird");
var game = document.getElementById("game");
var gameover = false;
var g = 1;
var i = 0;
var timer=null;
var bird = {
  x: birdElement.offsetLeft,
  y: birdElement.offsetTop,
  speedX: 5,
  speedY: 0,
  entity: birdElement
};
var sky = {
  x: 0
};

//var timer=setInterval(function(){
//  birdElement.style.backgroundPositionX=-52*i+"px";
//  i++;
//  if(i===3){
//    i=0;
//  }
//},100);

setInterval(function () {
  //游戏没有结束的时候运行代码
  if (!gameover) {
    //整个游戏背景x轴移动的距离
    sky.x = sky.x - bird.speedX;
    game.style.backgroundPositionX = sky.x + "px";
    //小鸟下落时y轴的坐标
    bird.speedY = bird.speedY + g;
    //设置一个变量用来接收小鸟下落时y轴的坐标,用来设置小鸟下降时的速度
    var step = bird.speedY;
    bird.y = bird.y + step;
    //用一个变量来设定小鸟下落的最低高度,用来 判断游戏是否结束
    var overY = game.offsetHeight - birdElement.offsetHeight;
    //小鸟的y轴坐标大于最低高度,所以游戏停止
    if (bird.y > overY) {
      bird.y = overY;
      stop();
    }
    //小鸟的y轴坐标小于0,说明碰到顶部边框,所以游戏结束
    if (bird.y < 0) {
      bird.y = 0;
      stop();
    }
    //设置游戏开始时小鸟出现的位置
    bird.entity.style.top = bird.y + "px";
  }
}, 25);
//添加键盘事件,实现键盘上下键控制小鸟
document.onkeyup = function (e) {
  if (e.keyCode === 38) {
    bird.speedY = -10;
  }
}

function Pipe(positonX) {
  //管子的坐标
  this.x = positonX;
  this.upPipeY = 0;
  this.width = 52;
  this.upPipeH = parseInt(Math.random() * 175 + 100);
  this.downPipeY = this.upPipeH + 200;
  this.downPipeH = game.offsetHeight - this.downPipeY;
  // 动态添加管子
  var divUp = document.createElement("div");
  divUp.className = "pipeU";
  divUp.style.width = this.width + "px";
  divUp.style.height = this.upPipeH + "px";
  divUp.style.left = this.x + "px";
  divUp.style.top = this.upPipeY + "px";
  game.appendChild(divUp);
  var divDown = document.createElement("div");
  divDown.className = "pipeD";
  divDown.style.width = this.width + "px";
  divDown.style.height = this.downPipeH + "px";
  divDown.style.left = this.x + "px";
  divDown.style.top = this.downPipeY + "px";
  game.appendChild(divDown);
  //因为定时器会混乱this的指向问题,所以提前保存this的指向,这里的this指向调用该方法的实例
  var that = this;
  // 设置定时器让管子向后移动
  this.timer=setInterval(function () {
    that.x = that.x - 1;
    //简单实现管子无缝滚动
    if (that.x < -52) {
      that.x = 800;
    }
    if (!gameover) {
      divUp.style.left = that.x + "px";
      divDown.style.left = that.x + "px";
    }
    // 设置变量,进行游戏碰撞检测,并停止游戏
    var downCrash = (bird.x + 34 > that.x) && (bird.x < that.x + 52) && (bird.y + 25 > that.downPipeY);
    var upCrash = (bird.x + 34 > that.x) && (bird.x < that.x + 52) && (bird.y < that.upPipeH);
    if (downCrash || upCrash) {
      //gameover = true;
      stop();
    }
  }, 10);
}
//执行上面的函数方法
var arr=[];
for (var i = 0; i < 4; i++) {
  arr[i]=new Pipe(i * 200 + 400);
}
//封装一个用来停止游戏的方法,
function stop(){
  gameover=true;
  clearInterval(timer);
  for(var i=0;i<arr.length;i++){
    clearInterval(arr[i].timer);
  }
}

注释都写在了了代码里,一个简单小游戏就完成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 节点遍历函数
Mar 28 Javascript
js中的scroll和offset 使用比较的实例与分析
Sep 29 Javascript
js中对象的声明方式以及数组的一些用法示例
Dec 11 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
Jan 04 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
Dec 14 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
Aug 17 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
Oct 30 Javascript
Node.js的Koa实现JWT用户认证方法
May 05 Javascript
webpack手动配置React开发环境的步骤
Jul 02 Javascript
Angular5中提取公共组件之radio list的实例代码
Jul 10 Javascript
vue项目中使用bpmn为节点添加颜色的方法
Apr 30 Javascript
JavaScript indexOf()原理及使用方法详解
Jul 09 Javascript
node错误处理与日志记录的实现
Dec 24 #Javascript
详解如何在vscode里面调试js和node.js的方法步骤
Dec 24 #Javascript
@angular前端项目代码优化之构建Api Tree的方法
Dec 24 #Javascript
微信小程序获取用户openid的实现
Dec 24 #Javascript
vue-router启用history模式下的开发及非根目录部署方法
Dec 23 #Javascript
小程序实现人脸识别功能(百度ai)
Dec 23 #Javascript
优雅的elementUI table单元格可编辑实现方法详解
Dec 23 #Javascript
You might like
解决PHP超大文件下载,断点续传下载的方法详解
2013/06/06 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
php字符串操作常见问题小结
2016/10/11 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
IE关闭时判断及AJAX注销案例学习
2013/02/18 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
Vue实现选择城市功能
2017/05/27 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
教你安装python Django(图文)
2013/11/04 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
python os模块简单应用示例
2019/05/23 Python
python处理“
2019/06/10 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
软件工程师岗位职责
2013/11/16 职场文书
竞争上岗演讲稿
2014/01/05 职场文书
高中政治教学反思
2014/01/18 职场文书
交通事故赔偿协议书
2014/04/15 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
合作意向书怎么写
2019/06/24 职场文书
Python破解极验滑动验证码详细步骤
2021/05/21 Python
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏