原生js實(shí)現(xiàn)Flappy Bird小游戲
這是一個(gè)特別簡(jiǎn)單的用原生js實(shí)現(xiàn)的一個(gè)小鳥游戲,比較簡(jiǎ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代碼了,這個(gè)小案例還運(yùn)用了自己前期封裝的一個(gè)小的動(dòng)畫方法
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é)束的時(shí)候運(yùn)行代碼
if (!gameover) {
//整個(gè)游戲背景x軸移動(dòng)的距離
sky.x = sky.x - bird.speedX;
game.style.backgroundPositionX = sky.x + "px";
//小鳥下落時(shí)y軸的坐標(biāo)
bird.speedY = bird.speedY + g;
//設(shè)置一個(gè)變量用來接收小鳥下落時(shí)y軸的坐標(biāo),用來設(shè)置小鳥下降時(shí)的速度
var step = bird.speedY;
bird.y = bird.y + step;
//用一個(gè)變量來設(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è)置游戲開始時(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;
// 動(dòng)態(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(shí)器會(huì)混亂this的指向問題,所以提前保存this的指向,這里的this指向調(diào)用該方法的實(shí)例
var that = this;
// 設(shè)置定時(shí)器讓管子向后移動(dòng)
this.timer=setInterval(function () {
that.x = that.x - 1;
//簡(jiǎn)單實(shí)現(xiàn)管子無縫滾動(dòng)
if (that.x < -52) {
that.x = 800;
}
if (!gameover) {
divUp.style.left = that.x + "px";
divDown.style.left = that.x + "px";
}
// 設(shè)置變量,進(jìn)行游戲碰撞檢測(cè),并停止游戲
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);
}
//封裝一個(gè)用來停止游戲的方法,
function stop(){
gameover=true;
clearInterval(timer);
for(var i=0;i<arr.length;i++){
clearInterval(arr[i].timer);
}
}
注釋都寫在了了代碼里,一個(gè)簡(jiǎn)單小游戲就完成了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Three.js 再探 - 寫一個(gè)微信跳一跳極簡(jiǎn)版游戲
- 利用原生js實(shí)現(xiàn)html5小游戲之打磚塊(附源碼)
- 原生js編寫2048小游戲
- AngularJS實(shí)現(xiàn)的2048小游戲功能【附源碼下載】
- 基于JavaScript+HTML5 實(shí)現(xiàn)打地鼠小游戲邏輯流程圖文詳解(附完整代碼)
- JS實(shí)現(xiàn)的走迷宮小游戲完整實(shí)例
- JavaScript用200行代碼制作打飛機(jī)小游戲?qū)嵗?/a>
- 20行js代碼實(shí)現(xiàn)的貪吃蛇小游戲
- JavaScript實(shí)現(xiàn)打地鼠小游戲
- js猜數(shù)字小游戲的簡(jiǎn)單實(shí)現(xiàn)代碼
- 原生JS實(shí)現(xiàn)的跳一跳小游戲完整實(shí)例
相關(guān)文章
bootstrapTable+ajax加載數(shù)據(jù) refresh更新數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了bootstrapTable+ajax加載數(shù)據(jù),以及refresh更新數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
微信小程序?qū)崿F(xiàn)可長(zhǎng)按移動(dòng)控件
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)可長(zhǎng)按移動(dòng)控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
Javascript排序算法之計(jì)數(shù)排序的實(shí)例
計(jì)數(shù)排序是一種高效的線性排序,它通過計(jì)算一個(gè)集合中元素楚翔的次數(shù)來確定集合如何排列,計(jì)數(shù)排序不需要進(jìn)行數(shù)據(jù)的比較,所有他的運(yùn)行效率前面介紹的都高2014-04-04
ES6新數(shù)據(jù)結(jié)構(gòu)Map功能與用法示例
這篇文章主要介紹了ES6新數(shù)據(jù)結(jié)構(gòu)Map功能與用法,結(jié)合實(shí)例形式分析了Map的功能、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-03-03
JavaScript鼠標(biāo)禁止右鍵禁止打開控制臺(tái)及鍵盤禁用
這篇文章主要給大家介紹了關(guān)于JavaScript鼠標(biāo)禁止右鍵禁止打開控制臺(tái)及鍵盤禁用的相關(guān)資料,實(shí)現(xiàn)禁止右鍵和禁止打開控制臺(tái)是一種常見的網(wǎng)頁保護(hù)技巧,可以防止非法復(fù)制、盜取網(wǎng)頁資源等安全問題,需要的朋友可以參考下2023-10-10

