24์‹œ๊ฐ„ ์•ˆ์— Rust ํ”Œ๋ ˆ์ดํ•˜๊ธฐ: ๊ฐœ์ธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

24์‹œ๊ฐ„ ์•ˆ์— Rust ํ”Œ๋ ˆ์ดํ•˜๊ธฐ: ๊ฐœ์ธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” Rust๋กœ ์ž‘์€ ๊ฒŒ์ž„์„ ๊ฐœ๋ฐœํ•œ ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ๋ฒ„์ „์„ ๋งŒ๋“œ๋Š” ๋ฐ ์•ฝ 24์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค(์ฃผ๋กœ ์ €๋…์ด๋‚˜ ์ฃผ๋ง์— ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค). ๊ฒŒ์ž„์ด ๋๋‚˜๋ ค๋ฉด ์•„์ง ๋ฉ€์—ˆ์ง€๋งŒ ๊ฒฝํ—˜ํ•ด ๋ณด๋ฉด ๋ณด๋žŒ์ฐฌ ๊ฒฝํ—˜์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฒŒ์ž„์„ ๊ตฌ์ถ•ํ•˜๋ฉด์„œ ์ œ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ๊ณผ ๊ด€์ฐฐํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Skillbox๋Š” ๋‹ค์Œ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. XNUMX๋…„ ์‹ค์Šต ์ฝ”์Šค "๋‚˜๋Š” PRO ์›น ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค".

์•Œ๋ฆผ: "Habr"์˜ ๋ชจ๋“  ๋…์ž๋ฅผ ์œ„ํ•œ - "Habr" ํ”„๋กœ๋ชจ์…˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Skillbox ๊ณผ์ •์— ๋“ฑ๋กํ•  ๋•Œ 10 ๋ฃจ๋ธ” ํ• ์ธ.

์™œ ๋Ÿฌ์ŠคํŠธ์ธ๊ฐ€?

์ œ๊ฐ€ ์ด ์–ธ์–ด๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š” ์ด ์–ธ์–ด์— ๋Œ€ํ•œ ์ข‹์€ ์†Œ์‹์„ ๋งŽ์ด ๋“ค์—ˆ๊ณ  ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์—์„œ ์ด ์–ธ์–ด๊ฐ€ ์ ์  ๋” ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ž„์„ ์ž‘์„ฑํ•˜๊ธฐ ์ „์—๋Š” Rust๋กœ ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•œ ๊ฒฝํ—˜์ด ๊ฑฐ์˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒŒ์ž„์„ ์“ฐ๋Š” ๋™์•ˆ ๋‚˜์—๊ฒŒ ์ž์œ ๋กœ์›€์„ ์ฃผ๊ธฐ์— ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์™œ ๊ฒŒ์ž„์ด๊ณ  ์–ด๋–ค ์ข…๋ฅ˜์˜ ๊ฒŒ์ž„์ธ๊ฐ€?

๊ฒŒ์ž„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค! ๋” ๋งŽ์€ ์ด์œ ๊ฐ€ ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ "ํ™ˆ" ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์ •๊ทœ ์ž‘์—…๊ณผ ๋„ˆ๋ฌด ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์ง€ ์•Š์€ ์ฃผ์ œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑด ๋ฌด์Šจ ๊ฒŒ์ž„์ธ๊ฐ€์š”? ์ €๋Š” Cities Skylines, Zoo Tycoon, Prison Architect ๋ฐ ํ…Œ๋‹ˆ์Šค ์ž์ฒด๋ฅผ ๊ฒฐํ•ฉํ•œ ํ…Œ๋‹ˆ์Šค ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๊ฐ™์€ ๊ฒƒ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์ด ๋†€๋Ÿฌ ์˜ค๋Š” ํ…Œ๋‹ˆ์Šค ์•„์นด๋ฐ๋ฏธ์— ๊ด€ํ•œ ๊ฒŒ์ž„์œผ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ๊ต์œก

์ €๋Š” Rust๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ธฐ์ดˆ ์ž‘์—…์ด ํ•„์š”ํ•œ์ง€ ์ •ํ™•ํžˆ ์•Œ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํ”ฝ์…€ ์…ฐ์ด๋”๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์œ ์—ฐํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ์šฉํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์—ฌ๋Ÿฌ Rust ๊ฒŒ์ž„ ์—”์ง„์„ ์‚ดํŽด๋ณด์•˜๊ณ  ์ตœ์ข…์ ์œผ๋กœ Piston๊ณผ ggez๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์šฐ์—ฐํžˆ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ž‘์€ 2D ๊ฒŒ์ž„์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋” ์ ํ•ฉํ•  ๊ฒƒ ๊ฐ™์•„์„œ ggez๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. Piston์˜ ๋ชจ๋“ˆ์‹ ๊ตฌ์กฐ๋Š” ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž(๋˜๋Š” ์ฒ˜์Œ์œผ๋กœ Rust๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ)์—๊ฒŒ๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ž„ ๊ตฌ์กฐ

๋‚˜๋Š” ํ”„๋กœ์ ํŠธ์˜ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” "๋•…", ์‚ฌ๋žŒ, ํ…Œ๋‹ˆ์Šค ์ฝ”ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ๋ฒ•์›์„ ๋Œ์•„๋‹ค๋‹ˆ๋ฉฐ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ํ–ฅ์ƒ๋˜๋Š” ๊ธฐ์ˆ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ๊ณผ ๋ฒ•์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ์ง‘๊ธฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๋” ์ด์ƒ ๋ฌด๋ฃŒ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์„ ์ƒ๊ฐํ•œ ํ›„ ์ผ์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ์ž„ ์ œ์ž‘

์‹œ์ž‘: ์›๊ณผ ์ถ”์ƒํ™”

ggez์—์„œ ์˜ˆ์ œ๋ฅผ ๊ฐ€์ ธ์™”๊ณ  ํ™”๋ฉด์— ์›์ด ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ด! ์ด์ œ ๋ช‡ ๊ฐ€์ง€ ์ถ”์ƒํ™”๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ๋ผ๋Š” ๊ฐœ๋…์—์„œ ๋ฒ—์–ด๋‚˜ ์ถ”์ƒํ™”ํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฐ์ฒด๋Š” ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ๋ Œ๋”๋ง๋˜๊ณ  ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// the game object trait
trait GameObject {
    fn update(&mut self, _ctx: &mut Context) -> GameResult<()>;
    fn draw(&mut self, ctx: &mut Context) -> GameResult<()>;
}
 
// a specific game object - Circle
struct Circle {
    position: Point2,
}
 
 impl Circle {
    fn new(position: Point2) -> Circle {
        Circle { position }
    }
}
impl GameObject for Circle {
    fn update(&mut self, _ctx: &mut Context) -> GameResult<()> {
        Ok(())
    }
    fn draw(&mut self, ctx: &mut Context) -> GameResult<()> {
        let circle =
            graphics::Mesh::new_circle(ctx, graphics::DrawMode::Fill, self.position, 100.0, 2.0)?;
 
         graphics::draw(ctx, &circle, na::Point2::new(0.0, 0.0), 0.0)?;
        Ok(())
    }
}

์ด ์ฝ”๋“œ ์กฐ๊ฐ์€ ๋˜‘๊ฐ™์ด ๋ฉ‹์ง„ ๋ฃจํ”„์—์„œ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ๊ฐœ์ฒด ๋ชฉ๋ก์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

mpl event::EventHandler for MainState {
    fn update(&mut self, context: &mut Context) -> GameResult<()> {
        // Update all objects
        for object in self.objects.iter_mut() {
            object.update(context)?;
        }
 
        Ok(())
    }
 
    fn draw(&mut self, context: &mut Context) -> GameResult<()> {
        graphics::clear(context);
 
        // Draw all objects
        for object in self.objects.iter_mut() {
            object.draw(context)?;
        }
 
        graphics::present(context);
 
        Ok(())
    }
}

main.rs์—๋Š” ๋ชจ๋“  ์ฝ”๋“œ ์ค„์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•˜๊ณ  ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„์˜ ๋ชจ์Šต์€ ์ด๋ ‡์Šต๋‹ˆ๋‹ค.
๋ฆฌ์†Œ์Šค -> ๋ชจ๋“  ์ž์‚ฐ์ด ์žˆ๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค(์ด๋ฏธ์ง€).
SRC
- ์—”ํ„ฐํ‹ฐ
โ€” game_object.rs
- Circle.rs
โ€” main.rs -> ๋ฉ”์ธ ๋ฃจํ”„

์‚ฌ๋žŒ, ์ธต ๋ฐ ์ด๋ฏธ์ง€

๋‹ค์Œ ๋‹จ๊ณ„๋Š” Person ๊ฒŒ์ž„ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์€ 32*32 ํƒ€์ผ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ์ถ•๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

24์‹œ๊ฐ„ ์•ˆ์— Rust ํ”Œ๋ ˆ์ดํ•˜๊ธฐ: ๊ฐœ์ธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

ํ…Œ๋‹ˆ์Šค ์ฝ”ํŠธ

ํ…Œ๋‹ˆ์Šค ์ฝ”ํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ์—ฐ๊ตฌํ•œ ํ›„ 4*2 ํƒ€์ผ๋กœ ํ…Œ๋‹ˆ์Šค ์ฝ”ํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ด ํฌ๊ธฐ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ 8๊ฐœ์˜ ๊ฐœ๋ณ„ ํƒ€์ผ์„ ํ•ฉ์น˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” ๋‘ ๊ฐœ์˜ ๊ณ ์œ ํ•œ ํƒ€์ผ๋งŒ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ  ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ „์ฒด์ ์œผ๋กœ 1๊ณผ 2๋ผ๋Š” ๋‘ ๊ฐœ์˜ ํƒ€์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”ํŠธ์˜ ๊ฐ ์„น์…˜์€ ํƒ€์ผ 1 ๋˜๋Š” ํƒ€์ผ 2๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํƒ€์ผ์€ ์ผ๋ฐ˜ ํƒ€์ผ๋กœ ๋ฐฐ์น˜ํ•˜๊ฑฐ๋‚˜ 180๋„ ๋’ค์ง‘์–ด ๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

24์‹œ๊ฐ„ ์•ˆ์— Rust ํ”Œ๋ ˆ์ดํ•˜๊ธฐ: ๊ฐœ์ธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

๊ธฐ๋ณธ ๊ตฌ์„ฑ(์กฐ๋ฆฝ) ๋ชจ๋“œ

์‚ฌ์ดํŠธ, ์‚ฌ๋žŒ, ์ง€๋„๋ฅผ ๋ Œ๋”๋งํ•œ ํ›„์— ๊ธฐ๋ณธ ์กฐ๋ฆฝ ๋ชจ๋“œ๋„ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด๊ฒƒ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ฐ์ฒด๊ฐ€ ์„ ํƒ๋˜๊ณ  ํด๋ฆญํ•˜๋ฉด ์›ํ•˜๋Š” ์œ„์น˜์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฒ„ํŠผ 1์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”ํŠธ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฒ„ํŠผ 2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ ์ˆ˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ 1๊ณผ 2๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์–ด๋–ค ๊ฐœ์ฒด๊ฐ€ ์„ ํƒ๋˜์—ˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์™€์ด์–ดํ”„๋ ˆ์ž„์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์ž…๋‹ˆ๋‹ค.

24์‹œ๊ฐ„ ์•ˆ์— Rust ํ”Œ๋ ˆ์ดํ•˜๊ธฐ: ๊ฐœ์ธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

์•„ํ‚คํ…์ฒ˜ ๋ฐ ๋ฆฌํŒฉํ† ๋ง ์งˆ๋ฌธ

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

์ œ๊ฐ€ ๋ณด๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•œ๊ณ„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋‹ค์‹œ ์ƒ๊ฐํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

  • ์ž์ฒด์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ์—”ํ„ฐํ‹ฐ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ด๋‹น ์—”ํ„ฐํ‹ฐ๋Š” ์ด๋ฏธ์ง€์™€ ์™€์ด์–ดํ”„๋ ˆ์ž„ ๋“ฑ ๋ฌด์—‡์„ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š”์ง€ "์•Œ" ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๊ฐœ๋ณ„ ์—”ํ„ฐํ‹ฐ ๊ฐ„์— ์†์„ฑ๊ณผ ๋™์ž‘์„ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: is_build_mode ์†์„ฑ ๋˜๋Š” ๋™์ž‘ ๋ Œ๋”๋ง). ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ Rust์—์„œ๋Š” ์ƒ์†์„ ๊ตฌํ˜„ํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ •๋ง ํ•„์š”ํ•œ ๊ฒƒ์€ ๋ ˆ์ด์•„์›ƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ๋žŒ๋“ค์„ ๋ฒ•์›์— ๋ฐฐ์ •ํ•˜๋ ค๋ฉด ๊ธฐ๊ด€ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์œ„ํ•œ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์—”ํ„ฐํ‹ฐ ์ž์ฒด๋Š” ๋น ๋ฅด๊ฒŒ ํ†ต์ œ๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๋ฐ์ดํ„ฐ์™€ ๋…ผ๋ฆฌ์˜ ํ˜ผํ•ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ข€ ๋” ์กฐ์‚ฌ๋ฅผ ํ•ด๋ณด๊ณ  ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ECS - ์—”ํ„ฐํ‹ฐ ๊ตฌ์„ฑ ์š”์†Œ ์‹œ์Šคํ…œ, ๊ฒŒ์ž„์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ECS์˜ ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋Š” ๋กœ์ง๊ณผ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์ƒ์† ๋Œ€์‹  ๊ตฌ์„ฑ;
  • ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์•„ํ‚คํ…์ฒ˜.

ECS์˜ ํŠน์ง•์€ ์„ธ ๊ฐ€์ง€ ๊ธฐ๋ณธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

  • ์—”ํ„ฐํ‹ฐ - ์‹๋ณ„์ž๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐœ์ฒด ์œ ํ˜•(์„ ์ˆ˜, ๊ณต ๋˜๋Š” ๊ธฐํƒ€ ํ•ญ๋ชฉ์ผ ์ˆ˜ ์žˆ์Œ)
  • ๊ตฌ์„ฑ ์š”์†Œ - ์—”ํ„ฐํ‹ฐ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ - ๋ Œ๋”๋ง ๊ตฌ์„ฑ ์š”์†Œ, ์œ„์น˜ ๋ฐ ๊ธฐํƒ€. ์ด๋Š” ๋ฐ์ดํ„ฐ์›จ์–ด ํ•˜์šฐ์Šค์ž…๋‹ˆ๋‹ค.
  • ์‹œ์Šคํ…œ - ๊ฐœ์ฒด์™€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋ฉฐ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋™์ž‘๊ณผ ๋…ผ๋ฆฌ๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ Œ๋”๋ง ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ๋ชจ๋“  ์—”ํ„ฐํ‹ฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ณ  ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ Œ๋”๋ง ์‹œ์Šคํ…œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ๊ตฌํ•œ ๊ฒฐ๊ณผ ECS๊ฐ€ ๋‹ค์Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

  • ์ƒ์† ๋Œ€์‹  ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ„ฐํ‹ฐ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ์–ด ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ฝ”๋“œ ํ˜ผ๋ž€์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • is_build_mode์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™€์ด์–ดํ”„๋ ˆ์ž„ ๋กœ์ง์„ ๋ Œ๋”๋ง ์‹œ์Šคํ…œ์˜ ๋™์ผํ•œ ์œ„์น˜์— ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

ECS๋ฅผ ๊ตฌํ˜„ํ•œ ํ›„ ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค -> ๋ชจ๋“  ์ž์‚ฐ์ด ์žˆ๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค(์ด๋ฏธ์ง€).
SRC
- ๊ตฌ์„ฑ ์š”์†Œ
โ€”position.rs
โ€” person.rs
- Tennis_court.rs
-floor.rs
-wireframe.rs
โ€” mouse_tracked.rs
- ์ž์›
โ€”mouse.rs
- ์‹œ์Šคํ…œ
โ€” ๋ Œ๋”๋ง.rs
- ์ƒ์ˆ˜.rs
- utils.rs
โ€” world_factory.rs -> ์„ธ๊ณ„ ๊ณต์žฅ ๊ธฐ๋Šฅ
โ€” main.rs -> ๋ฉ”์ธ ๋ฃจํ”„

์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋ฒ•์›์— ๋ฐฐ์ •ํ•ฉ๋‹ˆ๋‹ค

ECS๋Š” ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์—”ํ„ฐํ‹ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋…ผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ฒด๊ณ„์ ์ธ ๋ฐฉ๋ฒ•์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Š” ๊ฒฐ๊ตญ ๋ฒ•์› ๊ฐ„์— ์‚ฌ๋žŒ๋“ค์˜ ๋ถ„ํฌ๋ฅผ ์กฐ์งํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฌด์Šจ ์ง“์„ ํ•œ:

  • ํ• ๋‹น๋œ ๋ฒ•์›์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ Person์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • TennisCourt์— ๋ถ„์‚ฐ๋œ ์‚ฌ๋žŒ๋“ค์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ๋žŒ๊ณผ ์ฝ”ํŠธ๋ฅผ ๋ถ„์„ํ•˜๊ณ , ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”ํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ํ”Œ๋ ˆ์ด์–ด๋ฅผ ํ•ด๋‹น ์ฝ”ํŠธ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” CourtChoosingSystem์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฒ•์›์— ๋ฐฐ์ •๋œ ์‚ฌ๋žŒ์„ ์ฐพ์•„ ๊ทธ ์ž๋ฆฌ์— ์—†์œผ๋ฉด ํ•„์š”ํ•œ ๊ณณ์œผ๋กœ ์‚ฌ๋žŒ์„ ๋ณด๋‚ด๋Š” PersonMovementSystem์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

24์‹œ๊ฐ„ ์•ˆ์— Rust ํ”Œ๋ ˆ์ดํ•˜๊ธฐ: ๊ฐœ์ธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜

ํ•ฉ์‚ฐ

์ €๋Š” ์ด ๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„ ์ž‘์—…์„ ์ •๋ง ์ฆ๊ฒผ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ๋‚˜๋Š” Rust๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๊ฒƒ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ ๊ฒƒ์„ ๊ธฐ์˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • Rust๋Š” ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Rust๋Š” ํ›Œ๋ฅญํ•œ ๋ฌธ์„œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ , Rust๋Š” ๋งค์šฐ ์šฐ์•„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๊ด€์„ฑ์€ ๋ฉ‹์ง€๋‹ค.
  • C++์—์„œ ์ž์ฃผ ํ–ˆ๋˜ ๋ณต์ œ, ๋ณต์‚ฌ ๋˜๋Š” ๊ธฐํƒ€ ์œ ์‚ฌํ•œ ์ž‘์—…์— ์˜์กดํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์˜ต์…˜์€ ์‚ฌ์šฉํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋งค์šฐ ์ž˜ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปดํŒŒ์ผ๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด 99%์˜ ์‹œ๊ฐ„ ๋™์•ˆ ์ •ํ™•ํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚ด๊ฐ€ ๋ณธ ๊ฒƒ ์ค‘ ์ตœ๊ณ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Rust์˜ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์€ ์ด์ œ ๋ง‰ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Rust๋ฅผ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๊ณต๊ฐœํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๋Š” ์•ˆ์ •์ ์ด๊ณ  ์ƒ๋‹นํžˆ ํฐ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‚˜๋Š” ์šฐ๋ฆฌ์˜ ๊ณต๋™ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋ฉด์„œ ๋‚™๊ด€์ ์œผ๋กœ ์–ธ์–ด์˜ ๋ฏธ๋ž˜๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Skillbox๋Š” ๋‹ค์Œ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€