js 簡單的推箱子小遊戲步驟解析--你們都玩過的

前言

推箱子小遊戲你們確定都玩過,之因此寫這篇文章,是以爲這個小遊戲足夠簡單好理解,你們看完文章以後,本身也能花上半天功夫敲出一個推箱子小遊戲來,若是喜歡的話能夠點波贊,或者關注一下,但願本文能夠幫到你們。html

本文首發於個人我的blog: obkoro1.com

demo:推箱子小遊戲

步驟解析:

本文代碼已經放在了github上面了,裏面也進行了很詳細的代碼註釋,能夠copy下來,在本地運行一下看看jquery

1. 渲染地圖

  1. html結構:

html結構十分簡單,只要弄一堆div,來放置地圖的class就能夠了,我這裏初始化了12*9個div,地圖裏最多九行高度。   
    這些div都是一樣大小,地圖渲染出來區別的只是顏色的不一樣。
  1. 地圖函數:git

    var box=$('.box div'); //地圖使用的div集合
       function create(){ //建立地圖函數
       box.each(function(index){ //index的數量是固定的,是box div下面div的數量
            // 每次建立地圖初始化div
           box.eq(index).removeClass();
       });
       box.each(function(index,element){ //循環整個div的數量 二維數組裏數量不夠的 默認爲空白
       //level爲關卡數 根據關卡渲染地圖 builder爲二維數組,爲地圖關卡
           if(builder[level][index]){ //過濾0
               box.eq(index).addClass('type'+builder[level][index]);
           }
       });
       box.eq(origin[level]).addClass("pusher"); //推箱人 皮卡丘位置
       }
    
       //第一關的地圖長這樣(下面只是栗子,不是代碼),0表明不可抵達區域,1表明目標(要被推到的地方),
       //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. 捕獲鍵盤事件,判斷是否能夠移動

使用$(document).keydown()jqery事件,捕獲鍵盤事件。github

  1. 捕獲鍵盤事件,上下左右以及wsad。web

    $(document).keydown(function (e) {
       var key=e.which;
       switch(key){
       //col 的值爲12,上下移動要12個div爲一個週期
       //方向鍵上或者w
       case 87:
       case 38:
           move(-col);//判斷移動函數
       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); //按鍵以後調判斷是否過關
      });
  2. 判斷是否能夠移動。

分爲兩個判斷條件:一個是推箱子,一個是不推箱子 天然移動,不然不移動皮卡丘。數組

function move(step){ //是否移動判斷
         // 分爲兩個判斷條件一個是推箱子,一個是不推箱子 天然移動。 不然不移動皮卡丘
         //step 上下是12個div一個週期,左右是1個div positin是皮卡丘的原來位置
        var pikaqiu1=box.eq(position);//皮卡丘如今的地方
        var pikaqiu2=box.eq(position+step);//皮卡丘要去的下一個地方
        var pushBox=box.eq(position+step*2);//箱子要去的下一個地方
        if(!pikaqiu2.hasClass('type4')&&( pikaqiu2.hasClass('type1')||pikaqiu2.hasClass('type2'))){ //天然移動
            //判斷:若是下一個div的class不包含type4(箱子),而且 下一個div含有type1(目標位置),或者type2(普通路徑)
            //這一步和下一步判斷是否有type4的緣由是普通路徑會變成有type4的路徑,這時候就會出現問題
            pikaqiu1.removeClass("pusher"); //移除當前皮卡丘
            pikaqiu2.addClass("pusher");//移動皮卡丘到下一個位置
            position=position+step;//增長position值
        }
        else if((pikaqiu2.hasClass('type4'))&&(!pushBox.hasClass('type4'))&&(pushBox.hasClass('type1')|| pushBox.hasClass('type2')) ) {
            //推箱子    
            //若是下一個div的class包含type4(箱子)而且 不包含重疊type4(箱子) 而且 包含class type1(目標位置)或者 包含type2(空路)
           pikaqiu2.removeClass('type4');//移除當前箱子
            pikaqiu1.removeClass("pusher");//移除當前皮卡丘
            pushBox.addClass('type4');//移動箱子到下一個位置
            pikaqiu2.addClass("pusher").addClass("type2");//
            //原本是type4 移除以後,這裏沒有class了,要變成普通路徑
            position=position+step;//增長position值 
        }
    }

3.勝利判斷:

每次移動都要調用這個勝利判斷。函數

function win(){ //勝利條件判斷
    if($(".type1.type4").length===goal){ //推的箱子與關卡設置經過箱子的數量對比
        if(level<9) {
            alert("666,挑戰下一關吧--OBKoro1");
            level++; //關卡+1
            goal = goalList[level];
            position = origin[level];
            create();
        }else {
            alert("厲害啊 大佬 通關了都");
        }
    }
}

代碼地址demo地址

結語

本文到這裏就結束了,喜歡的話,趕忙本身去敲一個出來,但願本文能夠幫助你們發散思惟。ui

最後:如需轉載,請放上原文連接並署名。碼字不易,感謝支持!本人寫文章本着交流記錄的心態,寫的很差之處,不撕逼,可是歡迎指點。而後就是但願看完的朋友點個喜歡,也能夠關注一下我。
我的blog and 掘金我的主頁 spa

以上2018.1.73d

相關文章
相關標籤/搜索