原生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 相关文章推荐
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
Apr 15 Javascript
js实现点小图看大图效果的思路及示例代码
Oct 28 Javascript
JS常用字符串处理方法应用总结
May 22 Javascript
JavaScript判断微信浏览器实例代码
Jun 13 Javascript
Javascript ES6中数据类型Symbol的使用详解
May 02 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
Jun 19 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
Jun 25 Javascript
Vue计算属性的使用
Aug 04 Javascript
JS实现提交表单前的数字及邮箱校检功能
Nov 13 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
Jan 16 Javascript
webpack+express实现文件精确缓存的示例代码
Jun 11 Javascript
基于JQuery和DWR实现异步数据传递
Oct 16 jQuery
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 301转向实现代码
2008/09/18 PHP
服务器web工具 php环境下
2010/12/29 PHP
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
javascript dom 基本操作小结
2010/04/11 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
Express下采用bcryptjs进行密码加密的方法
2018/02/07 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
详解vue高级特性
2020/06/09 Javascript
[03:01]2014DOTA2国际邀请赛 小组赛7月13日TOPPLAY
2014/07/14 DOTA
Python生成随机数组的方法小结
2017/04/15 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
彻底理解Python中的yield关键字
2019/04/01 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
LINUX下线程,GDI类的解释
2016/12/14 面试题
2013年高中生自我评价
2013/10/23 职场文书
团干部培训方案
2014/06/03 职场文书
庆元旦活动总结
2014/07/09 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
小学运动会报道稿
2014/10/04 职场文书
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
mysql创建存储过程及函数详解
2021/12/04 MySQL