Wooden Puzzle Block 遊戲實作
遊戲介紹
開發過程
1. 畫出遊戲的版面
1 | <div class="frame"> |
套上CSS
1 | .frame{ |
畫面效果
2. 創建table
雖然畫出畫面,不過到時候我們會需要有個二維陣列,用來記錄每個格子的狀態,像是:狀態0畫出白色,狀態1畫出藍色
1 | let table = [] |
我們來 console.table(table)
看看結果
3. 宣告各種方塊的資料,並且畫在畫面上
1 | let shape = [ |
做好資料後我們就可以畫在瀏覽器上,首先在html加上
1 | <div class="pendingBox"> |
CSS 加上
1 | .pendingBox{ |
pendingBox是個容器負責放那三個準備被使用者拖動的方塊
pedningOne~Three負責當作方塊節點,讓我們將資料配合DOM製作上去
創一個負責繪製Box的function
1 | //三個方塊的對照表,我們要知道 one two three分別產生了哪種 shpae |
畫面效果
下面多了三個隨機方塊
4. 處理拖動事件
我們要讓Box自由自在的拖動,並且畫到表格上方
滑鼠按下去
三個 Box 分別監聽 mousedown event
,當按下去時記下他們起始位置,並且設定 selectedBox
讓等等的 mousemove 事件知道該移動哪個 BOX 的 top
left
1 | var pendingOne = document.querySelector('.pendingOne') |
滑鼠拖動
滑鼠移動時根據他移動時的終點
,扣掉一開始按下去的距離就是我們所要設定的left
top
1 | document.addEventListener('mousemove', function(e) { |
畫面效果
滑鼠放下瞬間
這部分的邏輯會很多,首先我會想知道 Box 最後是在哪個座標被放下來的,並且對應到 table 在哪
下圖中有 A B 兩點,我只要 B 的 x y 扣掉 A 的 x y 就可以知道方塊被拖進來會相應到什麼位置
因為我的表格中的每一格都是50px,因此假設最後 Bx - Ax && By - Bx 算出來是 75 55 ,將他們個別除以 50 就知道他們墜落在表格中哪個部分,不過我會再加上25作為緩衝區域,我們來看下面的圖
雖然他的左上角靠在表格(0,0),不過事實上他更靠近中間,應該要算在中間
1 | document.addEventListener('mouseup', function (e) { |
取到該放的位置之後就可以將他畫上去了
話的時候必須注意
- 有沒有超過邊界
- 位置上是否已經有東西
最後如果話成功就回傳 success
1 | let result = fillTable(pendingBoxComparisonTable[selectedBox],{x:posX,y:posY}) |
如果回傳success我們需要先把畫成功的dom先砍了(因為他只是畫面效果),接者檢查是否有直行或橫列填滿一條了
getFullLine() 會找到 x y 軸有哪些是滿的,結果像是這樣
1 | {x:[2,5,6] y:[1,3,7]} |
接著再根據這些index去把他們的狀態都改成0並且讓他的style取消blue
1 | if(result === 'success'){ |
最後若是 pendingOne~three 都成功填滿了(代表也都被移除節點了),則要另外再加入新的三個 Box
1 | if(pendingOne.childElementCount === 0 && |
最終畫面
實作結果
https://curt6815463.github.io/woodenPuzzleBlock/