這篇文章主要介紹了js如何實(shí)現(xiàn)推箱子小游戲,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營(yíng)銷推廣、網(wǎng)站重做改版、定遠(yuǎn)網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為定遠(yuǎn)等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
demo:
步驟解析:
本文代碼已經(jīng)放在了github上面了,里面也進(jìn)行了很詳細(xì)的代碼注釋,可以copy下來(lái),在本地運(yùn)行一下看看。
1. 渲染地圖
html結(jié)構(gòu):
html結(jié)構(gòu)十分簡(jiǎn)單,只要弄一堆div,來(lái)放置地圖的class就可以了,我這里初始化了12*9個(gè)div,地圖里最多九行高度。
這些div都是同樣大小,地圖渲染出來(lái)區(qū)別的只是顏色的不同。
地圖函數(shù):
var box=$('.box div'); //地圖使用的div集合 function create(){ //創(chuàng)建地圖函數(shù) box.each(function(index){ //index的數(shù)量是固定的,是box div下面div的數(shù)量 // 每次創(chuàng)建地圖初始化div box.eq(index).removeClass(); }); box.each(function(index,element){ //循環(huán)整個(gè)div的數(shù)量 二維數(shù)組里數(shù)量不夠的 默認(rèn)為空白 //level為關(guān)卡數(shù) 根據(jù)關(guān)卡渲染地圖 builder為二維數(shù)組,為地圖關(guān)卡 if(builder[level][index]){ //過(guò)濾0 box.eq(index).addClass('type'+builder[level][index]); } }); box.eq(origin[level]).addClass("pusher"); //推箱人 皮卡丘位置 } //第一關(guān)的地圖長(zhǎng)這樣(下面只是栗子,不是代碼),0代表不可抵達(dá)區(qū)域,1代表目標(biāo)(要被推到的地方), //2代表普通路徑(可以走的),3代表墻,4代表箱子 [0,0,0,0,3,3,3,0,0,0,0,0, 0,0,0,0,3,1,3,0,0,0,0,0, 0,0,0,0,3,2,3,3,3,3,0,0, 0,0,3,3,3,4,2,4,1,3,0,0, 0,0,3,1,2,4,2,3,3,3,0,0, 0,0,3,3,3,3,4,3,0,0,0,0, 0,0,0,0,0,3,1,3,0,0,0,0, 0,0,0,0,0,3,3,3,0,0,0,0]
2. 捕獲鍵盤事件,判斷是否可以移動(dòng)
使用$(document).keydown()jqery事件,捕獲鍵盤事件。
捕獲鍵盤事件,上下左右以及wsad。
$(document).keydown(function (e) { var key=e.which; switch(key){ //col 的值為12,上下移動(dòng)要12個(gè)div為一個(gè)周期 //方向鍵上或者w case 87: case 38: move(-col);//判斷移動(dòng)函數(shù) break; //方向鍵下或者s case 83: case 40: move(col); break; //方向鍵左或者a case 65: case 37: move(-1); break; //方向鍵右或者d case 68: case 39: move(1); break; } setTimeout(win,500); //按鍵之后調(diào)判斷是否過(guò)關(guān) });
判斷是否可以移動(dòng)。
分為兩個(gè)判斷條件:一個(gè)是推箱子,一個(gè)是不推箱子 自然移動(dòng),否則不移動(dòng)皮卡丘。
function move(step){ //是否移動(dòng)判斷 // 分為兩個(gè)判斷條件一個(gè)是推箱子,一個(gè)是不推箱子 自然移動(dòng)。 否則不移動(dòng)皮卡丘 //step 上下是12個(gè)div一個(gè)周期,左右是1個(gè)div positin是皮卡丘的原來(lái)位置 var pikaqiu1=box.eq(position);//皮卡丘現(xiàn)在的地方 var pikaqiu2=box.eq(position+step);//皮卡丘要去的下一個(gè)地方 var pushBox=box.eq(position+step*2);//箱子要去的下一個(gè)地方 if(!pikaqiu2.hasClass('type4')&&( pikaqiu2.hasClass('type1')||pikaqiu2.hasClass('type2'))){ //自然移動(dòng) //判斷:如果下一個(gè)div的class不包含type4(箱子),并且 下一個(gè)div含有type1(目標(biāo)位置),或者type2(普通路徑) //這一步和下一步判斷是否有type4的原因是普通路徑會(huì)變成有type4的路徑,這時(shí)候就會(huì)出現(xiàn)問(wèn)題 pikaqiu1.removeClass("pusher"); //移除當(dāng)前皮卡丘 pikaqiu2.addClass("pusher");//移動(dòng)皮卡丘到下一個(gè)位置 position=position+step;//增加position值 } else if((pikaqiu2.hasClass('type4'))&&(!pushBox.hasClass('type4'))&&(pushBox.hasClass('type1')|| pushBox.hasClass('type2')) ) { //推箱子 //如果下一個(gè)div的class包含type4(箱子)并且 不包含重疊type4(箱子) 并且 包含class type1(目標(biāo)位置)或者 包含type2(空路) pikaqiu2.removeClass('type4');//移除當(dāng)前箱子 pikaqiu1.removeClass("pusher");//移除當(dāng)前皮卡丘 pushBox.addClass('type4');//移動(dòng)箱子到下一個(gè)位置 pikaqiu2.addClass("pusher").addClass("type2");// //本來(lái)是type4 移除之后,這里沒有class了,要變成普通路徑 position=position+step;//增加position值 } }
3.勝利判斷:
每次移動(dòng)都要調(diào)用這個(gè)勝利判斷。
function win(){ //勝利條件判斷 if($(".type1.type4").length===goal){ //推的箱子與關(guān)卡設(shè)置通過(guò)箱子的數(shù)量對(duì)比 if(level<9) { alert("666,挑戰(zhàn)下一關(guān)吧--OBKoro1"); level++; //關(guān)卡+1 goal = goalList[level]; position = origin[level]; create(); }else { alert("厲害啊 大佬 通關(guān)了都"); } } }
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“js如何實(shí)現(xiàn)推箱子小游戲”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!