์์ํ ๋ฒ๊ทธ๋ ๊ณ์ํด์ ๋ฐ๊ฒฌ๋๊ณ ์์ง๋ง, ํต์ฌ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ตฌํ์ด ๋ ์ํ์์ ํ๋ก์ ํธ์ ์์ฑ๋๋ฅผ ๋์ด๊ธฐ ์ํด ์ดํํธ๋ฅผ ์ถ๊ฐํ์๋ค. ๊ฐ๋ฐํ ๋ ์์ฃผ ์ฐธ๊ณ ํ Tetri.io์ ๋ธ๋ญ ํ ์ค์ ์์ฑ์์ผ ๊นจํธ๋ฆด ๋ ๋ฐ์ํ๋ ์ดํํธ์ ๋๋์ด ์ข์๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์ด๋ฏธ์ง๋ Tetri.io์ด๋ค. ๋ธ๋ญ์ด ํ ์ค ์์ฑ๋๋ฉด, ์๋๋ก Board๊ฐ ์ด์ง ๋ด๋ ค๊ฐ๋ฉฐ ๋ธ๋ญ์ด ๊นจ์ง๋ ๋ฏํ ์ดํํธ๊ฐ ๋ฐ์ํจ์ ์ ์ ์๋ค. HandTris์๋ ํ ์ค์ด ์์ฑ๋์ ๋ Board๊ฐ ์๋๋ก ๋ด๋ ค๊ฐ๋ ํจ๊ณผ๋ CSS์ transform๊ณผ keyframes์ผ๋ก ๊ตฌํ์ด ๋์ด ์์๋ค. ๊ทธ๋์ ๋ธ๋ญ์ด ๊นจ์ง๋ ๋ฏํ ํจ๊ณผ๋ฅผ ๋ธ๋ญ ๊ณต๊ฒฉ์ ๋ฐ์ ๋ ์ ์ฉํ๊ธฐ๋ก ํ๋ค. ๊ณต๊ฒฉ๋ฐ์๋ค๋ ํ์๊ฐ ๋ถ์กฑํ๋ค๋ ํผ๋๋ฐฑ๋ ์ต์ข ๋ฐํ ์ดํ ์ด์์ง๊ป ๋ฐ์๊ธฐ ๋๋ฌธ์ด๋ค.
Particles.js(tsParticles)
์ ์ ํํ๋ก ๋ธ๋ญ์ด ๊นจ์ง๋๋ฏํ ์ดํํธ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฒ์์๋ Particles.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋ํ๋ค. ์น ๊ฐ๋ฐ ํ๊ฒฝ์ธ Next.js14 ๋ฒ์ ๊ณผ ํธํ์ด ๋์ง ์์์์ธ์ง๋ ๋ชฐ๋ผ๋ ์ด๋ค ํจ๊ณผ๋ ์ ์ฉ๋์ง ์์๋ค. ์ดํ Typescript๋ฅผ ์ง์ํ๋ tsparticles๋ฅผ ์๋ํด ๋ณด์๋ค. ์ต๊ทผ๊น์ง๋ ์ ๋ฐ์ดํธ๋๊ณ ์์๊ธฐ์ ์ฌ์ฉ๊ฐ๋ฅํ ์ค๋ก ๊ธฐ๋ํ์ผ๋ ์ฌ์ ํ ๋์ํ์ง ์์๋ค. ์ดํํธ๊ฐ ๋ฐ์ํ๋ ํ์ด๋ฐ์ ๊ฒ์์ ํ๋ฉด๋ง ๋ ๋๋ง ๋์๋ค๊ฐ ์ฌ๋ผ์ก๋ค.
react-confetti
์ดํํธ๊ฐ ์ ์ ์ฉ๋์ง ์๋์ง ์์ธ์ ์ฐพ์๋ณผ ์๊ฐ์ด ์์๊ธฐ์ ๋ค๋ฅธ ์ดํํธ๋ฅ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ํ ์คํธํด๋ณด๊ธฐ๋ก ํ์๋ค. ๋ง์ด ์ฌ์ฉ๋๋ค๊ณ ์๋ ค์ง ์ดํํธ์ธ react-confetti๋ ์๋๋๋ก ์๋ํ์๋ค. ์ด๋ ๋นต๋น ๋ ๊ฐ ๋ธ๋ผ์ฐ์ ์๋จ์์ ํ๋จ์ผ๋ก ํ๋ฅด๋ ํจ๊ณผ์ด๋ค. ๋ธ๋ญ์ด ๊นจ์ง๋ ํจ๊ณผ๋ฅผ ์ฃผ๊ธฐ์๋ ์ด๋ ค์ ๋ค.
react-confetti-explosion
npm ์ฌ์ดํธ์์ react-confetti ๋ณํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐพ์๋ณด๋ ์ค react-confetti-explosion ๋ฒ์ ์ด ์์์ ์๊ฒ ๋์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฆ๋๋ก explosion ํ๋ ํจ๊ณผ๋ฅผ ์ค ์ ์์๋ค. react-confetti ์ดํํธ๋ฅผ ์ ์ฉ์์ผฐ๋ ๋ฐฉ์๋๋ก explosion ๋ฒ์ ์ ์ ์ฉํด ๋ณด๋ ์๋๋๋ก ์ ์๋ํ์๋ค.
Parameter ์กฐ์
Parameter์ default ์ค์ ์ผ๋ก๋ effect๊ฐ ๋ฐ์ํ๋ ์ง์ ์์ ๋นต๋น ๋ ๋ ๋ธ๋ผ์ฐ์ ํ๋จ๊น์ง ํ๋ฅด๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก๋ฌ๋กํ ์์ผ๋ก ์กฐ๊ฐ์ด ๊ฝค ๋ง์ด ํฉ์ด์ง๋ค. ๋คํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด ํ๋ผ๋ฏธํฐ๋ฅผ ์์ ํ ์ ์๋๋ก ์ ๊ณตํ์๋ค.
<div>
<ConfettiExplosion
force={0.25}
duration={1300}
particleCount={25}
particleSize={7}
colors={[
"#c91212",
"#ec9898",
"#f4d4d4",
"#910909",
]}
width={400}
height={"-30px"}
/>
</div>
์ด๋ ์๋๋ฐฉ์๊ฒ ๊ณต๊ฒฉ์ ๋ฐ์์ ๋ ๋์ Board์ ๋ฐ์ํ๋ ์ดํํธ์ด๋ค. ๋ธ๋ญ์ด ์ฌ๋ผ์ด๊ณผ ๋์์ ๋ถ์ ๊ณ์ด์ ์กฐ๊ฐ๋ค์ด ํฐ์ง๋ ๋ฏํ ํจ๊ณผ๊ฐ ๋ฐ์ํ๋ค.
<div>
<ConfettiExplosion
force={0.25}
duration={1300}
particleCount={25}
particleSize={7}
colors={["#c8c8c8", "#e3e1e1", "#f7f7f7", "#878787"]}
width={400}
height={"-30px"}
/>
</div>
์ด๋ ์๋๋ฐฉ์ ๊ณต๊ฒฉํ์ ๋ ์๋๋ฐฉ์ Board์์ ๋ฐ์ํ๋ ์ดํํธ์ด๋ค. ๋ธ๋ญ์ด ์ฌ๋ผ์ด๊ณผ ๋์์ ํฐ์ ๊ณ์ด์ ์กฐ๊ฐ๋ค์ด ํฐ์ง๋ ๋ฏํ ํจ๊ณผ๊ฐ ๋ฐ์ํ๋ค.
๊ฒฐ๊ณผ
์ผ์ชฝ ํ ํธ๋ฆฌ์ค Board๋ ํ๋ ์ด์ด1์ด ๋ณด๋ ํ๋ ์ด์ด2์ ํ ํธ๋ฆฌ์ค Board์ด๋ค. ์ค๋ฅธ์ชฝ ํ ํธ๋ฆฌ์ค Board๋ ํ๋ ์ด์ด2์ ํ ํธ๋ฆฌ์ค Board์ด๋ค. ์ค๋ฅธ์ชฝ ํ ํธ๋ฆฌ์ค Board๋ฅผ ๋ณด๋ฉด ํ๋ ์ด์ด2๊ฐ ๊ณต๊ฒฉ์ ๋ฐ์ ์ํฉ์ด๊ธฐ์ ๋ถ์ ๊ณ์ด์ ์กฐ๊ฐ์ด ํฐ์ง๋๋ฏํ ํจ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค. ์ผ์ชฝ ํ ํธ๋ฆฌ์ค Board๋ฅผ ๋ณด๋ฉด ํ๋ ์ด์ด1์ด ํ๋ ์ด์ด2๋ฅผ ๊ณต๊ฒฉํ๊ธฐ์ ํฐ์ ๊ณ์ด์ ์กฐ๊ฐ์ด ํฐ์ง๋๋ฏํ ํจ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
์ฆ, ํ๋ ์ด์ด ์ ์ฅ์์ ์์ ์ด ๊ณต๊ฒฉ๋ฐ์ผ๋ฉด ๋ถ์์, ๊ณต๊ฒฉ์ ๊ฐํ ๊ฒฝ์ฐ ํฐ์์ ์กฐ๊ฐ์ด ํฐ์ง๋๋ฏํ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
์์ฐ์ ํจ์ ์์ด์ ์ง๋ํ ์ํฅ์ ์ฃผ๋ ๋ถ๋ถ์ ์๋์ง๋ง ์ดํํธ๊ฐ ์๊ณ , ์๊ณ ์ ์ฐจ์ด๋ ์๋ค๊ณ ์๊ฐํ๊ณ , ๊ฐ๋ฐ์ ์๊ธฐ ๋ง์กฑ์ ์ํด(?) ์ถ๊ฐํ์๋ค. ์๋ํ ๋๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๋ณํํ์ฌ ์ํ๋ ํจ๊ณผ๋ฅผ ๋ผ ์ ์์ด์ ๋ฟ๋ฏํ์๋ค. ๐