Velog.io bak - LostMyCode/redstone-js GitHub Wiki
๋ฌธ๋ ์๊ฐ์ด ๋ฌ๋ค.
PC ์จ๋ผ์ธ ๊ฒ์์ ๋๋ช ์ฌ 'REDSTONE(๋ถ์๋ณด์)'์ ์ปดํจํฐ์ ์ค์นํ์ง ์๊ณ ๋๊ตฌ๋ ๋ธ๋ผ์ฐ์ ๋ก ํ๋ ์ดํ ์ ์๋ค๋ฉด ์ผ๋ง๋ ์ข์๊น?
๊ทธ๋ ๊ฒ ๋๋ฉด ์๋น์ค๋ฅผ ์ข ๋ฃํด๋ ์์ํ ์ฆ๊ธธ ์ ์์ง ์๊ฒ ๋๊ฐ!
**์ข์, ๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋ ๋ ๋์คํค์ ๋ง๋ค์! **
์ด๋ ๊ฒ ํด์ ๋ชฉํ๊ฐ ๋ณด์ด์ง ์๋ ์ญ๋ ์ต๋ ๊ท๋ชจ์ ํ๋ก์ ํธ '๋ถ์๋ณด์ ๋ธ๋ผ์ฐ์ ๋ฒ์ ๊ฐ๋ฐ ๊ณํ'์ด ์์๋์๋ค.
"๊ธฐ์ฌ ์ฝ๊ธฐ ๊ท์ฐฎ์ผ๋๊น ๊ฒฐ๊ณผ๋ฌผ๋ง ๋ณด์ฌ์ค์!" '๋ผ๊ณ ์๊ฐํ์๋ ๋ถ๋ค์ ์ด ์์์ ์ฐธ๊ณ ํ์ธ์.
์ด๊ฒ ๋ญ์ผ? : REDSTONE์ด๋ผ๋ ์จ๋ผ์ธ ๊ฒ์์ GoogleChrome ๋ฑ์์ ์ด๊ธฐ๋ง ํ๋ฉด ์คํ๋๋๋ก ๋ง๋ '๋ธ๋ผ์ฐ์ ์ด์ ๋ฒ์ '์ ํ ์คํธ ํ๋ ์ด ์์์ ๋๋ค.
YouTube: ๋ถ์๋ณด์ ๋ธ๋ผ์ฐ์ ๋ฒ์ 2023๋ ๋ง ์ฑ๋ฐ
<iframe width="560" height="315" src="https://www.youtube.com/embed/EDfWIh6I244" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>https://github.com/LostMyCode/redstone-js
์ด์, ๋ฐ์ ๋ถ๋ค์ ์ํ ์น์ ์ด์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ด๋ ๊ฐ๋ฐ์ ๊ธฐ์ ์ ์ธ ์ด์ผ๊ธฐ์ ๊ด์ฌ์ด ์์ผ์๋ค๋ฉด, ์ฌ๊ธฐ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ค๋ก ๋๋ ค๋ ๊ด์ฐฎ์ต๋๋ค!
'MapleStory (๋ฉ์ดํ์คํ ๋ฆฌ)'๋ ์์ ๋ถํฐ PC๊ฒ์์ ์ ํ ์ฌ๋์ด๋ผ๋ฉด ํ ๋ฒ์ฏค์ ๋ค์ด๋ณธ ์ ์ด ์์ ํ ๋ฐ, ๋ถ์๋ณด์๋ ๊ฐ์ ์๊ธฐ์ ์์๋์ด ์ธ๊ธฐ๋ฅผ ๋์๋ ์จ๋ผ์ธ ๊ฒ์์ด๋ค.
์ ํํ ๊ธฐ์ต์ ๋์ง ์์ง๋ง, ๋ฒ์จ ์ถ์ 1์ฃผ๋ ์ ๋ ๋ ์ค๋๋ ์จ๋ผ์ธ ๊ฒ์์ ๋๋ค.
์์๋๋ก ํ๋ ์ด์ด๋ ํด๋ง๋ค ์ค์ด๋ค๊ณ ์๊ณ , ์์ ์ ํ๊ธฐ์ฐฌ ๋ถ์๊ธฐ๋ ์ฌ๋ผ์ง๊ณ ํํฐ ์ฌ๋ฅ ๋ฑ์ ๊ฑฐ์ ์ฌ๋ผ์ก๋ค(๊ฑฐ์ ์๋ก ํ๋ ์ด๋ก ์ด๋ค์ง๋ค).
๊ทธ๋ํฝ์ ์คํฐ์ปค๋ฅผ ๋ถ์ธ ๋ฏํ 2D ๊ฒ์์ด๋ค.
2D ํ๋ ์๋ฅผ ๋ง์ฐ์ค๋ก ์์ง์ฌ ์คํฌ์ ์ฌ์ฉํด ๋ชฌ์คํฐ๋ฅผ ๊ณต๊ฒฉํด ๊ฒฝํ์น๋ฅผ ํ๋ํ๊ณ ๋ ๋ฒจ์ ์ฌ๋ฆฌ๋ ์ ํต MMORPG.
๋จ์ํ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ๋ ๊ฒ๋ง์ผ๋ก ์์ ์ด ์ข์ํ๋ ๊ฒ์์ด ๋์๊ฐ๋ ๋ชจ์ต์ ๋ณด๊ณ ์ถ์ ๋ฟ์ ๋๋ค.
๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋ค๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ , MacOS๋ Windows๋ , ์ฌ์ง์ด๋ PC๊ฐ ์๋ ์ค๋งํธํฐ์์๋ ์๋ํ๋ค๋ ๋ป์ ๋๋ค.
**์๋์ฐ๊ฐ ์ค์น๋ PC์์ ์ค์นํด์ผ๋ง ํ๋ ์ดํ ์ ์์๋ ๊ฒ์์ด ์ฌ์ดํธ๋ง ์ด๋ฉด ์ด๋ค ํ๊ฒฝ์์๋ ์๋ํ๋ค๋ฉด ๊ฐ๋์ ์ด์ง ์๋์? **
์๋ง "์ผ๋ชจ๋!"๋ผ๊ณ ์๊ฐํ์๋ ๋ถ๋ค๋ ๋ง์ผ์ค ๊ฒ๋๋ค. '๋ผ๊ณ ์๊ฐํ์๋ ๋ถ๋ค๋ ๋ง์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก๋ '์ผ! ๋ฉ์ง๋ค!" ๋ผ๊ณ ์๊ฐํ๊ฒ ๋๋ค์!
๊ฒ๋ค๊ฐ ์ด์ํ๋ฉด ์ค์น๊ฐ ํ์ ์์ ๋ฟ๋ง ์๋๋ผ, ๋ณธ์ฌ๊ฐ ์๋น์ค๋ฅผ ์ข ๋ฃํด๋ ์๊ตฌ์ ์ผ๋ก ๋ฌด๋ฃ๋ก ๊ณ์ ํ๋ ์ดํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ๋ฉ์ง ์ผ์ด ์์ ์ ์์๊น์?
๋ธ๋ผ์ฐ์ ์์ ๊ตฌ๋ํ๊ณ ์ถ๋ค๋ ์๊ฐ์ ์ค๋์ ๋ถํฐ ๊ฐ์ง๊ณ ์์๋๋ฐ, ์ด๋ ํด์ธ ํฌ๋ผ์์ REDSTONE์ ์๋ฒ ํ์ผ(๋ช ๋ ์ ์ ํ์ผ)์ด ๋ฐ์คํ๊ฒ ์ ์ถ๋๊ณ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ด ๊ณ๊ธฐ๊ฐ ๋์์ต๋๋ค.
์๋ redgem(์ด์๋๊ฐ?) ๋ผ๋ REDSTONE์ ์๋ฎฌ ์๋ฒ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์, ๊ณต์์ ์ธ ์ฌ๋์ด ์๋ ๋ค๋ฅธ ์ฌ๋์ด ์๋ฒ ํ์ผ์ ๊ฐ์ง๊ณ ์๊ฒ ๊ฑฐ๋ ํ๊ณ ์๊ฐํ์๋ค. ํ์ง๋ง ์ง๊ธ์์ผ ์๋ฒ ํ์ผ์ด ๊ณต๊ฐ๋ ์ค์ ๋ชฐ๋๋ค.
์๋ฎฌ ์๋ฒ: ์๋ฎฌ๋ ์ดํฐ ์๋ฒ, ์ด๋ค ๊ฒฝ๋ก๋ฅผ ํตํด ์ ์ํ ์จ๋ผ์ธ ๊ฒ์ ํ๋ก๊ทธ๋จ์ ๊ณต์ ์๋น์ค์๋ ๋ณ๋๋ก ์ 3์๊ฐ ์ด์ํ๋ ์๋ฒ. ๊ฒฝํ์น 2๋ฐฐ, ์์ดํ 2๋ฐฐ ๋ฑ ์๋๋ ๋ถ๊ฐ๋ฅํ ์ค์ ์ผ๋ก ๊ฒ์์ ํ๋ ์ดํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฎฌ์๋ฒ๋ฅผ ์ ํธํ๋ ํ๋ ์ด์ด๋ ์ ์ง ์๋ค. ์ฐธ๊ณ ๋ก, ๋ณดํต์ ํ์(ํน์ ์์)
์๋ฒ ํ์ผ์ด ์๋ค๊ณ ํด์ ๋ณ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง, ์กฐ์ฌํด๋ณด๋ ๋๊ตฐ๊ฐ๊ฐ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง์ ํตํด ๊ฒ์ ์๋ฒ๋ฅผ ๋ค์ ๋ง๋ค๋ ค๊ณ ํ๋ ์์ฌ ์์ค์ฝ๋๋ ๋ฐ๊ฒฌ๋๋ค.
๊ธฐ์ ์ด ๊ฐ๋ฐ, ์ด์ํ๋ ๊ท๋ชจ์ ๊ฒ์์ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง๋ง์ผ๋ก ๋ชจ๋ ๋ค์ ๋ง๋ ๋ค๋ ๊ฒ์ ์์ฒญ๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ๊ทธ ์์ค์ฝ๋๋ ๋ฏธ์์ฑ์ด์๋๋ฐ, ๊ฒ์์ ๋งต ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ถ๋ฌ์ค๋ ์ฒ๋ฆฌ์ ๋ํ ์ค๋ช ์ด ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค. ๋ฅผ ๋ฐ๊ฒฌํ๋ค.
๊ตฌ์ฒด์ ์ผ๋ก๋ ์ง๋ฉด์ ํ ์ค์ฒ ๋ฐฐ์น, ์ค๋ธ์ ํธ์ ๋ฐฐ์น์ ๊ทธ ํ ์ค์ฒ, NPC์ ๋ฐฐ์น์ ์ญํ ๋ฑ์ ์ ๋ณด๊ฐ ๋ด๊ธด ํ์ผ์ด ์๊ณ , ๊ทธ ํ์ผ์ ๋ถ๋ฌ์ค๋ ์์ ์ ํ๋ ๋ถ๋ถ์ด ์์ค ์ฝ๋์ ์ ํ์๋ ๊ฑฐ๊ตฐ์.
**๊ธฐ์กด ์จ๋ผ์ธ ๊ฒ์์ ์ด์ ๋์ด๋๊ฐ ๋์ ์ด์ ๋ ๊ธฐ์กด ๊ฒ์์ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด ๊ฐ๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋์ง, ๋ ์ด๋ค ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์ ์ฅ๋์ด ์๋์ง ํ์ ํ๋ ๊ฒ์ด ์๋นํ ์ด๋ ต๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ค. **.
๊ณต๋ต ์ฌ์ดํธ์์ ๋ณดํต ๊ฒ์์ ํ๋ ์ดํ๋ฉด ์ ์ ์๋ ์์ธํ ์ ๋ณด๋ฅผ ์์ธํ ์ค๋ช ํด ์ฃผ๋ ๊ณณ์ด ์๋๋ฐ, ๊ทธ๊ฑด ๊ฒ์์ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๊พธ์คํ ๋ถ์ํด์ ๋ฝ์๋ธ ์ ๋ณด๋ฅผ ๋ณด๊ธฐ ์ข๊ฒ ์๊ฐํํด ๋์ ๊ฒ์ผ ์๋ ์์ต๋๋ค. (์๊ฐํด๋ณด๋ฉด ๋๋จํ๋ค์)
์จ๋ผ์ธ ๊ฒ์์ ๋ฐ์ด๋๋ฆฌ ํ์ผ ๊ตฌ์กฐ๋ ํํ ๋ณผ ์ ์๋ ํ์ผ๊ณผ ๋ฌ๋ฆฌ ๋ ์ฐฝ์ ์ธ ๊ตฌ์กฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ์ํ์์ ์ดํดํ๋ค๋ ๊ฒ์ ์๋นํ ์ด๋ ค์ด ์ผ์ด์ง๋ง, ๊ทธ ๋จ์ด๋ฅผ ์ก์ ์์ค์ฝ๋์ ์ ํ ์์๊ธฐ ๋๋ฌธ์ ๋์ด๋๊ฐ ๋ง์ด ๋ฎ์์ก๋ค.
๊ทธ๋๋ ์ฌ์ ํ ๋์ด๋๊ฐ ๋๊ธด ํ์ง๋ง์.
์๋ฐ์คํฌ๋ฆฝํธ๋ก๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฝ์ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ๋ฅผ ๋ณด๊ณ ๋๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ผ๋ฉด ๋งต ๋ฐ์ดํฐ์ ํ ์ค์ฒ ์ ๋ณด๋ ๋ฐฐ์น ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ด๋ฅผ ๋ฐํ์ผ๋ก Canvas์ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆฌ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ๊ฒ์ ๋งต์ ํ์ํ ์ ์๊ฒ ๋๋ ๊ฑฐ์ฃ .
์๋ ๋ธ๋ผ์ฐ์ ์์ ๋์๊ฐ๋ ์จ๋ผ์ธ ๊ฒ์(์ฃผ๋ก io ๊ฒ์์ด๋ผ๋ ๊ณ์ด์ ๊ฒ์)์ ๊ฐ๋ฐ, ์ด์ํด์๊ธฐ ๋๋ฌธ์, ์ ์ ๋ณด๋ง ์์ผ๋ฉด! ๋ผ๊ณ ์๊ฐํ๋ ์ฐจ์ ์ด๊ฑฐ์๊ธฐ ๋๋ฌธ์ ํ ์ ๋ฐ์ ์์์ด์ ใ ใ
์ฌ์ค ํ ์ค์ฒ ํ์ผ(์ด๋ฏธ์ง ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ ํ์ผ)์ ์ฝ๊ธฐ ์ฒ๋ฆฌ๋ ์ ๊ฐ ๊ฐ์ ธ์จ ์์ค์ฝ๋์ ๋์์์ง ์์ ๊ตฌ์กฐ๋ฅผ ์ ์ ์์๋๋ฐ, ๋คํํ๋ ๋ช ๋ ์ ์ ๋ฌธ์ฑ์ค๋์ด ํ ์คํธ๋ฅผ ๋ถ์ํด์ ํ ์ค์ฒ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ๋ณผ ์ ์๋ ๋ทฐ์ด๋ฅผ ๋ง๋ค์ด์ ๊ณต๊ฐํ์ ๋ถ์ด ๊ณ์ จ์ด์.
์ ์์๋ kohu๋์ด๋ผ๋ ๋ถ์ ๋๋ค.
๋ธ๋ผ์ฐ์ ์์ ์ด๊ณ REDSTONE์ ํ ์ค์ฒ ํ์ผ์ ๋๋๊ทธ์ค๋๋กญ์ผ๋ก ๋์ด๋ค ๋๊ธฐ๋ง ํ๋ฉด ๋ฐ๋ก ๋ณผ ์ ์๋ ํ๋ฅญํ ๊ธฐ๋ฅ์ ๋๋ค. ๋ช ๋ ์ ์ ์ด๋ฐ ๊ฒ์ ๋ง๋ค์ด๋ธ ์ฌ๋์ด ์์๋ค๋! ๋๋ฌด ๋๋จํ๋ค!
๋ ์ด์ ์๋์ง ์๊ณ ๋ ํ ์ค์ฒ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ๋ถ๋ฌ์ฌ ์ ์๋ ๊ตฌ์กฐ๊ฐ ๊ฑฐ๊ธฐ์ ์์๊ธฐ ๋๋ฌธ์, ์ด ๋ถ๋ถ์ ๋ํด์๋ ์์งํ๊ฒ ๋น๋ ค์ค๊ธฐ๋ก ํ์ต๋๋ค. (์ผ๋จ ํธ์ํฐ๋ก๋ ๋ณธ์ธ์๊ฒ DM์ ๋ณด๋์ต๋๋ค.)
์ด๋ฌํ ์์๋ค์ด ๋ณตํฉ์ ์ผ๋ก ์์ฉํ์ฌ ๋ง์นจ๋ด ๋ธ๋ผ์ฐ์ ๋ฒ์ REDSTONE์ ๊ฐ๋ฐ์ด ์์๋์๋ค.
**์ธ์ด: JavaScript **
๋ธ๋ผ์ฐ์ ์์ ๊ตฌ๋ํ๋ ์์ ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ ๊ฐ์ง๋ฅผ ์ ํํ๋ค. rust๋ c++๋ก ์์ฑํด์ wasm์ผ๋ก ๋ง๋ค ์๋ ์๊ฒ ์ง๋ง, ๊ตณ์ด ๊ทธ๋ ๊ฒ ํ ํ์์ฑ์ ๋๋ผ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ํฌ๊ธฐํ๋ค.
TypeScript๋ก ์ฐ๊ณ ์ถ์ ๋ง์๋ ์์ง๋ง, ํ์ ์ ์ ๋ฑ์ผ๋ก ์๊ฐ ๋ญ๋นํ๋ ๊ฒ๋ณด๋ค๋ ์ผ๋จ ์ผ๋จ ์น๊ณ ์์ง์ด๋ ๊ฒ๊น์ง๋ง ๋ชฉํ๋ก ํ๊ณ ์ถ์ด์ ์ด๋ฒ์ ํฌ๊ธฐํ๋ค. (๋ผ๊ณ ํด์ผ ํ๋, ๋งค๋ฒ ์ผ๋จ ์์ง์ฌ๋ณด์๋ ์๊ฐ์ด ์์๊ธฐ ๋๋ฌธ์ ํ์์ฒ๋ผ ํฌ๊ธฐ.)
๊ธฐ๋ณธ ๊ตฌ์ฑ: webpack5 + babel + webpack-dev-server
js๋ฅผ ์์ฑํ๋ฉด ๋ฒ๋ค๋ก ๋ฌถ์ด์ ํซ๋ก๋ฉํด์ฃผ๋ ์ต์ํ์ ๊ตฌ์ฑ์ด๋ค.
๊ทธ๋ฆฌ๊ธฐ: pixi.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ ํ์ค CanvasAPI๋ฅผ ์ฌ์ฉํด๋ ์ข์์ง๋ง, pixi.js๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
PixiJS๋ ์น ๋ธ๋ผ์ฐ์ ์ canvas ์์์ ๊ทธ๋ฆฌ๋ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ๋์ ๊ฒฝ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ์์ GPU๋ฅผ ๋ค๋ฃจ๋ WebGL ๊ธฐ์ ์ 2D์ ํนํํ์ฌ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
webgl์ 3D ๋๋ก์์ฉ์ด๋ผ๋ ์ธ์์ด ๊ฐํ์ง๋ง, pixi.js๋ 2D ๋๋ก์์ webgl๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์, ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ํ์ค CanvasAPI๋ณด๋ค ๋ ๋์ ์ฑ๋ฅ์ผ๋ก ๋ถ๋๋ฝ๊ฒ ์์ง์ด๋ ๊ฒ์ ๋ง๋ค ์ ์์ต๋๋ค.
ํ์ง๋ง ๊ทธ๋ฐ ๋ถ๋ถ์ ๊ทธ๋ค์ง ์ค์ํ๊ฒ ์๊ฐํ์ง ์๊ณ , ๋จ์ํ ๊ทธ๋ฆผ ์ฒ๋ฆฌํ ๋ pixi.js๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ดํดํ๊ธฐ๋ ์ฝ๊ณ , ์ฝ๊ฒ ์์ฑํ ์ ์๋ค๋ ๊ณผ๊ฑฐ์ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ํจ์จ์ ์ค์ํ๋ ์๋ฏธ์์ ์ฑํํ ๊ฒ์ ๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ๋ค์ ์์ฑํ ์์ค์ฝ๋๋ ๋ฏธ์์ฑ๋ ์ํ์๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ๋ต์ด ๊ฑฐ๊ธฐ์ ์๋ ๊ฒ์ด ์๋๋ผ ์ง์ ๋ถ์ํด์ ์๋ก์ด ๋ต์ ์ฐพ์์ผ ํ๋ค.
**"์๋ฌด๋๋ ๋งต ๋ฐ์ดํฐ์๋ ํ์ผ ์ ๋ณด ๊ฐ์ ๊ฒ์ด ํ์ผ ๋งจ ์๋ถํฐ โฏโฏ๋ฐ์ดํธ์งธ์ ์ ์ฅ๋์ด ์๋ ๊ฒ ๊ฐ๋ค"**๋ผ๋ ํ์ ํ ์ ์๋ ๋จ์.
์ด๋ฏธ์งโ
์ด๋ ๊ฒ ํ์ผ ์ ๋ณด๋ก ๋ณด์ด๋ ๋ฐ์ดํธ์ด์ด ์์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ํ๋, ์ง๋ฉด์ ํ์ผ ํ ์ค์ฒ๊ฐ ๋ง์ด ์ ์ฅ๋ ํ์ผ์ด ์๋ค๋ผ๋ ๋จ์. ์ด๋ฏธ์งโ
์ด๋ฏธ์ง์ ๊ฐ์ด ์์ ํ์ผ์ด ์๋ฉ ์์ฌ์๋ ํ์ผ์ด ์์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ฐ์ค์ ์ธ์๋๋ค.
**"์ง๋ ๋ฐ์ดํฐ์ ํ์ผ ์ ๋ณด ๊ฐ์ ๋ถ๋ถ์ ๊ธฐ์ฌ๋ '์ซ์'์ 'ํ์ผ ์ด๋ฏธ์ง์ ๋ฒํธ'๊ฐ ์ผ์นํ๋ ๊ฒ์ ์๋๊น?" ** "ํน์?
์ด ๊ฐ์ค์ ๊ฒ์ฆํ๊ธฐ ์ํด ์ซ์์ ํด๋น ๋ฒํธ์ ํ์ผ ์ด๋ฏธ์ง๋ฅผ ์์๋๋ก ๋์ดํด๋ดค์ต๋๋ค.
๊ทธ๋ฌ๋๋...
์ค! ๊ฒ์ ๋งต(๋์)์ ์งํ์ด ์์ฑ๋์๋ค์!
์ด์ ๊ฐ์ค์ด ๋ง์ ๊ฒ ๊ฐ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์๋ ์ฑ๊ณตํ ์ฌ๋ก๋ง ์ผ์ง๋ง, ์ธ์ด ๊ฐ์ค์ด ๋ง๋ ๊ฒ๋ณด๋ค ํ๋ฆฐ ๊ฒฝ์ฐ๊ฐ ํจ์ฌ ๋ ๋ง์ต๋๋ค.
๊ทธ๋์ ์ด ์์ ์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ํ๋ฃจ๊ฐ ๋๋ ๋๋ ์์ต๋๋ค.
๊ฒ๋ค๊ฐ ๊ฐ์ค์ ๊ฒ์ฆํ๋ ๊ฒ๋ ํ๋ค๊ธฐ๋ ํ๊ณ ์!
์ผ๋ จ์ ํ๋ฆ
๋ฐ์ด๋๋ฆฌ ์๋ํฐ๋ก ์ง๋ ๋ฐ์ดํฐ ์ผ๋ถ ์ฌ์์ฑํ๊ธฐ ใใใใใใใใใโ ๊ฒ์์ ์ด๊ณ ํด๋น ๋งต์ผ๋ก ์ด๋ ใใใใใใใใใโ ์ฌ์์ฑ ์ ๊ณผ ๋ฌ๋ผ์ง ๋ถ๋ถ์ ๋ณด๊ณ , ์ฌ์์ฑ๋ ๋ถ๋ถ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ๊ฐ์ค์ ์ธ์ด๋ค(์๋ฅผ ๋ค์ด, ์ค๋ธ์ ํธ์ ์์น๊ฐ ๋ฐ๋์๋ค๋ฉด ์ขํ ์ ๋ณด์ผ ๊ฒ์ด๋ค). ใใใใใใใใใโ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์ ์ง์ ์ ์ฝ๊ณ , ์ค๋ธ์ ํธ๋ฅผ ๊ทธ๋ฆด ๋ x, y ์ขํ๋ก ์ฝ์ ๊ฐ์ ๋ฐ์ํด ๋ณธ๋ค. ใใใใใใใใใโ ๊ทธ๋ ค์ง ๊ฒ์ด ๊ธฐ๋ํ ์์น์ ์์ผ๋ฉด OK, ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค์ ์๋
๊ทธ ์ธ์๋ ๊ฒ์ ์คํํ์ผ(exe)์ด ์ด๋ป๊ฒ ๋งต ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ค์ด๋์ง ์์๋ณด๊ธฐ ์ํด ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง ํด์ ์ฌ์ฉํ๊ธฐ๋ ํ์ง๋ง, ์์ธํ ๋ด์ฉ์ ์๋ตํ๋ค.
์์งํ ์ด ๋ถ๋ถ์ ๊ฒฝํ์ด ๊ฑฐ์ ์์ด์ ํ๊ณ๊ฐ ์์ด์ ์ปค๋ฎค๋ํฐ์ ๋์์ ์์ฒญํด ํ์ด๋ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ๊ธฐ๋ ํ๋ค.
ํ์ง๋ง ์ ๋ง ํ๋ ์์ ์ ๋๋ค.
๋์ด ๋ณด์ด์ง ์๊ณ , ๋๋ก๋ ์ ๋ต์ ์ป์ง ๋ชปํ ๋๋ ์์ด์ ๊ทธ๋ ๊ฒ ๋ง๋ค๋ค ๋ณด๋ ํํํ ๋ถ๋ถ๋ ์ ์ง ์์์ด์.
๊ทธ๋ฆฌ๊ณ ๋งต ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ผ, ์ค๋ธ์ ํธ, NPC ๋ฑ์ ๋ธ๋ผ์ฐ์ ์ ๋ฐฐ์นํ ์ ์์์ต๋๋ค.
๋งต์ ๊ทธ๋ํฝ์ ๊ฑฐ์ ๋๋ถ๋ถ ์ด์ํ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ํ๋ ์ด์ด๋ฅผ ๋ฐฐ์นํ๊ณ ๋งต์ ๋์๋ค๋ ์ ์๊ฒ ๋์์ ๋ ๋์จ ์์์ด ์๋ ์์์ ๋๋ค.
https://youtu.be/SgPJ1gGHntc?si=7vjMSra1Jt-7RHCj
์์งํ ๋งต์ ๋ฌ๋ฆด ์ ์์ ๋ฟ์ด๋ผ ๊ฒ์์ฑ์ ์ ํ ์์ต๋๋ค. ๊ทธ๋๋ ์ฌ๊ธฐ๊น์ง ๋๋ฌํ ์ ์์๋ค๋ ๊ฒ์ด ๊ธฐ๋ปค๊ธฐ ๋๋ฌธ์ ํ๋์ ๋ถ๊ธฐ์ ์ผ๋ก ์ผ์์ต๋๋ค.
pixi.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ๊ทธ๋ฆผ์ ๊ทธ๋ ธ๋๋ฐ, ๋์์ด ๋ ๊ฑด AnimatedSprite
์์ด์.
๋ ๋์คํค ๋งต์ ์ค๋ธ์ ํธ ์ค์๋ ๋ถ์ ๋ฑ ์ ๋๋ฉ์ด์ ์ด ๋ฐ๋ณต๋๋ ์ค๋ธ์ ํธ๊ฐ ์์ต๋๋ค.
์ด๋ฅผ ๋ธ๋ผ์ฐ์ ๋๋ก์์ผ๋ก ์ฌํํ ๋ AnimatedSprite
๊ฐ ํฐ ๋์์ด ๋์์ต๋๋ค.
// https://pixijs.download/dev/docs/PIXI.AnimatedSprite.html
import { AnimatedSprite, Texture } from 'pixi.js';
const alienImages = [
'image_sequence_01.png',
'image_sequence_02.png',
'image_sequence_03.png',
'image_sequence_04.png',
];
const textureArray = [];
for (let i = 0; i < 4; i++)
{
const texture = Texture.from(alienImages[i]);
textureArray.push(texture);
}
const animatedSprite = new AnimatedSprite(textureArray);
์ด๋ ๊ฒ ์ด๋ฏธ์ง๋ณ๋ก ๋ง๋ ์ฌ๋ฌ ๊ฐ์ PIXI.Texture๋ฅผ ๋ฐฐ์ด๋ก ์ ๋ฌํด ์ฃผ๋ฉด ์์์ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค์ด ์ฃผ๋ ์คํ๋ผ์ดํธ๊ฐ ๋ง๋ค์ด์ง๋๋ค.
์๋๋ง ์ง์ ํด ์ฃผ๋ฉด ์๋์ผ๋ก ํ๋ ์์ด ๊ฐฑ์ ๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค.
์ด๋ฒ ์ ๋ฐ์ดํธ๋ก ๋๋์ด ๋ธ๋ผ์ฐ์ ์ด์ ๋ฒ์ ์์๋ ๋งต์ ์๋ ๋ชฌ์คํฐ์ ์ ํฌ๋ฅผ ํ ์ ์๊ฒ ๋์์ต๋๋ค.
๋๋์ด ๊ฒ์์ฑ์ด ์๊ฒผ์ด์ (์์ง์ ๋ถ์กฑํ์ง๋ง)
๋ ๋์คํค ๋ณธ๊ฐ์๋ ๋ฌ๋ฆฌ ๋ธ๋ผ์ฐ์ ๋ฒ์ ์ ์กฐ์ ์ด ์์ ์์ฌ๋ก ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ์์์์์ฒ๋ผ ์นํธ๊ธ์ผ๋ก ํ ์ ์๊ฒ ๋์์ต๋๋ค.
์ด๋ ๊ฒ๊น์ง ํ๋ คํ ์์ ์ ์๋ฎฌ ์๋ฒ์์๋ ๋ณผ ์ ์๋ ํ๊ฒฝ์ด๊ฒ ์ฃ ?
https://github.com/LostMyCode/redstone-js
์ด๋ฒ์๋ ํ๋ ์ด์ด๊ฐ ์คํฌ์ ์ฌ์ฉํ์ฌ ๋ชฌ์คํฐ๋ฅผ ๊ณต๊ฒฉํ๋ ๊ตฌํ์ ์ํด ์คํฌ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์ฝ์ด๋ค์ด๋ ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
๊ฐ๋จํ ๋งํด์, ์ด ํ์ผ์๋ ์คํฌ์ ๊ฐ์์ ๊ทธ ๊ฐ์์ ํด๋นํ๋ ์คํฌ ๊ตฌ์กฐ์ฒด๊ฐ ์ ์ฅ๋์ด ์์ต๋๋ค.
๊ตฌ์กฐ์ฒด๋ ์๋์ ๊ฐ์ ์ด๋ฏธ์ง์ ๋๋ค.
struct __cppobj CSkillDefine
{
unsigned __int16 m_wSerial; // offset: 0000, size: 0002
unsigned __int16 m_wIconIndex; // offset: 0002, size: 0002
unsigned __int16 m_wType; // offset: 0004, size: 0002
unsigned __int16 m_wAction; // offset: 0006, size: 0002
unsigned __int16 m_wAction2; // offset: 0008, size: 0002
unsigned __int16 m_wOverlapAction; // offset: 000A, size: 0002
unsigned __int16 m_wOverlapAction2; // offset: 000C, size: 0002
unsigned __int16 m_wReiterationDamageCountSyncWithOverlapAction; // offset: 000E, size: 0002
unsigned __int16 m_wEnableJob; // offset: 0010, size: 0002
unsigned __int16 m_wSpeed; // offset: 0012, size: 0002
...
์ฐธ๊ณ ๋ก ์ด ๊ตฌ์กฐ์ฒด๋ ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง ํด์ ์ด์ฉํ์ฌ ์ถ์ถํ ๊ฒ์ด๋ค.
๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ๋ฉค๋ฒ m_wSerial
์ ํ์
์ด unsigned int16
์ด๋ฏ๋ก 2bytes์์ ์ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๊ตฌ์กฐ์ฒด ์์ ์์น์์ 2bytes๋ฅผ ์ฝ์ผ๋ฉด ๊ทธ๊ฒ์ด m_wSerial์ ๊ฐ์ด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ m_wIconIndex
๋ unsigned int16
๋ก 2bytes์ด๋ฏ๋ก ์์ ์์น์์ 2bytes ์ง์ ๋ ์์น์์ 2bytes๋ฅผ ์ฝ์ผ๋ฉด m_wIconIndex
์ ๊ฐ์ ์ป์ ์ ์์ต๋๋ค.
ํ์๋๋ก ์์๋๋ก ์ฝ์ผ๋ฉด ๋๊ฒ ๊ตฌ๋! ๋ผ๊ณ ์๊ฐํ๋๋ฐ, ์ค๊ฐ์ค๊ฐ ์ฝ์ ๊ฐ์ด ๋ง์ง ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค.
์ด๋ผ? ์์์๋ถํฐ ์์๋๋ก ์ ํํ๊ฒ ์ฝ์๋๋ฐ...?
์ฌ๊ธฐ์ ๊ฝค ์๊ฐ์ ๋ญ๋นํ๋๋ฐ, REDSTONE์ด ์๋ C++๋ก ๊ฐ๋ฐ๋ ๊ฒ์ด๊ณ , C++์์๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ค๋ฃฐ ๋ ์ ๋ ฌ์ด๋ผ๋ ๊ฒ์ ์์ํด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ด ์์ ์์ ๊ตฌ์กฐ์ฒด์ ๋ฉค๋ฒ๋ char, int, char, short์ด๋ฏ๋ก ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๋ char(1byte) + int(4bytes) + char(1byte) + short(2bytes)๋ก 8bytes์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ, ์ค์ ๋ก๋ 12bytes์ ๋๋ค.
๋ฐ์ดํฐ๊ฐ ๋นํ์์ด ๋นฝ๋นฝํ๊ฒ ๋ค์ด์ฐจ ์๋ ์ค ์์๋๋ฐ, ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์์์๋ ์ต์ ํ๋ฅผ ์ํด ์ ์ ํ ๋น ๊ณต๊ฐ(ํจ๋ฉ)์ด ๋ง๋ค์ด์ ธ ์์ต๋๋ค.
ํ์ผ์ ์ ์ฅ๋ ๊ตฌ์กฐ์ฒด ๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ณต์ฌ๋ง ํ๋ฉด ๊ฐ ๋ฉค๋ฒ์ ๊ฐ์ ํ ๋นํ ์ ์๋๋ก ๋์ผํ๊ฒ ๊ฐ๊ฒฉ์ ์ ์งํ ์ฑ๋ก ์ ์ฅ๋์ด ์๋ค๊ณ ์๊ฐ๋ฉ๋๋ค.
ํ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ง ๋ง์ง๋ค ๋ณด๋ฉด ์ด๋ฐ ๊ฒ๋ค์ ์์ํ ๊ธฐํ๊ฐ ๊ฑฐ์ ์์ด์ ์ฌ๊ธฐ์ ์ฒ์ ์๊ฒ ๋์์ต๋๋ค.
๊ทธ๋์ 'char ํ์ ์ ์ฝ์์ผ๋๊น 1byte ์์ผ๋ก ์ด๋ํด์ ๋ค์ ๊ฐ์ ์ฝ์ผ๋ฉด ๋๊ฒ ์ง! ๋ผ๋ ์๊ฐ์ผ๋ก ์์๋๋ก ์ฝ์ผ๋ฉด ๋งํ๋ ๊ฒ์ ๋๋ค.
์๋ ์ฝ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ตฌ์กฐ์ฒด ์ฝ๊ธฐ ์ฒ๋ฆฌ์ ์ผ๋ถ์ ๋๋ค. ์ด๋ ๊ฒ ํจ๋ฉ์ด ๋ค์ด๊ฐ๋ ๋ถ๋ถ์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ถ๋ถ์ ๊ฑด๋๋ฐ๋ ์์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค.
this.dodgeAngle = br.readUInt16LE();
this.hitAngleRange = br.readUInt16LE();
this.hitAngleRangePerLevel = br.readUInt16LE();
this.dodgeDistance = br.readUInt16LE();
this.paletteIndex = br.readUInt16LE();
br.offset += 2; // padding
this.enchantedEffectMask = br.readUInt32LE();
this.enchantedImage = br.readUInt16LE();
this.dustImageRange = br.readUInt16LE();
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋ณดํต ์ด๋ฐ ์ด๋ ค์ด ๊ฒ์ ์์ํ์ง ์์๋ ๋๋ ๋งํผ ๋ฐ๋๋ก ํ๋ค์์ต๋๋ค. (C++์ด๋ผ๋ฉด ๊ตฌ์กฐ์ฒด ๋ง๋ค์ด์ ๊ฑฐ๊ธฐ์ ํ์ผ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ง ๋ฃ์ผ๋ฉด ๋๋๋ฐ, JS๋ ํ๋ํ๋ ์ฝ์ด๋ค์ฌ์ ํจ๋ฉ์ด ๋ค์ด์๋ ๋ถ๋ถ๋ ์๊ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์)
์ด๋ ค์ธ ๊ฒ ๊ฐ์์ ์ ๋ถ JS๋ก ์ผ๋๋ฐ, ์ฐจ๋ผ๋ฆฌ C++๋ก ์์ฑํ๊ณ Emscripten์์ WebAssembly๋ก ์ปดํ์ผํ๋ ๊ฒ์ด ๋ ์ฌ์ธ ์๋ ์์ง ์์๊น? ์์ง ์ต์ ์ ํด๋ต์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
์ง๊ธ๊น์ง ์ฌ๋ฌ ๊ฐ์ง ์ด๋ ค์ ์์์๋ REDSTONE์ ๋ธ๋ผ์ฐ์ ์ด์ ํ๋ก์ ํธ๋ฅผ ์งํํด์๋ค. ํ์ง๋ง ์ํ๊น๊ฒ๋ ๋ณธ์ฌ๊ฐ ์ถ์๋ ์ง 1๋ ์ ๋ ์ง๋์ ๊ณผ็(์๋ฉธ)์ด ์งํ๋๊ณ ์๋ ๊ฒ์์ด๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์์ ํ๋ ์ดํ ์ ์๊ฒ ๋์ด๋ ์ธ๋ฉด๋นํ๊ณ ์๋ ์ค์ ์ ๋๋ค.
** ์ฌํ๋ค์! **
๊ทธ๋๋ ์ ๊ฐ ๋ฐฐ์ด ๊ฒ์ผ๋ก ์ฌ๊ธฐ๊น์ง ํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋๊ณ , ๋์ ํ๋ ๊ฒ์ด ์ฆ๊ฒ์ต๋๋ค.
๋ค์์๋ ์ข ๋ HOTํ ๋ถ์ผ์์ ๋ญ๊ฐ ์ฌ๋ฏธ์๋ ์ผ์ ํด๋ณด๊ณ ์ถ์ด์.
์ง๋ ๊ทธ๋ฆฌ๊ธฐ๋ฟ๋ง ์๋๋ผ ์คํฌ๊ณผ ์ฌ๋ฅ๊น์ง ๊ตฌํํ ์ ์์์ด์.
์ด์์ ๋๋ค.
๋ฌด๋ฃ ์จ๋ผ์ธ ๊ฒ์ '๋ ๋์คํค'์ ํด๋ณธ ์ ์ด ์๋ ๋ถ๋ค์ ์ด๋ฒ ๊ธฐํ์ ๋ธ
๋ธ๋ผ์ฐ์ ๋ฒ์ : https://rs.sigr.io/
์์ค์ฝ๋๋ฅผ ๋ชจ๋ ๊ณต๊ฐํ๊ณ ์์ต๋๋ค.
GitHub: https://github.com/LostMyCode/redstone-js
**ํฅํ ์ ๊ฐ (์ค์ ๊ตฌํ ์ฌ๋ถ๋ ๋ฏธ์ ) **
- ๋ค๋ฅธ ์บ๋ฆญํฐ(์ง์ ) ๊ตฌํ
- ์ฌ์ฉ ๊ฐ๋ฅํ ์คํฌ ์ฆ๊ฐ
- ์จ๋ผ์ธํ
- ์ฅ๋น
- ํ๋ ์ด์ด ์ํ, HP, CP
์ด๋ฏธ์ง ์ถ์ฒ: Microcontroller Embedded C Programming Lecture 149| Calculating structure size manually with and without padding