亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

js推箱子小游戲步驟代碼解析

 更新時(shí)間:2018年01月10日 08:45:52   投稿:laozhang  
本篇文章通過代碼分析給大家講解了JS制作推箱子小游戲的步驟以及要點(diǎn),需要的朋友參考學(xué)習(xí)下吧。

推箱子小游戲大家肯定都玩過,之所以寫這篇文章,是覺得這個(gè)小游戲足夠簡(jiǎn)單好理解

demo:

步驟解析:

本文代碼已經(jīng)放在了github上面了,里面也進(jìn)行了很詳細(xì)的代碼注釋,可以copy下來,在本地運(yùn)行一下看看。

1. 渲染地圖

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

html結(jié)構(gòu)十分簡(jiǎn)單,只要弄一堆div,來放置地圖的class就可以了,我這里初始化了12*9個(gè)div,地圖里最多九行高度。
這些div都是同樣大小,地圖渲染出來區(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]){ //過濾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ā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是皮卡丘的原來位置
  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)問題
   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");//
   //本來是type4 移除之后,這里沒有class了,要變成普通路徑
   position=position+step;//增加position值 
  }
 } 

3.勝利判斷:
每次移動(dòng)都要調(diào)用這個(gè)勝利判斷。

function win(){ //勝利條件判斷
 if($(".type1.type4").length===goal){ //推的箱子與關(guān)卡設(shè)置通過箱子的數(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)了都");
  }
 }
}

代碼地址

demo地址

相關(guān)文章

  • uniapp表單校驗(yàn)超詳細(xì)講解

    uniapp表單校驗(yàn)超詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于uniapp表單校驗(yàn)的相關(guān)資料,Uni-app內(nèi)置了一些表單驗(yàn)證方法,可以幫助我們對(duì)表單進(jìn)行有效的驗(yàn)證,需要的朋友可以參考下
    2023-10-10
  • JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器

    JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • JS中URL.createObjectURL使用示例講解

    JS中URL.createObjectURL使用示例講解

    URL.createObjectURL()方法會(huì)根據(jù)傳入的參數(shù)創(chuàng)建一個(gè)指向該參數(shù)對(duì)象的URL. 這個(gè)URL的生命僅存在于它被創(chuàng)建的這個(gè)文檔里. 新的對(duì)象URL指向執(zhí)行的File對(duì)象或者是Blob對(duì)象,這篇文章主要給大家介紹了關(guān)于JS中URL.createObjectURL使用的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • js如何找出字符串中的最長(zhǎng)回文串

    js如何找出字符串中的最長(zhǎng)回文串

    這篇文章主要為大家詳細(xì)介紹了js如何找出字符串中的最長(zhǎng)回文串的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 微信小程序使用this.setData()遇到的問題及解決方案詳解

    微信小程序使用this.setData()遇到的問題及解決方案詳解

    this.setData估計(jì)是小程序中最經(jīng)常用到的一個(gè)方法,但是要注意其實(shí)他是有限制的,忽略這些限制的話,會(huì)導(dǎo)致數(shù)據(jù)無法更新,下面這篇文章主要給大家介紹了關(guān)于微信小程序使用this.setData()遇到的問題及解決方案,需要的朋友可以參考下
    2022-08-08
  • Bootstrap popover 實(shí)現(xiàn)鼠標(biāo)移入移除顯示隱藏功能方法

    Bootstrap popover 實(shí)現(xiàn)鼠標(biāo)移入移除顯示隱藏功能方法

    下面小編就為大家分享一篇Bootstrap popover 實(shí)現(xiàn)鼠標(biāo)移入移除顯示隱藏功能方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • js中的異常處理try...catch使用介紹

    js中的異常處理try...catch使用介紹

    在JavaScript可以使用try...catch來進(jìn)行異常處理,下面有個(gè)不錯(cuò)的示例,大家可以參考下,希望對(duì)大家有所幫助
    2013-09-09
  • js轉(zhuǎn)化毫秒為時(shí)間格式代碼

    js轉(zhuǎn)化毫秒為時(shí)間格式代碼

    這篇文章主要介紹了使用js轉(zhuǎn)化毫秒為時(shí)間格式的具體實(shí)現(xiàn),需要的朋友可以參考下
    2014-04-04
  • JavaScript中常用數(shù)據(jù)處理函數(shù)groupBy的用法詳解

    JavaScript中常用數(shù)據(jù)處理函數(shù)groupBy的用法詳解

    數(shù)據(jù)處理與分析中,對(duì)數(shù)據(jù)進(jìn)行分組是非常常見的功能,不論是實(shí)際工作中,還是在面試的場(chǎng)景中應(yīng)用十分廣泛,尤其在函數(shù)式編程中?groupBy?十分常見,下面我們就來學(xué)習(xí)一下groupBy的用法吧
    2023-12-12
  • JavaScript類數(shù)組對(duì)象轉(zhuǎn)換為數(shù)組對(duì)象的方法實(shí)例分析

    JavaScript類數(shù)組對(duì)象轉(zhuǎn)換為數(shù)組對(duì)象的方法實(shí)例分析

    這篇文章主要介紹了JavaScript類數(shù)組對(duì)象轉(zhuǎn)換為數(shù)組對(duì)象的方法,結(jié)合實(shí)例形式分析了javascript類數(shù)組對(duì)象的功能,以及類數(shù)組對(duì)象轉(zhuǎn)換為數(shù)組對(duì)象的相關(guān)方法與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-07-07

最新評(píng)論