第30天時實作要做出打地鼠的遊戲。
首先在頁面有六個div
地洞元素,地洞元素的::after
偽元素設為背景url(dirt.svg)
。
.hole:after {
display: block;
background: url(dirt.svg) bottom center no-repeat;
background-size:contain;
content:'';
width: 100%;
height:70px;
position: absolute;
z-index: 2;
bottom:-30px;
}
並在每個地洞元素中加入鼴鼠元素<div class="mole"></div>
,再加入的元素中填滿父元素,並加入背景為mole.svg
,鼴鼠元素向下100%讓他無法被看見。
.mole {
background:url('mole.svg') bottom center no-repeat;
background-size:60%;
position: absolute;
top: 100%;
width: 100%;
height: 100%;
transition:all 0.4s;
}
之後建立時間亂數和選擇鼴鼠元素的亂數。
function randomTime(min, max){
return Math.round(Math.random() * (max-min)+min)
}
function randomHole(holes){
const index = Math.floor( Math.random() * holes.length )
const hole = holes[index]
if (lastHole === hole) {
return randomHole(holes)
}
lastHole = hole
return hole
}
過來將時間亂數和鼴鼠元素的亂數合起來,讓鼴鼠元素可以隨機時間並亂數出現且不重複。
function popUp() {
const time = randomTime(200, 1000)
const hole = randomHole(holes)
hole.classList.add('up')
setTimeout(()=>{
hole.classList.remove('up')
if (!timeUp) popUp()
}, time)
}
之後在start
按鈕上建立開始遊戲startGame
方法。
<button onClick="startGame()">Start!</button>
function startGame(){
scoreBoard.textContent = '0'
timeUp = false;
popUp()
setTimeout(()=>{
timeUp = true
}, 2000)
}
在startGame
方法中設定得分版為0,並將timeUp
設為false
,目的為當每次按下開始遊戲時重新設定。因為在開始遊戲中會設定時間內將timeUp
設為true
,當timeUp
為true
,就結束遊戲。
接下來設定得分,得分設定的方式為當點擊鼴鼠元素就讓分數加一,並移除CSS類別讓他回復初始向下100%的狀態,分數加一並把分數弄上得分版。
function bonk(e){
console.log(!e.isTrusted);
this.classList.remove('up')
score++
scoreBoard.textContent = score
}
moles.forEach(mole => mole.addEventListener('click', bonk))
<h1>Whack-a-mole! <span class="score">0</span></h1>
<button onClick="startGame()">Start!</button>
<div class="game">
<div class="hole hole1">
<div class="mole"></div>
</div>
。
<div class="hole hole6">
<div class="mole"></div>
</div>
</div>
isTrusted
是當事件觸發由誰觸發。若使用者觸發事件回傳true
,其他方式觸發事件回傳false
。打地鼠