From db5184bc372a15b41b56d581e7532d7d8b40f23e Mon Sep 17 00:00:00 2001 From: Litrix Date: Tue, 25 Mar 2025 20:45:38 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=202048V2=E7=89=88=E6=8C=81?= =?UTF-8?q?=E4=B9=85=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/game2048/Game2048.vue | 19 ++++----- .../game2048/Game2048ScoreDigit.vue | 31 ++++---------- src/components/game2048/Game2048ScoreV2.vue | 40 ++++++++++++------- src/components/game2048/Game2048V2.vue | 37 +++++++++++++++-- src/stores/2048.ts | 4 +- src/utils/array/index.ts | 4 +- src/utils/async-queue.ts | 7 +++- 7 files changed, 87 insertions(+), 55 deletions(-) diff --git a/src/components/game2048/Game2048.vue b/src/components/game2048/Game2048.vue index b7f39c5..33ba9eb 100644 --- a/src/components/game2048/Game2048.vue +++ b/src/components/game2048/Game2048.vue @@ -316,7 +316,7 @@ const tileBackgroundColorMapping: Record = { */ function storeTileGrid() { game2048Store.rawTileGrid = tileGrid.map((row) => - row.map((tiles) => tiles.map((tile) => pick(tile, 'number'))), + row.map((tiles) => (tiles.length ? pick(tiles[0], 'number') : undefined)), ); } @@ -735,17 +735,18 @@ onMounted(async () => { 0, 0, ...game2048Store.rawTileGrid.map((row) => - row.map((rawTiles) => - rawTiles.map((rawTile) => { - const id = maxId++; - tileAddPromises.push(tileAddFutureMap.add(id)); - return { + row.map((rawTile) => { + if (!rawTile) return []; + const id = maxId++; + tileAddPromises.push(tileAddFutureMap.add(id)); + return [ + { ...rawTile, id, fromOthers: false, - }; - }), - ), + }, + ]; + }), ), ); if (game2048Store.isInitial) { diff --git a/src/components/game2048/Game2048ScoreDigit.vue b/src/components/game2048/Game2048ScoreDigit.vue index ba6c58d..3deea50 100644 --- a/src/components/game2048/Game2048ScoreDigit.vue +++ b/src/components/game2048/Game2048ScoreDigit.vue @@ -9,38 +9,22 @@ import { GAME_2048_DEBUG } from '@/env'; import { onBeforeUnmount, ref, useTemplateRef, watch } from 'vue'; -const { leaveDuration, enterDuration, linearEnter, reversed, ...props } = defineProps<{ - digit: number; +const { leaveDuration, enterDuration, linearEnter, linearLeave, reversed, ...props } = defineProps<{ + digit: number | string; leaveDuration: number; enterDuration: number; linearEnter: boolean; + linearLeave: boolean; reversed: boolean; }>(); const emit = defineEmits<{ - up: [number]; - finish: [number]; + up: []; + finish: []; }>(); const digit = ref(props.digit); const div = useTemplateRef('div'); const up = 'translateY(-100%)', down = 'translateY(100%)'; -let linearLeave = false; -watch( - () => linearEnter, - (v) => { - if (v) { - linearLeave = true; - } - }, - { flush: 'sync' }, -); -watch( - () => reversed, - () => { - linearLeave = false; - }, - { flush: 'sync' }, -); watch( () => props.digit, async (d) => { @@ -52,9 +36,8 @@ watch( fill: 'forwards', duration: leaveDuration, }).finished; - linearLeave = linearEnter; digit.value = d; - emit('up', d); + emit('up'); if (GAME_2048_DEBUG) { console.log('c2', linearEnter, enterDuration); } @@ -63,7 +46,7 @@ watch( fill: 'forwards', duration: enterDuration, }).finished; - emit('finish', d); + emit('finish'); }, ); onBeforeUnmount(() => { diff --git a/src/components/game2048/Game2048ScoreV2.vue b/src/components/game2048/Game2048ScoreV2.vue index adbd291..a8f92c7 100644 --- a/src/components/game2048/Game2048ScoreV2.vue +++ b/src/components/game2048/Game2048ScoreV2.vue @@ -7,12 +7,13 @@ diff --git a/src/components/game2048/Game2048V2.vue b/src/components/game2048/Game2048V2.vue index 305a74f..87785d6 100644 --- a/src/components/game2048/Game2048V2.vue +++ b/src/components/game2048/Game2048V2.vue @@ -78,15 +78,15 @@ export const tileMoveDuration = 110,