๐ฑโ๐คNinja Run
Rope swing And Jump Over!
์คํ์ด๋๋งจ ์ฒ๋ผ ๋กํ๋ฅผ ํ๊ณ ์ฅ์ ๋ฌผ์ ๋์ด๊ฐ๋ ๊ฒ์์ ๋๋ค!
๐Deploy Address: https://www.ninjarun.fun/
๐Frontend Address: https://github.com/Jay-WKJun/ninjaRun
๐Backend Address: https://github.com/Jay-WKJun/ninjaRunBack
Demo
(๊ฒ์ํ๋ฉด์ ์ผ๋ถ๋ฅผ ์ดฌ์ํ์ต๋๋ค)
์์ฐ์์
(2์๊ฐ 42๋ถ 21์ด ์์)
โ Motivation
-
why game?
- ๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ ์ฌ๋์๊ฒ ๋ค๋ฃจ์ด๋ณด๊ณ ์ถ์์ต๋๋ค.
- ์ง์ ๋ฌผ๋ฆฌ ํ์๋ค์ ์ฝ๋๋ก ๊ตฌํํด๋ณด๊ณ ์ถ์์ต๋๋ค.
- ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ฉฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ดํด๋๋ฅผ ๋์ฌ๋ณด๊ณ ์ถ์์ต๋๋ค.
-
why Rope Action?
- ๋์ค์ ์ด์ง๋ง ์ฌ๋๋ค์๊ฒ ์๋์ ์ผ๋ก ๋ ์๋ ค์ง ๋กํ์ก์ ์ด ์ฐธ์ ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- ๊ฐ์ธ์ ์ผ๋ก ์คํ์ด๋๋งจ๊ณผ ๊ณผ๊ฑฐ Worms ๋ผ๋ ๊ฒ์์ฒ๋ผ ์๋ ์๋ ๊ฒ์์ ์ข์ํฉ๋๋ค.
๐ Tech stack
-
Phaser 3
Sprite ๋ ๋๋ง๊ณผ ๋ฌผ๋ฆฌ์์ง์ ๋์์ ๊ทธ๋ฆฌ๊ณ ์กฐํ๋กญ๊ฒ ์ฌ์ฉํ ์ ์๋ FrameWork ์ด์๊ธฐ์ ์ ์ฒด์ ์ธ ๊ฒ์ ์ ์์ ํ์ฉํ์์ต๋๋ค.
-
matterJS
๋ Object๊ฐ ๊ตฌ์๊ด๊ณ(Constraint) ๊ธฐ๋ฅ๊ณผ ๊ณต๊ธฐ ์ ํญ ๋ฑ์ ๋์ฑ ๋ ์ ๊ตํ๊ณ ๋ณต์กํ ๋ฌผ๋ฆฌ ํ์์ ์ฌํํ๊ธฐ ์ํด ์ฌ์ฉํ์์ต๋๋ค.
-
Vanilla Javascript
๊ฐ๋จํ routing๊ณผ page rendering์ React๋ ๋๋ฌด OverEngineering์ด๋ผ ์๊ฐํ์ฌ ์ฒ์๋ถํฐ Vanilla Javascript๋ก ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
Main page์ Backend Server ํต์ ๊ทธ๋ฆฌ๊ณ routing์ ์ฌ์ฉ๋์์ต๋๋ค.
-
Webpack
Game์ ์๋ง์ asset๊ณผ Phaser framework๋ฅผ bundlingํ๊ธฐ ์ํด ์ฌ์ฉํ์ต๋๋ค.
-
Express.js
Backend api server์ ํ์ฉ๋์์ต๋๋ค.
๐ Deploy
Client
- Netlify๋ฅผ ์ด์ฉํด ๋ฐฐํฌ
Server
- AWS Elastic Beanstalk (EB)
- AWS Code Pipeline for Deployment automation
๐น How to Play?
-
ํ์ฐฝ ๋ฐ์ฌ
ํด๋ฆญ์, ๋ง์ฐ์ค ์ปค์ ์์น๋ก ํ์ฐฝ ๋ฐ์ฌ
-
๋ ์ ๋ง์ ์?
๋กํ ์์ฑ! Swing ์์!
-
์ ์๊ฒ ๋ง์ ์?
์ ์ ์ฒ์น!
-
-
Rope ๋๊ธฐ
Swing์ค ํด๋ฆญ, ๊ด์ฑ ๊ทธ๋๋ก ๋ ์๊ฐ๋ค
-
์ ์ ํ๋
์ ํ๋๋น 1์ ! 10์ด ๋น 1์ !
-
Rule!!
- ๋กํ์ ํ์ฐฝ์ ํ๋ฉด์ ํ๋๋ง ๊ฐ๋ฅ(swing์ค ํ์ฐฝ ๋ฐ์ฌ ๋ถ๊ฐ)
- 1๋ถ ๋ง๋ค, ๋์ด๋ ์ฆ๊ฐ!
๐ฏ Focus point!
OOP ์ค๊ณ (Object-Oriented Programming)
๊ฒ์์ด๊ธฐ์ ์ฌ๋ฌ Object๋ค์ ์ํธ์์ฉ์ ์ฝ๋๋ก ์ง๊ด์ ์ด๊ณ ๊ฐ๊ฒฐํ๊ฒ ๋ํ๋ด๊ธฐ ์ํด OOP ์ค๊ณ์ ํนํ ์ง์คํ์์ต๋๋ค.
๋์ ์์ง๋์ ๋ฎ์ ๊ฒฐํฉ๋
OOP์ ๋ค๋ฅธ ๋ฒ์น๋ ๋ชจ๋ ๊ณ ๋ คํ๋ฉฐ ๊ฐ๋ฐํ์์ง๋ง ํนํ ์์ง๋์ ๊ฒฐํฉ๋์ ์์น์
์์ ํจ์๊ฐ ํต์ฌ์ด ๋๋ Functional Programming๊ณผ
moduleํ ๊ฐ๋ฅํ ๊ฒ์ ๋ง๋ ๋ค๋ผ๋
ํจ์ ์์ฑ ์์น์ด ์ ์ฌ๋ค๊ณ ์๊ฐํ์ฌ ์กฐ๊ธ ๋ ์ ๊ฒฝ์ฐ๋ฉฐ ์ค๊ณํ์ต๋๋ค.
๋ํ์ ์ธ ์ ์ฉ ์์
์ด๋ฒ์ ์ฌ์ฉํ ์์ง์ โmatterJSโ ๋ฌผ๋ฆฌ์์ง์ Object๊ฐ ์ค์ค๋ก ์์ง์ด๋๋ก ํ๋ ๊ธฐ๋ฅ์ด ์์ด ์ฒ์์๋ frame์ด update๋ ๋๋ง๋ค velocity๋ฅผ ์ค์ ํด์ฃผ์ด ์๋๋ฅผ ์ผ์ ํ๊ฒ ์ ์งํด ์ฃผ์์ง๋ง,
ํด๋น ๊ธฐ๋ฅ์ ๋ค๋ฅธ Object์ ์ํธ์์ฉ์ด ํ์์๋๋ฐ ๊ฒ์ field์ update ํจ์์ ์๋ ๊ฒ์ ์ฝ๋์ ๋ญ๋น๋ผ๊ณ ์๊ฐ,
tween์ counter๋ฅผ ๊ฐ class๋ด์์ ์ฌ์ฉ, 1x -> 2x์ง์ ๊น์ง ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ์ซ์๋ฅผ count, ๊ทธ๊ฒ์ ์๋๋ก ์ผ์ ์ค์ค๋ก ์์ง์ด๋๋ก ์ค์ ํ์์ต๋๋ค.
์ด๋ฐ์์ผ๋ก class์ ์์ง์ฑ์ ๋์ด๊ณ ๊ฒฐํฉ์ฑ์ ์ค์์ต๋๋ค.
๋๋์
-
OOP์ ์ฅ์
-
๋งค์ฐ ์ง๊ด์ ์ธ ์ค๊ณ
ํ์ค์ธ๊ณ์ ๋ฌผ๊ฑด(Entity)์ ๋ง๋๋ ๊ฒ ์ฒ๋ผ ๋งค์ฐ ์ง๊ด์ ์ธ ์ค๊ณ๊ฐ ๊ฐ๋ฅํ์ฌ ์ข์์ต๋๋ค.
์ค๊ณ ๋ฟ๋ง ์๋๋ผ object๋ผ๋ฆฌ์ ์ํธ์์ฉ์๋ ๊ฐ๊ฐ์ method๋ง ํ์ฉํ๋ฉด ๋๋ ์ ์์ ๋งค์ฐ ํธ๋ฆฌํ๊ณ ์ง๊ด์ ์ด์ด์ ์ข์์ต๋๋ค.
ex) ์บ๋ฆญํฐ๊ฐ ์์ ์ ๊ฐ๋๋ฅผ 360๋ ํ์ ์ํค๋ ํ๋์ ์บ๋ฆญํฐ class์์ ํ๋์ method๋ก ์ ์ํ๊ณ ํ์ํ ๋, ์คํ์์ผ ์บ๋ฆญํฐ๋ฅผ ํ์ ์ํค๋๋ก ํ์์ต๋๋ค. ์ด๋ ๊ฒ ์คํ ๋ฆฌ๋ฅผ ์ง๋ฏ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋์ด ์ค๊ณ์ ์ฝ๋ ์์ฑ์ ๋งค์ฐ ์ฉ์ดํ์ต๋๋ค.
๋์์ ์ฝ๋ ๋ํ ์ง๊ด์ ์ผ๋ก ์ฝํ๋๋ก ์์ฑ์ด ๊ฐ๋ฅํ์ต๋๋ค.
-
-
๋ถํธํ๋ ์ , ๋จ์
-
๋ถ์์ ํ ์บก์ํ
javascript๋ง์ ๋ฌธ์ ์ผ ์ ์์ง๋ง ES2019์ ์ถ๊ฐ๋ private๋ฐ์ ์์ด capsulation์ด ๋ถ์์ ํ๋ค๋ ์ ์ ๋๋ค. class ํ๋์ ์๋ง์ method๋ค์ ๋ฒ์ ์ค์ ์ด ์ด๋ ค์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ฒ ๊ฐ์ต๋๋ค.
-
๋ฉ๋ชจ๋ฆฌ ๋นํจ์จ์ฑ
ํ์ํ ๊ธฐ๋ฅ์ ์์๋ฐ์ ๋ง๋ class์ ์ฌ๋ฌ ๊ธฐ๋ฅ ์ค์ ๋ช๊ฐ์ง์ธ๋ฐ ๊ทธ๊ฒ์ ์ํด instance๋ก ๋ชจ๋ ๊ฒ์ ๋ง๋ค์ด๋ด์ผ ํ๋ค๋ ์ ์ด ๋นํจ์จ ์ ์ด๋ผ ์๊ฐํ์ต๋๋ค.
ex) ์ค์ ๋ก ์ด๋ฒ project์์ sprite class๋ฅผ ์์๋ฐ์ ๋ง๋ Character class์ method ์ค์ 30%๋ง ์ฌ์ฉํ์ต๋๋ค.
interface๋ abstract class๋ฅผ ํตํด ํ์ํ method์ variable์ ์ ์ํ๋ ๊ฒ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
-
Vanilla Javascript Page
๊ทธ๋์ React๋ฅผ ์ฌ์ฉํ๋ฉด์ Vanilla Javascript์ ๋ฉ์ด์ ธ ์ด๋ฒ ๊ธฐํ์ Vanilla Vavascript์ ์นํด์ง๊ธฐ ์ํด Vanilla Javascript๋ก Page๋ฅผ ์์ ํ์ต๋๋ค. ์ด๋ฒ ๊ธฐํ๋ก ๋ค์๊ธ ๋ณธ์ง์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ๋ค์ ์๊ฐํด ๋ณผ ์ ์๋ ๊ณ๊ธฐ๊ฐ ๋์์ต๋๋ค.
Main Page๋ ์ ์ํ ์ฌ์ฉ์๋ค์ Name์ ํ์ ํ๊ณ Ranking Page๋ฅผ ์ํด ๋ฐ๋ก ๋ง๋ค์์ต๋๋ค.
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ (Business logic๊ณผ Game logic์ ๋ถ๋ฆฌ)
Logic์ ํฌ๊ฒ Main Page์์ ํ์ํ "Business Logic"๊ณผ ๊ฒ์์ ์ํ "Game Logic"์ด ์์ด ์ด ๋์ ๊ด์ฌ์ฌ๋ฅผ ํ์คํ๊ฒ ๋ถ๋ฆฌํ๊ธฐ ์ํด React์ ์ ์ฌํ๊ฒ Componentํ ๋ฐ Routing์ ๊ตฌํํ์ต๋๋ค.
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ์ ์ง์คํ ์ด์
- Game์ ์ ํ ์ํฅ์ ์ฃผ์ง ์๋ Logic
Game์ด ๊ตฌ๋๋๋๋ฐ ์ ํ ์๊ด์๋ Logic์ด๊ธฐ์ ์์ ํ ๋ถ๋ฆฌํ๊ณ ์ ํ์ต๋๋ค.
- Logic์ด ์์์ ๋, ๊ฐ๋ ์ฑ์ ์ ํ, ์ ์ง๋ณด์์ ๋ถํธํจ
Game Logic ์์์๋ ๋๋ ์ ์์ง๋ง ์์ ํ ํ์ผ์ ๋๋์ผ๋ก์ ์ ์ง๋ณด์ ๋ฉด์์ ํฌ๊ฒ ์ข์์ก์ต๋๋ค.
ex) ์ค์ ๋ก ๊ธฐ๋ก์ ์ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ api fetch Logic ๋ฐ๋ก, ๊ฒ์ ์ข ๋ฃ ๋ฐ ์ ์ฅ Logic ๋ฐ๋ก ๊ตฌํ ํ ํ ์ฐ๋ํ์ต๋๋ค. ์ด ์ , Game Logic ์์์ ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ๋ ๋ฌ๋ฆฌ ๊ต์ฅํ ๋น ๋ฅด๊ณ ํธ๋ฆฌํ๊ฒ ๊ตฌํํ๊ณ , ํ์ผ์ด ํ์คํ ๊ตฌ๋ถ๋์ด ๊ฐ๋ ์ฑ๋ ํจ์ฌ ์ข์ ์ก์ต๋๋ค.
ex) ์ฌ์ฉ์ ์ ๋ณด์ ๋ํ ๋ณ์๋ ๋ค๋ฅธ ํ์ผ๋ก ๋๋์ด ๋ฒ๋ฆฌ๋ ๋์ด๋์ ์ํฅ์ ์ฃผ๋ factor๋ค์ ์ ๋ฆฌํ๊ธฐ๊ฐ ํจ์ฌ ์์ํด์ ธ ๋์ด๋ ์กฐ์ ์๋ ํจ์ฌ ์์ํ์ต๋๋ค!
์ React์ฒ๋ผ ๊ตฌํ?
Phaser framework๊ฐ webpack ํน์ parcel์ ํตํ bundling์ด ํ์ํ๊ธฐ ๋๋ฌธ์ bundler์ ๋ง์ถฐ Vanilla Javascript page์ routing์ ๊ฐ Component๋ก ๋๋์ด SPA ํํ๋ก ๊ตฌํํ ํ์๊ฐ ์์์ต๋๋ค.
routing๋ ์ค์ api ์ฃผ์๋ฅผ ํตํด page ์๋ฃ๋ค์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ฏ๋ก,
window.history.pushState({ data, "/" });
๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋ก ํด๋น IP์ ๊ฐ์ ์๋ฃ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ ์๋์ง๋ง ์ฃผ์์ ํด๋นํ๋ Javascript ํ์ผ์ ๋ถ๋ฌ ํ์ด์ง๋ฅผ ๋ ๋๋ง ํจ์ผ๋ก์จ, ํ๋ ์ด์ด๊ฐ routing์ ์ฌ์ฉ ํ ์ ์๋๋ก ํ์ต๋๋ค.
๋๋์
- Vanilla Javascript ๊ฐ๊ฐ์ด ๋์ด์ ๋ฌ๋ค
๊ทธ๋์ React์ React router๋ฅผ ์ฌ์ฉํ๋ฉฐ Vanilla Javascript์ ๋ํ ๊ฐ๊ฐ์ ์์ด๋ฒ๋ ค์ React๊ฐ Vanilla Javascript๋ก ๋์ด ์๋ค๋ ์ฌ์ค๋ ์์ด๊ฐ๋ ์ฐธ์ ๊ฑฐ๊พธ๋ก Vanilla Javascript๋ก React์ ๊ธฐ๋ฅ๋ค์ ๋ง๋ค์ด ๋ณด๋ฉด์ Javascript ๋ณธ์ฐ์ ํ๋ก๊ทธ๋๋ฐ์ ๋ํ ๊ฐ๊ฐ์ ๋ค์ ์ด๋ฆด ์ ์์๋ ๊ธฐํ๊ฐ ๋์์ต๋๋ค.
๋ํ ์ด๋ ํ ๊ธฐ์ ์ ์ฝ๋งค์ด๋ ๊ฐ๋ฐ์๊ฐ ์๋ ์ด๋ค ๋ฌธ์ ๋ ์ค์ค๋ก ํด๊ฒฐํ๊ณ ๋ง๋ค์ด ๋ผ ์ ์๋ค๋ ํ๋ก๊ทธ๋๋จธ๋ก์์ ์์ ๊ฐ์ ์ป์์ต๋๋ค.
- ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ์ฝ๋ฉ ์ปจ๋ฒค์ ๋ค
์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ๋, ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ๋์ค์ ์ฝ๋๋ฅผ ํ๋ฒ ์ ๋ฆฌํ๊ณ ๋ค์ ์ถ๊ฐ ๋ฐ ์์ ํด๋๊ฐ๋ ์์ผ๋ก ์งํํ์ต๋๋ค. ๊ฐ๋ฐ ์๋๋ ์ข ๋ฆ์ด์ง๋ ๋๋์ด์์ง๋ง ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ์ฝ๋ฉ ์ปจ๋ฒค์ ๋ ธํํ๊ฐ ์๊ฒผ๋์ง ์ง์ ๊ฒฝํํด๋ณด๋ฉฐ ์๊ฐํด๋ณผ ์ ์๋ ๊ณ๊ธฐ๊ฐ ๋์์ต๋๋คโฆ!
์ ์ ๊ฒฝ์ฐ์ ์ง์ ์ปจ๋ฒค์ ์ ์ง์ผ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ฝ๋๊ฐ ์ ๋ฆฌ๊ฐ ์๋์ด ์์ ๋๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ณ ์ ํํ๊ฒ ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ ํน์ ์์ ์ ํ ์ ์์์ต๋๋ค!