Velog.io bak - LostMyCode/redstone-js GitHub Wiki

์˜จ๋ผ์ธ ๊ฒŒ์ž„์„ ๋ถ„์„ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ์ด์‹ํ•ด ๋ณด์•˜๋‹ค | Nothing's impossible

๋ฌธ๋“ ์ƒ๊ฐ์ด ๋‚ฌ๋‹ค.

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>

์ด ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค์ฝ”๋“œ๋Š” GitHub์— ๋ชจ๋‘ ๊ณต๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/LostMyCode/redstone-js

์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ์ด์‹ ๋ฒ„์ „์„ ์‹œ์—ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

https://rs.sigr.io/


์ด์ƒ, ๋ฐ”์œ ๋ถ„๋“ค์„ ์œ„ํ•œ ์„น์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์ด๋‚˜ ๊ฐœ๋ฐœ์˜ ๊ธฐ์ˆ ์ ์ธ ์ด์•ผ๊ธฐ์— ๊ด€์‹ฌ์ด ์—†์œผ์‹œ๋‹ค๋ฉด, ์—ฌ๊ธฐ์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋’ค๋กœ ๋Œ๋ ค๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค!

์ „์ œ: ์• ์ดˆ์— "๋ถ‰์€๋ณด์„"์ด๋ž€?

'MapleStory (๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ)'๋Š” ์˜ˆ์ „๋ถ€ํ„ฐ PC๊ฒŒ์ž„์„ ์ ‘ํ•œ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ํ•œ ๋ฒˆ์ฏค์€ ๋“ค์–ด๋ณธ ์ ์ด ์žˆ์„ ํ…๋ฐ, ๋ถ‰์€๋ณด์„๋„ ๊ฐ™์€ ์‹œ๊ธฐ์— ์‹œ์ž‘๋˜์–ด ์ธ๊ธฐ๋ฅผ ๋Œ์—ˆ๋˜ ์˜จ๋ผ์ธ ๊ฒŒ์ž„์ด๋‹ค.

์ •ํ™•ํžˆ ๊ธฐ์–ต์€ ๋‚˜์ง€ ์•Š์ง€๋งŒ, ๋ฒŒ์จ ์ถœ์‹œ 1์ฃผ๋…„ ์ •๋„ ๋œ ์˜ค๋ž˜๋œ ์˜จ๋ผ์ธ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋Œ€๋กœ ํ”Œ๋ ˆ์ด์–ด๋Š” ํ•ด๋งˆ๋‹ค ์ค„์–ด๋“ค๊ณ  ์žˆ๊ณ , ์˜ˆ์ „์˜ ํ™œ๊ธฐ์ฐฌ ๋ถ„์œ„๊ธฐ๋Š” ์‚ฌ๋ผ์ง€๊ณ  ํŒŒํ‹ฐ ์‚ฌ๋ƒฅ ๋“ฑ์€ ๊ฑฐ์˜ ์‚ฌ๋ผ์กŒ๋‹ค(๊ฑฐ์˜ ์†”๋กœ ํ”Œ๋ ˆ์ด๋กœ ์ด๋ค„์ง„๋‹ค).

๊ทธ๋ž˜ํ”ฝ์€ ์Šคํ‹ฐ์ปค๋ฅผ ๋ถ™์ธ ๋“ฏํ•œ 2D ๊ฒŒ์ž„์ด๋‹ค.

2D ํ•„๋“œ ์œ„๋ฅผ ๋งˆ์šฐ์Šค๋กœ ์›€์ง์—ฌ ์Šคํ‚ฌ์„ ์‚ฌ์šฉํ•ด ๋ชฌ์Šคํ„ฐ๋ฅผ ๊ณต๊ฒฉํ•ด ๊ฒฝํ—˜์น˜๋ฅผ ํš๋“ํ•˜๊ณ  ๋ ˆ๋ฒจ์„ ์˜ฌ๋ฆฌ๋Š” ์ •ํ†ต MMORPG.

์›ํ•˜๋Š” ๊ฒƒ: ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์ดํŠธ๋ฅผ ์—ด๊ณ  REDSTONE์„ ํ”Œ๋ ˆ์ดํ•˜๊ณ  ์‹ถ๋‹ค.

๋‹จ์ˆœํžˆ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ฌ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ž์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๊ฒŒ์ž„์ด ๋Œ์•„๊ฐ€๋Š” ๋ชจ์Šต์„ ๋ณด๊ณ  ์‹ถ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™˜๊ฒฝ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ , MacOS๋“  Windows๋“ , ์‹ฌ์ง€์–ด๋Š” PC๊ฐ€ ์•„๋‹Œ ์Šค๋งˆํŠธํฐ์—์„œ๋„ ์ž‘๋™ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

**์œˆ๋„์šฐ๊ฐ€ ์„ค์น˜๋œ PC์—์„œ ์„ค์น˜ํ•ด์•ผ๋งŒ ํ”Œ๋ ˆ์ดํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒŒ์ž„์ด ์‚ฌ์ดํŠธ๋งŒ ์—ด๋ฉด ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋„ ์ž‘๋™ํ•œ๋‹ค๋ฉด ๊ฐ๋™์ ์ด์ง€ ์•Š๋‚˜์š”? **

์•„๋งˆ "์‡ผ๋ชจ๋‚˜!"๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋Š” ๋ถ„๋“ค๋„ ๋งŽ์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค. '๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋Š” ๋ถ„๋“ค๋„ ๋งŽ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๊ฐœ์ธ์ ์œผ๋กœ๋Š” '์•ผ! ๋ฉ‹์ง€๋‹ค!" ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋˜๋„ค์š”!

๊ฒŒ๋‹ค๊ฐ€ ์ด์‹ํ•˜๋ฉด ์„ค์น˜๊ฐ€ ํ•„์š” ์—†์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ณธ์‚ฌ๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ข…๋ฃŒํ•ด๋„ ์˜๊ตฌ์ ์œผ๋กœ ๋ฌด๋ฃŒ๋กœ ๊ณ„์† ํ”Œ๋ ˆ์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฉ‹์ง„ ์ผ์ด ์žˆ์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋ธŒ๋ผ์šฐ์ € ํฌํŒ…์˜ ๊ณ„๊ธฐ๊ฐ€ ๋œ ์‚ฌ๊ฑด

๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ตฌ๋™ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์€ ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์–ด๋А ํ•ด์™ธ ํฌ๋Ÿผ์—์„œ REDSTONE์˜ ์„œ๋ฒ„ ํŒŒ์ผ(๋ช‡ ๋…„ ์ „์˜ ํŒŒ์ผ)์ด ๋ฐ€์‹คํ•˜๊ฒŒ ์œ ์ถœ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋œ ๊ฒƒ์ด ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์›๋ž˜ redgem(์ด์—ˆ๋˜๊ฐ€?) ๋ผ๋Š” REDSTONE์˜ ์—๋ฎฌ ์„œ๋ฒ„๊ฐ€ ์กด์žฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ณต์‹์ ์ธ ์‚ฌ๋žŒ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์„œ๋ฒ„ ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ฒ ๊ฑฐ๋‹ˆ ํ•˜๊ณ  ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์—์•ผ ์„œ๋ฒ„ ํŒŒ์ผ์ด ๊ณต๊ฐœ๋  ์ค„์€ ๋ชฐ๋ž๋‹ค.

์—๋ฎฌ ์„œ๋ฒ„: ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์„œ๋ฒ„, ์–ด๋–ค ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ์ž…์ˆ˜ํ•œ ์˜จ๋ผ์ธ ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋žจ์„ ๊ณต์‹ ์„œ๋น„์Šค์™€๋Š” ๋ณ„๋„๋กœ ์ œ3์ž๊ฐ€ ์šด์˜ํ•˜๋Š” ์„œ๋ฒ„. ๊ฒฝํ—˜์น˜ 2๋ฐฐ, ์•„์ดํ…œ 2๋ฐฐ ๋“ฑ ์›๋ž˜๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ์„ค์ •์œผ๋กœ ๊ฒŒ์ž„์„ ํ”Œ๋ ˆ์ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋ฎฌ์„œ๋ฒ„๋ฅผ ์„ ํ˜ธํ•˜๋Š” ํ”Œ๋ ˆ์ด์–ด๋„ ์ ์ง€ ์•Š๋‹ค. ์ฐธ๊ณ ๋กœ, ๋ณดํ†ต์€ ํšŒ์ƒ‰(ํ˜น์€ ์•„์›ƒ)

๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์˜จ๋‹ค

์„œ๋ฒ„ ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋ณ„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์ง€๋งŒ, ์กฐ์‚ฌํ•ด๋ณด๋‹ˆ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง์„ ํ†ตํ•ด ๊ฒŒ์ž„ ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ๋˜ ์ž”์—ฌ ์†Œ์Šค์ฝ”๋“œ๋„ ๋ฐœ๊ฒฌ๋๋‹ค.

๊ธฐ์—…์ด ๊ฐœ๋ฐœ, ์šด์˜ํ•˜๋Š” ๊ทœ๋ชจ์˜ ๊ฒŒ์ž„์„ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง๋งŒ์œผ๋กœ ๋ชจ๋‘ ๋‹ค์‹œ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์€ ์—„์ฒญ๋‚œ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ๊ทธ ์†Œ์Šค์ฝ”๋“œ๋„ ๋ฏธ์™„์„ฑ์ด์—ˆ๋Š”๋ฐ, ๊ฒŒ์ž„์˜ ๋งต ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

image.png

๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ์ง€๋ฉด์˜ ํ…์Šค์ฒ˜ ๋ฐฐ์น˜, ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฐฐ์น˜์™€ ๊ทธ ํ…์Šค์ฒ˜, NPC์˜ ๋ฐฐ์น˜์™€ ์—ญํ•  ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํŒŒ์ผ์ด ์žˆ๊ณ , ๊ทธ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ž‘์—…์„ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์†Œ์Šค ์ฝ”๋“œ์— ์ ํ˜€์žˆ๋˜ ๊ฑฐ๊ตฐ์š”.

**๊ธฐ์กด ์˜จ๋ผ์ธ ๊ฒŒ์ž„์˜ ์ด์‹ ๋‚œ์ด๋„๊ฐ€ ๋†’์€ ์ด์œ ๋Š” ๊ธฐ์กด ๊ฒŒ์ž„์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ๊ฐ๊ฐ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€, ๋˜ ์–ด๋–ค ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ์–ด๋ ต๊ณ  ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. **.

๊ณต๋žต ์‚ฌ์ดํŠธ์—์„œ ๋ณดํ†ต ๊ฒŒ์ž„์„ ํ”Œ๋ ˆ์ดํ•˜๋ฉด ์•Œ ์ˆ˜ ์—†๋Š” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ๋Š” ๊ณณ์ด ์žˆ๋Š”๋ฐ, ๊ทธ๊ฑด ๊ฒŒ์ž„์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ๊พธ์ค€ํžˆ ๋ถ„์„ํ•ด์„œ ๋ฝ‘์•„๋‚ธ ์ •๋ณด๋ฅผ ๋ณด๊ธฐ ์ข‹๊ฒŒ ์‹œ๊ฐํ™”ํ•ด ๋†“์€ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. (์ƒ๊ฐํ•ด๋ณด๋ฉด ๋Œ€๋‹จํ•˜๋„ค์š”)

ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ์•Œ๋ฉด ์žฅ๋ฒฝ์ด ์ƒ๋‹นํžˆ ๋‚ฎ์•„์ง„๋‹ค

์˜จ๋ผ์ธ ๊ฒŒ์ž„์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ ๊ตฌ์กฐ๋Š” ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ๊ณผ ๋‹ฌ๋ฆฌ ๋…์ฐฝ์ ์ธ ๊ตฌ์กฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ ์ดํ•ดํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์–ด๋ ค์šด ์ผ์ด์ง€๋งŒ, ๊ทธ ๋‹จ์ดˆ๋ฅผ ์žก์€ ์†Œ์Šค์ฝ”๋“œ์— ์ ํ˜€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚œ์ด๋„๊ฐ€ ๋งŽ์ด ๋‚ฎ์•„์กŒ๋‹ค.

๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ๋‚œ์ด๋„๊ฐ€ ๋†’๊ธด ํ•˜์ง€๋งŒ์š”.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ๋„ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ œ๋ฅผ ๋ณด๊ณ  ๋˜‘๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ฉด ๋งต ๋ฐ์ดํ„ฐ์˜ ํ…์Šค์ฒ˜ ์ •๋ณด๋‚˜ ๋ฐฐ์น˜ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Canvas์— ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋ฆฌ๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฒŒ์ž„ ๋งต์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ .

์›๋ž˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋Œ์•„๊ฐ€๋Š” ์˜จ๋ผ์ธ ๊ฒŒ์ž„(์ฃผ๋กœ io ๊ฒŒ์ž„์ด๋ผ๋Š” ๊ณ„์—ด์˜ ๊ฒŒ์ž„)์„ ๊ฐœ๋ฐœ, ์šด์˜ํ•ด์™”๊ธฐ ๋•Œ๋ฌธ์—, ์› ์ •๋ณด๋งŒ ์žˆ์œผ๋ฉด! ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋˜ ์ฐจ์— ์ด๊ฑฐ์˜€๊ธฐ ๋•Œ๋ฌธ์— ํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ์–ด์š” ใ…‹ใ…‹

REDSTONE ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ถ„์„์˜ ์„ ๊ตฌ์ž๊ฐ€ ์žˆ์—ˆ๋‹ค

์‚ฌ์‹ค ํ…์Šค์ฒ˜ ํŒŒ์ผ(์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํŒŒ์ผ)์˜ ์ฝ๊ธฐ ์ฒ˜๋ฆฌ๋Š” ์ œ๊ฐ€ ๊ฐ€์ ธ์˜จ ์†Œ์Šค์ฝ”๋“œ์— ๋‚˜์™€์žˆ์ง€ ์•Š์•„ ๊ตฌ์กฐ๋ฅผ ์•Œ ์ˆ˜ ์—†์—ˆ๋Š”๋ฐ, ๋‹คํ–‰ํžˆ๋„ ๋ช‡ ๋…„ ์ „์— ๋ฌธ์„ฑ์ค€๋‹˜์ด ํ…์ŠคํŠธ๋ฅผ ๋ถ„์„ํ•ด์„œ ํ…์Šค์ฒ˜๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ทฐ์–ด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ณต๊ฐœํ•˜์‹  ๋ถ„์ด ๊ณ„์…จ์–ด์š”.

์ œ์ž‘์ž๋Š” 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)์ด ์–ด๋–ป๊ฒŒ ๋งต ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๋“ค์ด๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ํˆด์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ–ˆ์ง€๋งŒ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒ๋žตํ•œ๋‹ค.

์†”์งํžˆ ์ด ๋ถ€๋ถ„์€ ๊ฒฝํ—˜์ด ๊ฑฐ์˜ ์—†์–ด์„œ ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋„์›€์„ ์š”์ฒญํ•ด ํŒ์ด๋‚˜ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๊ธฐ๋„ ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ •๋ง ํž˜๋“  ์ž‘์—…์ž…๋‹ˆ๋‹ค.

๋์ด ๋ณด์ด์ง€ ์•Š๊ณ , ๋•Œ๋กœ๋Š” ์ •๋‹ต์„ ์–ป์ง€ ๋ชปํ•  ๋•Œ๋„ ์žˆ์–ด์„œ ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค๋‹ค ๋ณด๋‹ˆ ํƒ€ํ˜‘ํ•œ ๋ถ€๋ถ„๋„ ์ ์ง€ ์•Š์•˜์–ด์š”.

์ง€๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Canvas์— ๊ทธ๋ฆฌ๊ธฐ

๊ทธ๋ฆฌ๊ณ  ๋งต ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ€์ผ, ์˜ค๋ธŒ์ ํŠธ, 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://youtu.be/EDfWIh6I244

๋“œ๋””์–ด ๊ฒŒ์ž„์„ฑ์ด ์ƒ๊ฒผ์–ด์š” (์•„์ง์€ ๋ถ€์กฑํ•˜์ง€๋งŒ)

๋ ˆ๋“œ์Šคํ†ค ๋ณธ๊ฐ€์™€๋Š” ๋‹ฌ๋ฆฌ ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „์€ ์กฐ์ •์ด ์ž์œ ์ž์žฌ๋กœ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜์ƒ์—์„œ์ฒ˜๋Ÿผ ์น˜ํŠธ๊ธ‰์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ๊นŒ์ง€ ํ™”๋ คํ•œ ์ˆ˜์ •์€ ์—๋ฎฌ ์„œ๋ฒ„์—์„œ๋„ ๋ณผ ์ˆ˜ ์—†๋Š” ํ’๊ฒฝ์ด๊ฒ ์ฃ ?

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

Structures in C: From Basics to Memory Alignment

โš ๏ธ **GitHub.com Fallback** โš ๏ธ