終於來到最後一天
透過前面29累積下來的經驗來做一個打地鼠吧
HTML/CSS結構
1 | <div class="hole hole1"> |
我們有地鼠的洞hole
和地鼠mole
而CSS的部分1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17.hole {
flex: 1 0 33.33%;
overflow: hidden;
position: relative;
}
.mole {
background:url('gophers.png') bottom center no-repeat;
background-size:80%;
position: absolute;
top: 100%;
width: 100%;
height: 100%;
transition:all 0.4s;
}
.hole.up .mole {
top:0%;
}
原始範例透過top:100%
以及父層的overflow:hidden
讓地鼠隱藏
當.hole
加了.up
之後,.mole
就會跑上來
哪些事情要做
對象:
- 按鈕(
<button onClick="startGame()">Start!</button>
) - 每隻地鼠做事件偵聽
1
moles.forEach((mole) => mole.addEventListener('click', hit))
涵式:
- 按下按鈕時: startGame()
- 哪個洞: getHole()
- 多久要回去 : getTime()
- 跑出來/回去 : show()
- 打擊: hit()
開始遊戲
既然有開始遊戲就有結束的時候,所以我們定義timpUp
判斷時間是否結束
還有分數score
一開始為0分;而地鼠的出現有先後之分,我們為了避免地鼠同地點重複出現我們要去判斷 現在這隻 和 剛剛那隻 有沒有一樣所以定義一個last
待會會用到。1
2
3
4
5
6
7
8
9
10
11
12
13let timpUp = false
let score = 0
let last
function startGame() {
timeUp = false
score = 0
scoreBoard.textContent = score
show()
setTimeout(() => {
timeUp = true
}, 10000) //遊戲時間10秒
}
開始遊戲,將timpUp設為false
,這邊我們定義false
代表時間還沒到
再透過setTimeout
設定10秒後將timpUp設為true
代表時間到。
地鼠出現
1 | function show() { |
出現與消失的方法簡單透過classList.add
和classList.remove
即可
這邊的關鍵在於哪個位置的地鼠,和出現多久(多久後要remove class),所以我們交給 getTime()
和getHole()
幫我們取得隨機位置和時間。
哪個位置的地鼠
1 | function getHole() { |
我們有6個洞,序列為0~5,所以我們取隨機數0~5
我們就取到這個隨機位置了const hole = holes[now]
回傳給show()函數前,我們做個小判斷,避免同一位置出現地鼠,
所以last
就派上用場了,讓last暫時等於現在取得的這個值,
而下次執行時就會判斷是否重複,如果重複就再做一次getHole()
,依此類推。
出現多久
1 | function getTime() {//自訂時間:0.5s(500)~1s(1000)間 |
可以自訂要出現多久,這邊我設定為0.5~1秒之間
這邊完成後就可以按下開始看到地鼠隨機跑出來了~
打擊
1 | function hit() { |
每打擊一次score就+1並顯示出來
而這邊有個小關鍵是,由於我們的this是地鼠,
打擊後要remove class的並不是地鼠(this),
而是他的父層this.parentNode.classList.remove('up')
除此之外,在這邊我為了防止一隻地鼠在短時間內可能被重複點擊
我們可以在點擊後立刻加上css屬性pointer-events:'none'
,
並在0.5秒後再讓這隻地鼠屬性改回pointer-events:'visible'
自己加上槌子
1 | <div class="game"> |
1 | .hammer{ |
我們把槌子放在<div class="game"></div>
裡面
(不放在外面(<body>
)是怕擋到其他元素)並設定css
接著我們將事件設定在game上面1
2
3
4
5
6
7
8const game = document.querySelector('.game')
const hammer = document.querySelector('.hammer')
function handler(e) {
const mousePos = {x: e.pageX,y: e.pageY}
hammer.style.top = mousePos.y-120 + 'px'
hammer.style.left = mousePos.x-80 + 'px'
}
game.addEventListener('mousemove', handler)
我們取得滑鼠位置後再賦予到槌子身上(再依需求修飾滑鼠位置的值)
最後在簡單加上槌子轉動的樣式1
2
3
4
5
6document.addEventListener('mousedown', () => {
hammer.style.transform = 'rotate(-45deg)'
})
document.addEventListener('mouseup', () => {
hammer.style.transform = 'rotate(0deg)'
})
就完成槌子的部分囉!
程式碼
1 | const holes = document.querySelectorAll('.hole'); |