From 2c113785fda9e6f8ba0acc0a794f0089f8acf9f5 Mon Sep 17 00:00:00 2001 From: streakingman Date: Fri, 16 Sep 2022 11:20:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=89=E8=BF=9E=E5=A4=9A=E9=98=B6?= =?UTF-8?q?=E6=AE=B5=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.css | 1 + src/App.tsx | 39 ++++++++++++++++++++++++--------------- src/utils.ts | 8 ++++++++ 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/App.css b/src/App.css index 66b36e6..5973a35 100644 --- a/src/App.css +++ b/src/App.css @@ -47,6 +47,7 @@ align-items: center; border-radius: 8px; border: 2px solid #444; + transition: 0.3s; } .queue-container { diff --git a/src/App.tsx b/src/App.tsx index 803e447..6c32a52 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,8 +1,14 @@ -import React, { FC, MouseEventHandler, useEffect, useState } from 'react'; +import React, { + FC, + MouseEventHandler, + startTransition, + useEffect, + useState, +} from 'react'; import './App.css'; import { GithubIcon } from './GithubIcon'; -import { randomString } from './utils'; +import { randomString, waitTimeout } from './utils'; const icons = [`๐ŸŽจ`, `๐ŸŒˆ`, `โš™๏ธ`, `๐Ÿ’ป`, `๐Ÿ“š`, `๐Ÿฏ`, `๐Ÿค`, `๐Ÿผ`, `๐Ÿ`, `๐Ÿ€`]; @@ -45,11 +51,11 @@ const makeScene: (level: number) => Scene = (level) => { range[0] + Math.floor((range[1] - range[0]) * Math.random()); scene.push({ isCover: false, - x: column * 100 + offset, - y: row * 100 + offset, + status: 0, icon, id: randomString(4), - status: 0, + x: column * 100 + offset, + y: row * 100 + offset, }); }; @@ -61,7 +67,6 @@ const makeScene: (level: number) => Scene = (level) => { ); compareLevel -= 5; } - console.log(iconPool); for (const icon of iconPool) { for (let i = 0; i < 6; i++) { @@ -114,6 +119,7 @@ const Symbol: FC = ({ x, y, icon, isCover, status, onClick }) => { className="symbol" style={{ transform: `translateX(${x}%) translateY(${y}%)`, + opacity: status < 2 ? 1 : 0, }} onClick={onClick} > @@ -255,27 +261,30 @@ const App: FC = () => { }; // ็‚นๅ‡ปitem - const clickSymbol = (idx: number) => { + const clickSymbol = async (idx: number) => { if (finished) return; const updateScene = scene.slice(); const symbol = updateScene[idx]; if (symbol.isCover || symbol.status !== 0) return; - symbol.status++; + symbol.status = 1; let updateQueue = queue.slice(); + updateQueue.push(symbol); + + setQueue(updateQueue); + checkCover(updateScene); + + await waitTimeout(300); const filterSame = updateQueue.filter((sb) => sb.icon === symbol.icon); - if (filterSame.length === 2) { - // ไธ‰่ฟžไบ† - symbol.status++; + // ไธ‰่ฟžไบ† + if (filterSame.length === 3) { updateQueue = updateQueue.filter((sb) => sb.icon !== symbol.icon); for (const sb of filterSame) { const find = updateScene.find((i) => i.id === sb.id); - if (find) find.status++; + if (find) find.status = 2; } - } else { - updateQueue.push(symbol); } // ่พ“ไบ† @@ -320,7 +329,7 @@ const App: FC = () => { ? item.x : item.status === 1 ? sortedQueue[item.id] - : -2000 + : -1000 } y={item.status === 0 ? item.y : 895} onClick={() => clickSymbol(idx)} diff --git a/src/utils.ts b/src/utils.ts index 04f722c..6769b62 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -7,3 +7,11 @@ export const randomString: (len: number) => string = (len) => { } return res; }; + +export const waitTimeout: (timeout: number) => Promise = (timeout) => { + return new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, timeout); + }); +};