JavaScript原生編寫《飛機(jī)大戰(zhàn)坦克》游戲完整實例
先來看看開始的界面圖
實現(xiàn)思路:
1.打開頁面,背景開始走動;
2.點擊開始,飛機(jī)開始不斷發(fā)射子彈,敵人隨機(jī)出現(xiàn)在上方;
3.當(dāng)敵人碰到子彈,敵人消失;
4.當(dāng)敵人和飛機(jī)相遇,飛機(jī)死亡,結(jié)束游戲;
html頁面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>飛機(jī)大戰(zhàn)</title> <link rel="stylesheet" type="text/css" href="飛機(jī)大戰(zhàn).css"> </head> <body> <div id="mainScreen"> <!-- 背景圖片 --> <div id="bgImg1" class="bg"></div> <div id="bgImg2" class="bg"></div> <!-- 飛機(jī) --> <div id="airplane"></div> <!-- 開始按鈕 --> <div id="startMenu"> <a href="#" id="start">Start</a> </div> <!-- 重新開始按鈕 --> <div id="restartMenu"> <a href="#" id="restart">Game Over!<br/>重新開始</a> </div> <!-- 敵人 --> <div class="enemy"></div> <div class="enemy"></div> <div class="enemy"></div> <div class="enemy"></div> <div class="enemy"></div> <!-- 子彈 --> <div class="bullet"></div> <div class="bullet"></div> <div class="bullet"></div> <div class="bullet"></div> <div class="bullet"></div> <div class="bullet"></div> <div class="bullet"></div> <div class="bullet"></div> <div class="bullet"></div> <div class="bullet"></div> </div> <script type="text/javascript" src="sunckBase.js"></script> <script type="text/javascript" src="飛機(jī)大戰(zhàn).js"></script> </body> </html>
css樣式
*{ margin: 0; padding: 0; font-family: "微軟雅黑"; } #mainScreen{ width: 512px; height: 768px; margin:0 auto; position: relative; overflow: hidden; } .bg{ width: 512px; height:768px; position: absolute; background: url(bg.jpg); } #bgImg2{ top:-768px; } #airplane{ width: 109px; height: 82px; position: absolute; background: url(hero.png); left: 215px; top: 668px; } .enemy{ position: absolute; width: 30px; height: 30px; left: -100px; top: 0px; background: url(enemy.png); background-size: 30px 30px; } .bullet{ position: absolute; width: 5px; height: 10px; left: -100px; top: -100px; background: url(bullet.png); background-size: 5px 10px; } #startMenu, #restartMenu{ position: absolute; width: 512px; text-align: center; left: 0; top: 300px; } #start, #restart{ line-height:50px; font-size:30px; font-weight:bold; color:#F00; display:block; text-decoration:none; } #restartMenu{ display: none; }
進(jìn)入頁面時,背景開始動
//給背景設(shè)置定時器,讓背景不停的動,形成動感 var bgTimer = setInterval(bgRun, 10); function bgRun() { jsBg1.style.top = jsBg1.offsetTop + 1 + "px"; jsBg2.style.top = jsBg2.offsetTop + 1 + "px"; if (jsBg1.offsetTop >= 768) { jsBg1.style.top = "-768px"; } else { if (jsBg2.offsetTop >= 768) { jsBg2.style.top = "-768px"; } } }
點擊開始,進(jìn)入游戲
游戲中
注:其實子彈和敵人的標(biāo)簽沒有幾個,但是我們使用定時器,開始之前,現(xiàn)將表現(xiàn)都放在屏幕外,進(jìn)入游戲需要時候再改變標(biāo)簽定位,將其放入到頁面中。
var jsStartBox=document.getElementById("startMenu") jsStart.onclick = function startGame(){ jsStartBox.style.display="none"; var baseX = 0; var baseY = 0; var moveX = 0; var moveY = 0; jsAirplane.onmousedown = function(e) { var evt = e || window.event; baseX = evt.pageX; baseY = evt.pageY; jsDivBox.onmousemove = function(v) { var vt = v || window.event; moveX = vt.pageX - baseX; baseX = vt.pageX; moveY = vt.pageY - baseY; baseY = vt.pageY; jsAirplane.style.left = jsAirplane.offsetLeft + moveX + "px"; jsAirplane.style.top = jsAirplane.offsetTop + moveY + "px"; }; }; jsAirplane.onmouseup = function() { mainScreen.onmousemove = null; } //找到可用的子彈 var findBulletTimer = setInterval(findBullet, 300); function findBullet() { for (var i = 0; i < jsBullets.length; i++) { if (jsBullets[i]["isShow"] == false) { jsBullets[i]["isShow"] = true; //將子彈移動到飛機(jī)頭 jsBullets[i].style.left = jsAirplane.offsetLeft + jsAirplane.offsetWidth / 2 + "px"; jsBullets[i].style.top = jsAirplane.offsetTop + "px"; break; } } } // //讓子彈飛 var bulletFlyTimer = setInterval(bulletFlay, 100); function bulletFlay() { for (var j = 0; j < jsBullets.length; j++) { if (jsBullets[j]["isShow"] == true) { if (jsBullets[j].offsetTop > -20) { jsBullets[j].style.top = jsBullets[j].offsetTop - 20 + "px"; } else { jsBullets[j].style.left = "-100px"; jsBullets[j].style.top = "-100px"; jsBullets[j]["isShow"] = false; } } } } //找到可用敵人 var findEnemyTimer = setInterval(findEnemy, 500); function findEnemy(){ //找到一個沒有在屏幕中的敵人 for (var i = 0; i < jsEnemys.length; i++) { if (jsEnemys[i]["isShow"] == false) { //標(biāo)記敵人已經(jīng)使用 jsEnemys[i]["isShow"] = true; //將敵人移動到屏幕 var left = randomNum(0, 482); jsEnemys[i].style.left = left + "px"; jsEnemys[i].style.top = 0 + "px"; break; } } } // //讓敵人下落 var enemyLandTimer = setInterval(enemyLand, 100); function enemyLand() { for (var j = 0; j < jsEnemys.length; j++) { if (jsEnemys[j]["isShow"] == true) { var a = randomNum(4, 20); if (jsEnemys[j].offsetTop <= 768) { jsEnemys[j].style.top = jsEnemys[j].offsetTop + a + "px"; } else { jsEnemys[j].style.left = "-100px"; jsEnemys[j].style.top = "0px"; jsEnemys[j]["isShow"] = false; } } } } }
打中怪物
用頁面上存在每一個敵人和每一個子彈的定位進(jìn)行簡則,如果相撞,那么怪物消失
var perishEnemyTimer = setInterval(perishEnemy, 50); function perishEnemy() { for (var i = 0; i < jsBullets.length; i++) { if (jsBullets[i]["isShow"] == true) { for (var j = 0; j < jsEnemys.length; j++) { if (jsEnemys[j]["isShow"] == true) { var ret = pzjcFunc(jsBullets[i], jsEnemys[j]); if (ret) { jsBullets[i].style.left = "-100px"; jsBullets[i].style.top = "-100px"; jsBullets[i]["isShow"] = false; jsEnemys[j].style.left = "-100px"; jsEnemys[j].style.top = "-100px"; jsEnemys[j]["isShow"] = false; } } } } } }
死亡檢測
游戲結(jié)束
用頁面上存在每一個敵人和飛機(jī)的定位進(jìn)行檢測,如果兩者相遇,那么結(jié)束游戲。
注:檢測時考慮取反,坦克在飛機(jī)上面,在飛機(jī)下面,在飛機(jī)左邊,在飛機(jī)右邊是沒有碰到的時候,那么我們?nèi)》淳褪钦f明兩者已經(jīng)相遇了。
//死亡檢測 var dieTimer = setInterval(die, 50); var jsStop = document.getElementById("restartMenu") function die() { for (var i = 0; i < jsEnemys.length; i++) { if (jsEnemys[i]["isShow"] == true) { var isDie = pzjcFunc(jsAirplane, jsEnemys[i]); if (isDie) { jsStop.style.display="block"; jsAirplane.onmouseup = function() { mainScreen.onmousemove = null; } } } } }
上述兩步中用到的檢測兩者是否碰撞的函數(shù)
//死亡檢測的函數(shù) function pzjcFunc(obj1, obj2){ var obj1Left = obj1.offsetLeft; var obj1Width = obj1Left + obj1.offsetWidth; var obj1Top = obj1.offsetTop; var obj1Height = obj1Top + obj1.offsetHeight; var obj2Left = obj2.offsetLeft; var obj2Width = obj2Left + obj2.offsetWidth; var obj2Top = obj2.offsetTop; var obj2Height = obj2Top + obj2.offsetHeight; if ( !(obj1Left > obj2Width || obj1Width < obj2Left || obj1Top > obj2Height || obj1Height < obj2Top) ) { return true; } return false; }
點擊重新開始之后刷新頁面
var jsRestart=document.getElementById("restart"); jsRestart.onclick=function(){ jsStop.style.display="none"; window.location.reload();//刷新頁面 }
好的,現(xiàn)在我們的游戲就可以玩了,這個游戲的有些寫作思想有些是我們在以后的項目中可以學(xué)習(xí)的。比如,頁面之外的空間的運(yùn)用;比如,檢測碰撞。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學(xué)習(xí)或者使用Javascript能帶來一定的幫助,如果有疑問大家可以留言交流。
- js+canvas實現(xiàn)飛機(jī)大戰(zhàn)
- JavaScript實現(xiàn)前端飛機(jī)大戰(zhàn)小游戲
- JavaScript編寫實現(xiàn)飛機(jī)大戰(zhàn)
- JavaScript實現(xiàn)飛機(jī)大戰(zhàn)游戲
- 用JS實現(xiàn)飛機(jī)大戰(zhàn)小游戲
- 原生JS實現(xiàn)飛機(jī)大戰(zhàn)小游戲
- js實現(xiàn)飛機(jī)大戰(zhàn)小游戲
- JS面向?qū)ο髮崿F(xiàn)飛機(jī)大戰(zhàn)
- js實現(xiàn)飛機(jī)大戰(zhàn)游戲
- js+css實現(xiàn)飛機(jī)大戰(zhàn)游戲
相關(guān)文章
js?fill函數(shù)填充數(shù)組或?qū)ο蟮慕鉀Q方法
這篇文章主要介紹了js?fill函數(shù)填充數(shù)組或?qū)ο蟮膯栴}及解決方法,本文給大家介紹的非常詳細(xì)對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02微信端調(diào)取相冊和攝像頭功能,實現(xiàn)圖片上傳,并上傳到服務(wù)器
這篇文章主要介紹了微信端調(diào)取相冊和攝像頭功能圖片上傳服務(wù)器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05JS實現(xiàn)將人民幣金額轉(zhuǎn)換為大寫的示例代碼
本篇文章主要是對使用JS實現(xiàn)將人民幣金額轉(zhuǎn)換為大寫的示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02JS實現(xiàn)彩色圖片轉(zhuǎn)換為黑白圖片的3種方法
本文主要介紹了JS實現(xiàn)彩色圖片轉(zhuǎn)換為黑白圖片的3種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09通過Javascript創(chuàng)建一個選擇文件的對話框代碼
通過Javascript創(chuàng)建一個選擇文件的對話框代碼,需要的朋友可以參考下2012-06-06