add animations
This commit is contained in:
parent
6e8689771e
commit
69ced39496
66
src/Game.vue
66
src/Game.vue
@ -21,6 +21,7 @@ const board = $ref(
|
|||||||
let message = $ref('')
|
let message = $ref('')
|
||||||
let allowInput = true
|
let allowInput = true
|
||||||
let currentRowIndex = $ref(0)
|
let currentRowIndex = $ref(0)
|
||||||
|
let shakeRowIndex = $ref(-1)
|
||||||
const currentRow = $computed(() => board[currentRowIndex])
|
const currentRow = $computed(() => board[currentRowIndex])
|
||||||
|
|
||||||
// keep track of revealed letter state for the keyboard
|
// keep track of revealed letter state for the keyboard
|
||||||
@ -68,6 +69,7 @@ function completeRow() {
|
|||||||
if (currentRow.every((tile) => tile.letter)) {
|
if (currentRow.every((tile) => tile.letter)) {
|
||||||
const word = currentRow.map((tile) => tile.letter).join('')
|
const word = currentRow.map((tile) => tile.letter).join('')
|
||||||
if (!allWords.includes(word) && word !== answer) {
|
if (!allWords.includes(word) && word !== answer) {
|
||||||
|
shake()
|
||||||
showMessage(`Not in word list`)
|
showMessage(`Not in word list`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -106,6 +108,7 @@ function completeRow() {
|
|||||||
showMessage(answer.toUpperCase())
|
showMessage(answer.toUpperCase())
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
shake()
|
||||||
showMessage('Not enough letters')
|
showMessage('Not enough letters')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -116,6 +119,13 @@ function showMessage(msg: string) {
|
|||||||
message = ''
|
message = ''
|
||||||
}, 1000)
|
}, 1000)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function shake() {
|
||||||
|
shakeRowIndex = currentRowIndex
|
||||||
|
setTimeout(() => {
|
||||||
|
shakeRowIndex = -1
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@ -132,7 +142,11 @@ function showMessage(msg: string) {
|
|||||||
>
|
>
|
||||||
</header>
|
</header>
|
||||||
<div id="board">
|
<div id="board">
|
||||||
<div class="row" v-for="row in board">
|
<div
|
||||||
|
class="row"
|
||||||
|
v-for="(row, index) in board"
|
||||||
|
:class="{ shake: shakeRowIndex === index }"
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
v-for="(tile, index) in row"
|
v-for="(tile, index) in row"
|
||||||
:class="[
|
:class="[
|
||||||
@ -220,6 +234,7 @@ function showMessage(msg: string) {
|
|||||||
}
|
}
|
||||||
.tile.filled .front {
|
.tile.filled .front {
|
||||||
border-color: #999;
|
border-color: #999;
|
||||||
|
animation: zoom .2s;
|
||||||
}
|
}
|
||||||
.tile:not(.empty) {
|
.tile:not(.empty) {
|
||||||
border: none;
|
border: none;
|
||||||
@ -230,4 +245,53 @@ function showMessage(msg: string) {
|
|||||||
.tile.revealed .back {
|
.tile.revealed .back {
|
||||||
transform: rotateX(0deg);
|
transform: rotateX(0deg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes zoom {
|
||||||
|
0% {
|
||||||
|
transform: scale(1.1);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.shake {
|
||||||
|
animation: shake 0.5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes shake {
|
||||||
|
0% {
|
||||||
|
transform: translate(1px);
|
||||||
|
}
|
||||||
|
10% {
|
||||||
|
transform: translate(-2px);
|
||||||
|
}
|
||||||
|
20% {
|
||||||
|
transform: translate(2px);
|
||||||
|
}
|
||||||
|
30% {
|
||||||
|
transform: translate(-2px);
|
||||||
|
}
|
||||||
|
40% {
|
||||||
|
transform: translate(2px);
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
transform: translate(-2px);
|
||||||
|
}
|
||||||
|
60% {
|
||||||
|
transform: translate(2px);
|
||||||
|
}
|
||||||
|
70% {
|
||||||
|
transform: translate(-2px);
|
||||||
|
}
|
||||||
|
80% {
|
||||||
|
transform: translate(2px);
|
||||||
|
}
|
||||||
|
90% {
|
||||||
|
transform: translate(-2px);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translate(1px);
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user