中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

原生js如何實現Flappy Bird小游戲

發布時間:2021-04-20 09:58:10 來源:億速云 閱讀:157 作者:小新 欄目:web開發

這篇文章主要介紹了原生js如何實現Flappy Bird小游戲,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

JS是什么

JS是JavaScript的簡稱,它是一種直譯式的腳本語言,其解釋器被稱為JavaScript引擎,是瀏覽器的一部分,主要用于web的開發,可以給網站添加各種各樣的動態效果,讓網頁更加美觀。

原生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);
  }
}

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“原生js如何實現Flappy Bird小游戲”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奉节县| 泰兴市| 藁城市| 乌鲁木齐县| 青神县| 双桥区| 彭泽县| 阿坝| 革吉县| 宁乡县| 花垣县| 葫芦岛市| 大庆市| 宾阳县| 屏山县| 本溪市| 东海县| 公安县| 泸定县| 杂多县| 兴城市| 大田县| 长丰县| 烟台市| 聊城市| 虞城县| 绥中县| 离岛区| 湖北省| 太和县| 察雅县| 文昌市| 泗阳县| 宜良县| 兴国县| 湘西| 九龙县| 金溪县| 喀什市| 淮南市| 自贡市|