欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

原生js實(shí)現(xiàn)Flappy Bird小游戲

 更新時間:2018年12月24日 11:42:26   作者:microcosm1994  
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)Flappy Bird小游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下

這是一個特別簡單的用原生js實(shí)現(xiàn)的一個小鳥游戲,比較簡單,適合新手練習(xí)。

html結(jié)構(gòu)

<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代碼了,這個小案例還運(yùn)用了自己前期封裝的一個小的動畫方法

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 () {
  //游戲沒有結(jié)束的時候運(yùn)行代碼
  if (!gameover) {
    //整個游戲背景x軸移動的距離
    sky.x = sky.x - bird.speedX;
    game.style.backgroundPositionX = sky.x + "px";
    //小鳥下落時y軸的坐標(biāo)
    bird.speedY = bird.speedY + g;
    //設(shè)置一個變量用來接收小鳥下落時y軸的坐標(biāo),用來設(shè)置小鳥下降時的速度
    var step = bird.speedY;
    bird.y = bird.y + step;
    //用一個變量來設(shè)定小鳥下落的最低高度,用來 判斷游戲是否結(jié)束
    var overY = game.offsetHeight - birdElement.offsetHeight;
    //小鳥的y軸坐標(biāo)大于最低高度,所以游戲停止
    if (bird.y > overY) {
      bird.y = overY;
      stop();
    }
    //小鳥的y軸坐標(biāo)小于0,說明碰到頂部邊框,所以游戲結(jié)束
    if (bird.y < 0) {
      bird.y = 0;
      stop();
    }
    //設(shè)置游戲開始時小鳥出現(xiàn)的位置
    bird.entity.style.top = bird.y + "px";
  }
}, 25);
//添加鍵盤事件,實(shí)現(xiàn)鍵盤上下鍵控制小鳥
document.onkeyup = function (e) {
  if (e.keyCode === 38) {
    bird.speedY = -10;
  }
}

function Pipe(positonX) {
  //管子的坐標(biāo)
  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;
  // 動態(tài)添加管子
  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);
  //因?yàn)槎〞r器會混亂this的指向問題,所以提前保存this的指向,這里的this指向調(diào)用該方法的實(shí)例
  var that = this;
  // 設(shè)置定時器讓管子向后移動
  this.timer=setInterval(function () {
    that.x = that.x - 1;
    //簡單實(shí)現(xiàn)管子無縫滾動
    if (that.x < -52) {
      that.x = 800;
    }
    if (!gameover) {
      divUp.style.left = that.x + "px";
      divDown.style.left = that.x + "px";
    }
    // 設(shè)置變量,進(jìn)行游戲碰撞檢測,并停止游戲
    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);
}
//執(zhí)行上面的函數(shù)方法
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);
  }
}

注釋都寫在了了代碼里,一個簡單小游戲就完成了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論