ืžืฉื—ืง Rust ื‘-24 ืฉืขื•ืช: ื—ื•ื•ื™ืช ื”ืชืคืชื—ื•ืช ืื™ืฉื™ืช

ืžืฉื—ืง Rust ื‘-24 ืฉืขื•ืช: ื—ื•ื•ื™ืช ื”ืชืคืชื—ื•ืช ืื™ืฉื™ืช

ื‘ืžืืžืจ ื–ื” ืื“ื‘ืจ ืขืœ ื”ื—ื•ื•ื™ื” ื”ืื™ืฉื™ืช ืฉืœื™ ื‘ืคื™ืชื•ื— ืžืฉื—ืง ืงื˜ืŸ ื‘- Rust. ืœืงื— ื‘ืขืจืš 24 ืฉืขื•ืช ืœื™ืฆื•ืจ ื’ืจืกื” ืขื•ื‘ื“ืช (ืขื‘ื“ืชื™ ื‘ืขื™ืงืจ ื‘ืขืจื‘ื™ื ืื• ื‘ืกื•ืคื™ ืฉื‘ื•ืข). ื”ืžืฉื—ืง ืจื—ื•ืง ืžืœื”ืกืชื™ื™ื, ืื‘ืœ ืื ื™ ื—ื•ืฉื‘ ืฉื”ื—ื•ื•ื™ื” ืชื”ื™ื” ืžืชื’ืžืœืช. ืื—ืœื•ืง ืืช ืžื” ืฉืœืžื“ืชื™ ื•ื›ืžื” ืชืฆืคื™ื•ืช ืฉืขืฉื™ืชื™ ื‘ื–ืžืŸ ื‘ื ื™ื™ืช ื”ืžืฉื—ืง ืžืืคืก.

Skillbox ืžืžืœื™ืฆื”: ืงื•ืจืก ืžืขืฉื™ ืฉื ืชื™ื™ื "ืื ื™ ืžืคืชื— ืืชืจื™ื PRO".

ืื ื• ืžื–ื›ื™ืจื™ื: ืœื›ืœ ืงื•ืจืื™ Habr - ื”ื ื—ื” ืฉืœ 10 ืจื•ื‘ืœ ื‘ืขืช ื”ืจืฉืžื” ืœื›ืœ ืงื•ืจืก Skillbox ื‘ืืžืฆืขื•ืช ืงื•ื“ ื”ื”ื˜ื‘ื” ืฉืœ Habr.

ืœืžื” ื—ืœื•ื“ื”?

ื‘ื—ืจืชื™ ื‘ืฉืคื” ื”ื–ื• ื›ื™ ืฉืžืขืชื™ ืขืœื™ื” ื”ืจื‘ื” ื“ื‘ืจื™ื ื˜ื•ื‘ื™ื ื•ืื ื™ ืจื•ืื” ืฉื”ื™ื ื”ื•ืคื›ืช ื™ื•ืชืจ ื•ื™ื•ืชืจ ืคื•ืคื•ืœืจื™ืช ื‘ืคื™ืชื•ื— ืžืฉื—ืงื™ื. ืœืคื ื™ ื›ืชื™ื‘ืช ื”ืžืฉื—ืง, ื”ื™ื” ืœื™ ืžืขื˜ ื ื™ืกื™ื•ืŸ ื‘ืคื™ืชื•ื— ื™ื™ืฉื•ืžื™ื ืคืฉื•ื˜ื™ื ื‘- Rust. ื–ื” ื”ื™ื” ืžืกืคื™ืง ื›ื“ื™ ืœืชืช ืœื™ ืชื—ื•ืฉืช ื—ื•ืคืฉ ื‘ื–ืžืŸ ื›ืชื™ื‘ืช ื”ืžืฉื—ืง.

ืœืžื” ื”ืžืฉื—ืง ื•ืื™ื–ื” ืกื•ื’ ืฉืœ ืžืฉื—ืง?

ืœืขืฉื•ืช ืžืฉื—ืงื™ื ื–ื” ื›ื™ืฃ! ื”ืœื•ื•ืื™ ื•ื”ื™ื• ืขื•ื“ ืกื™ื‘ื•ืช, ืื‘ืœ ืœืคืจื•ื™ืงื˜ื™ื "ื‘ื™ืชื™ื™ื" ืื ื™ ื‘ื•ื—ืจืช ื ื•ืฉืื™ื ืฉืื™ื ื ืงืฉื•ืจื™ื ื™ื•ืชืจ ืžื“ื™ ืœืขื‘ื•ื“ื” ื”ืจื’ื™ืœื” ืฉืœื™. ืื™ื–ื” ืžืฉื—ืง ื–ื”? ืจืฆื™ืชื™ ืœื™ืฆื•ืจ ืžืฉื”ื• ื›ืžื• ืกื™ืžื•ืœื˜ื•ืจ ื˜ื ื™ืก ื”ืžืฉืœื‘ ืงื•ื•ื™ ืงื™ื™ื ื•ืก โ€‹โ€‹ืขืจื™ื, ื˜ื™ื™ืงื•ืŸ ื’ืŸ ื”ื—ื™ื•ืช, ืื“ืจื™ื›ืœ ื”ื›ืœื ื•ื”ื˜ื ื™ืก ืขืฆืžื•. ื‘ื›ืœืœ, ื”ืชื‘ืจืจ ืฉื–ื” ืžืฉื—ืง ืขืœ ืืงื“ืžื™ื™ืช ื˜ื ื™ืก ืฉื‘ื” ื‘ืื™ื ืœืฉื—ืง.

ืื™ืžื•ืŸ ื˜ื›ื ื™

ืจืฆื™ืชื™ ืœื”ืฉืชืžืฉ ื‘- Rust, ืื‘ืœ ืœื ื™ื“ืขืชื™ ื‘ื“ื™ื•ืง ื›ืžื” ืขื‘ื•ื“ืช ื”ื™ืกื•ื“ ืชื™ื“ืจืฉ ื›ื“ื™ ืœื”ืชื—ื™ืœ. ืœื ืจืฆื™ืชื™ ืœื›ืชื•ื‘ ื”ืฆืœืœื•ืช ืคื™ืงืกืœื™ื ื•ืœื”ืฉืชืžืฉ ื‘ื’ืจื•ืจ-n-ื“ืจื•ืค, ืื– ื—ื™ืคืฉืชื™ ืืช ื”ืคืชืจื•ื ื•ืช ื”ื’ืžื™ืฉื™ื ื‘ื™ื•ืชืจ.

ืžืฆืืชื™ ืžืฉืื‘ื™ื ืฉื™ืžื•ืฉื™ื™ื ืฉืื ื™ ื—ื•ืœืง ืื™ืชืš:

ื—ืงืจืชื™ ื›ืžื” ืžื ื•ืขื™ ืžืฉื—ืง Rust, ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ื‘ื—ืจืชื™ Piston ื•-ggez. ื ืชืงืœืชื™ ื‘ื”ื ื›ืฉืขื‘ื“ืชื™ ืขืœ ืคืจื•ื™ืงื˜ ืงื•ื“ื. ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ, ื‘ื—ืจืชื™ ื‘-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
โ€” ืžืขื’ืœ.ืจืก
โ€” main.rs -> ืœื•ืœืื” ืจืืฉื™ืช

ืื ืฉื™ื, ืงื•ืžื•ืช ื•ืชืžื•ื ื•ืช

ื”ืฉืœื‘ ื”ื‘ื ื”ื•ื ื™ืฆื™ืจืช ืื•ื‘ื™ื™ืงื˜ ืžืฉื—ืง Person ื•ื˜ืขื™ื ืช ืชืžื•ื ื•ืช. ื”ื›ืœ ืฆืจื™ืš ืœื”ื™ื•ืช ื‘ื ื•ื™ ืขืœ ื‘ืกื™ืก 32*32 ืืจื™ื—ื™ื.

ืžืฉื—ืง Rust ื‘-24 ืฉืขื•ืช: ื—ื•ื•ื™ืช ื”ืชืคืชื—ื•ืช ืื™ืฉื™ืช

ืžื’ืจืฉื™ ื˜ื ื™ืก

ืœืื—ืจ ืฉืœืžื“ืชื™ ืื™ืš ื ืจืื™ื ืžื’ืจืฉื™ ื˜ื ื™ืก, ื”ื—ืœื˜ืชื™ ืœื”ื›ื™ืŸ ืื•ืชื ืžืืจื™ื—ื™ื 4*2. ื‘ืชื—ื™ืœื”, ื ื™ืชืŸ ื”ื™ื” ืœื™ืฆื•ืจ ืชืžื•ื ื” ื‘ื’ื•ื“ืœ ื–ื”, ืื• ืœื”ืจื›ื™ื‘ 8 ืืจื™ื—ื™ื ื ืคืจื“ื™ื. ืื‘ืœ ืื– ื”ื‘ื ืชื™ ืฉืฆืจื™ืš ืจืง ืฉื ื™ ืืจื™ื—ื™ื ื™ื™ื—ื•ื“ื™ื™ื, ื•ื”ื ื” ื”ืกื™ื‘ื”.

ื‘ืกืš ื”ื›ืœ ื™ืฉ ืœื ื• ืฉื ื™ ืืจื™ื—ื™ื ื›ืืœื”: 1 ื•-2.

ื›ืœ ื—ืœืง ืฉืœ ื”ืžื’ืจืฉ ืžื•ืจื›ื‘ ืžืืจื™ื— 1 ืื• ืืจื™ื— 2. ื ื™ืชืŸ ืœืคืจื•ืก ืื•ืชื ื›ืจื’ื™ืœ ืื• ืœื”ืคื•ืš ืื•ืชื ื‘-180 ืžืขืœื•ืช.

ืžืฉื—ืง Rust ื‘-24 ืฉืขื•ืช: ื—ื•ื•ื™ืช ื”ืชืคืชื—ื•ืช ืื™ืฉื™ืช

ืžืฆื‘ ื‘ื ื™ื™ื” (ื”ืจื›ื‘ื”) ื‘ืกื™ืกื™

ืœืื—ืจ ืฉื”ืฆืœื—ืชื™ ืœื”ืฉื™ื’ ืจื™ื ื“ื•ืจ ืฉืœ ืืชืจื™ื, ืื ืฉื™ื ื•ืžืคื•ืช, ื”ื‘ื ืชื™ ืฉืฆืจื™ืš ื’ื ืžืฆื‘ assembly ื‘ืกื™ืกื™. ื™ื™ืฉืžืชื™ ืืช ื–ื” ื›ืš: ื›ืฉืœื•ื—ืฆื™ื ืขืœ ื”ื›ืคืชื•ืจ, ื”ืื•ื‘ื™ื™ืงื˜ ื ื‘ื—ืจ, ื•ื”ืงืœื™ืง ืžืžืงื ืื•ืชื• ื‘ืžืงื•ื ื”ืจืฆื•ื™. ืื–, ื›ืคืชื•ืจ 1 ืžืืคืฉืจ ืœืš ืœื‘ื—ื•ืจ ืžื’ืจืฉ, ื•ื›ืคืชื•ืจ 2 ืžืืคืฉืจ ืœืš ืœื‘ื—ื•ืจ ืฉื—ืงืŸ.

ืื‘ืœ ืื ื—ื ื• ืขื“ื™ื™ืŸ ืฆืจื™ื›ื™ื ืœื–ื›ื•ืจ ืžื” ื”ืžืฉืžืขื•ืช ืฉืœ 1 ื•-2, ืื– ื”ื•ืกืคืชื™ ืžืกื’ืจืช wireframe ื›ื“ื™ ืœื”ื‘ื”ื™ืจ ืื™ื–ื” ืื•ื‘ื™ื™ืงื˜ ื ื‘ื—ืจ. ื›ืš ื–ื” ื ืจืื”.

ืžืฉื—ืง Rust ื‘-24 ืฉืขื•ืช: ื—ื•ื•ื™ืช ื”ืชืคืชื—ื•ืช ืื™ืฉื™ืช

ืฉืืœื•ืช ืืจื›ื™ื˜ืงื˜ื•ืจื” ื•ืฉื—ื–ื•ืจ

ืขื›ืฉื™ื• ื™ืฉ ืœื™ ื›ืžื” ื—ืคืฆื™ ืžืฉื—ืง: ืื ืฉื™ื, ืžื’ืจืฉื™ื ื•ืจืฆืคื•ืช. ืื‘ืœ ืขืœ ืžื ืช ืฉ-wireframes ื™ืขื‘ื“ื•, ื™ืฉ ืœื•ืžืจ ืœื›ืœ ื™ืฉื•ืช ืื•ื‘ื™ื™ืงื˜ ื”ืื ื”ืื•ื‘ื™ื™ืงื˜ื™ื ืขืฆืžื ื ืžืฆืื™ื ื‘ืžืฆื‘ ื”ื“ื’ืžื”, ืื• ืฉ-frame ืคืฉื•ื˜ ืžืฆื•ื™ืจ. ื–ื” ืœื ืžืื•ื“ ื ื•ื—.

ื ืจืื” ืœื™ ืฉืฆืจื™ืš ืœื—ืฉื•ื‘ ืžื—ื“ืฉ ืขืœ ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ื‘ืื•ืคืŸ ืฉื—ืฉืฃ ื›ืžื” ืžื’ื‘ืœื•ืช:

  • ืงื™ื•ื ื™ืฉื•ืช ืฉืžืฆื™ื’ื” ื•ืžืขื“ื›ื ืช ืืช ืขืฆืžื” ื”ื™ื ื‘ืขื™ื” ืžื›ื™ื•ื•ืŸ ืฉืื•ืชื” ื™ืฉื•ืช ืœื ืชื•ื›ืœ "ืœื“ืขืช" ืžื” ื”ื™ื ืืžื•ืจื” ืœืจื ื“ืจ - ืชืžื•ื ื” ื•-wireframe;
  • ื”ื™ืขื“ืจ ื›ืœื™ ืœื”ื—ืœืคืช ืžืืคื™ื™ื ื™ื ื•ื”ืชื ื”ื’ื•ืช ื‘ื™ืŸ ื™ืฉื•ื™ื•ืช ื‘ื•ื“ื“ื•ืช (ืœื“ื•ื’ืžื”, ื”ืžืืคื™ื™ืŸ is_build_mode ืื• ืขื™ื‘ื•ื“ ื”ืชื ื”ื’ื•ืช). ื ื™ืชืŸ ื™ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ื™ืจื•ืฉื”, ืื ื›ื™ ืื™ืŸ ื“ืจืš ืจืื•ื™ื” ืœื™ื™ืฉื ื–ืืช ื‘- Rust. ืžื” ืฉื‘ืืžืช ื”ื™ื™ืชื™ ืฆืจื™ืš ื–ื” ื”ืคืจื™ืกื”;
  • ื”ื™ื” ืฆื•ืจืš ื‘ื›ืœื™ ืœืื™ื ื˜ืจืืงืฆื™ื” ื‘ื™ืŸ ื’ื•ืคื™ื ื›ื“ื™ ืœื”ืงืฆื•ืช ืื ืฉื™ื ืœื‘ืชื™ ืžืฉืคื˜;
  • ื”ื™ืฉื•ื™ื•ืช ืขืฆืžืŸ ื”ื™ื• ืชืขืจื•ื‘ืช ืฉืœ ื ืชื•ื ื™ื ื•ื”ื™ื’ื™ื•ืŸ ืฉื™ืฆืื• ื‘ืžื”ื™ืจื•ืช ืžืฉืœื™ื˜ื”.

ืขืฉื™ืชื™ ืขื•ื“ ืงืฆืช ืžื—ืงืจ ื•ื’ื™ืœื™ืชื™ ืืช ื”ืืจื›ื™ื˜ืงื˜ื•ืจื” ECS - Entity Component System, ืืฉืจ ื ืคื•ืฅ ื‘ืฉื™ืžื•ืฉ ื‘ืžืฉื—ืงื™ื. ืœื”ืœืŸ ื”ื™ืชืจื•ื ื•ืช ืฉืœ ECS:

  • ื ืชื•ื ื™ื ืžื•ืคืจื“ื™ื ืžื”ืœื•ื’ื™ืงื”;
  • ื”ืจื›ื‘ ื‘ืžืงื•ื ื™ืจื•ืฉื”;
  • ืืจื›ื™ื˜ืงื˜ื•ืจื” ืžืžื•ืงื“ืช ื ืชื•ื ื™ื.

ECS ืžืื•ืคื™ื™ืŸ ื‘ืฉืœื•ืฉื” ืžื•ืฉื’ื™ ื™ืกื•ื“:

  • ื™ืฉื•ื™ื•ืช - ืกื•ื’ ื”ืื•ื‘ื™ื™ืงื˜ ืฉืืœื™ื• ืžืชื™ื™ื—ืก ื”ืžื–ื”ื” (ื–ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื—ืงืŸ, ื›ื“ื•ืจ ืื• ืžืฉื”ื• ืื—ืจ);
  • ืจื›ื™ื‘ื™ื - ื™ืฉื•ื™ื•ืช ืžื•ืจื›ื‘ื•ืช ืžื”ื. ื“ื•ื’ืžื” - ืจื›ื™ื‘ ืจื™ื ื“ื•ืจ, ืžื™ืงื•ืžื™ื ื•ืื—ืจื™ื. ืžื“ื•ื‘ืจ ื‘ืžื—ืกื ื™ ื ืชื•ื ื™ื;
  • ืžืขืจื›ื•ืช - ื”ืŸ ืžืฉืชืžืฉื•ืช ื’ื ื‘ืื•ื‘ื™ื™ืงื˜ื™ื ื•ื’ื ื‘ืจื›ื™ื‘ื™ื, ื•ื‘ื ื•ืกืฃ ืžื›ื™ืœื•ืช ื”ืชื ื”ื’ื•ืช ื•ื”ื™ื’ื™ื•ืŸ ื”ืžื‘ื•ืกืกื™ื ืขืœ ื ืชื•ื ื™ื ืืœื•. ื“ื•ื’ืžื” ืœื›ืš ื”ื™ื ืžืขืจื›ืช ืขื™ื‘ื•ื“ ื”ื—ื•ื–ืจืช ื“ืจืš ื›ืœ ื”ื™ืฉื•ื™ื•ืช ืขื ืจื›ื™ื‘ื™ ืขื™ื‘ื•ื“ ื•ืžื‘ืฆืขืช ืืช ื”ืขื™ื‘ื•ื“.

ืœืื—ืจ ืœื™ืžื•ื“ ื–ื”, ื”ืชื‘ืจืจ ื›ื™ ECS ืคื•ืชืจ ืืช ื”ื‘ืขื™ื•ืช ื”ื‘ืื•ืช:

  • ืฉื™ืžื•ืฉ ื‘ืคืจื™ืกื” ื‘ืžืงื•ื ื‘ื™ืจื•ืฉื” ืœืืจื’ื•ืŸ ื™ืฉื•ื™ื•ืช ื‘ืื•ืคืŸ ืžืขืจื›ืชื™;
  • ื”ื™ืคื˜ืจื•ืช ืžืขืจื‘ื•ืœืช ืงื•ื“ ื‘ืืžืฆืขื•ืช ืžืขืจื›ื•ืช ื‘ืงืจื”;
  • ืฉื™ืžื•ืฉ ื‘ืฉื™ื˜ื•ืช ื›ืžื• is_build_mode ื›ื“ื™ ืœืฉืžื•ืจ ืืช ืœื•ื’ื™ืงื” ืฉืœ wireframe ื‘ืื•ืชื• ืžืงื•ื - ื‘ืžืขืจื›ืช ื”ืขื™ื‘ื•ื“.

ื–ื” ืžื” ืฉืงืจื” ืœืื—ืจ ื”ื˜ืžืขืช ECS.

ืžืฉืื‘ื™ื -> ื–ื” ื”ืžืงื•ื ืฉื‘ื• ื ืžืฆืื™ื ื›ืœ ื”ื ื›ืกื™ื (ืชืžื•ื ื•ืช)
src
- ืจื›ื™ื‘ื™ื
โ€”ืขืžื“ื”.rs
- person.rs
โ€” tennis_court.rs
โ€” ืงื•ืžื”.ืจืก
- wireframe.rs
โ€” mouse_tracked.rs
- ืžืฉืื‘ื™ื
โ€”mouse.rs
- ืžืขืจื›ื•ืช
โ€” rendering.rs
- ืงื‘ื•ืขื™ื.ืจืก
- utils.rs
โ€” world_factory.rs -> ืคื•ื ืงืฆื™ื•ืช ืžืคืขืœ ื”ืขื•ืœื
โ€” main.rs -> ืœื•ืœืื” ืจืืฉื™ืช

ืื ื—ื ื• ืžืฉื™ื™ื›ื™ื ืื ืฉื™ื ืœื‘ืชื™ ื”ืžืฉืคื˜

ECS ื”ืคื›ื” ืืช ื”ื—ื™ื™ื ืœืงืœื™ื ื™ื•ืชืจ. ืขื›ืฉื™ื• ื”ื™ื™ืชื” ืœื™ ื“ืจืš ืฉื™ื˜ืชื™ืช ืœื”ื•ืกื™ืฃ ื ืชื•ื ื™ื ืœื’ื•ืคื™ื ื•ืœื”ื•ืกื™ืฃ ื”ื™ื’ื™ื•ืŸ ืขืœ ืกืžืš ื”ื ืชื•ื ื™ื ื”ืืœื”. ื•ื–ื”, ื‘ืชื•ืจื•, ืื™ืคืฉืจ ืœืืจื’ืŸ ืืช ื—ืœื•ืงืช ื”ืื ืฉื™ื ื‘ื™ืŸ ื‘ืชื™ ื”ืžืฉืคื˜.

ืžื” ืขืฉื™ืชื™:

  • ื”ื•ืกื™ืคื• ื ืชื•ื ื™ื ืœื’ื‘ื™ ื‘ืชื™ ืžืฉืคื˜ ืฉื”ื•ืงืฆื• ืœืื“ื;
  • ื”ื•ืกื™ืฃ ื ืชื•ื ื™ื ืขืœ ืื ืฉื™ื ืžื‘ื•ื–ืจื™ื ืœ- TennisCourt;
  • ื”ื•ืกื™ืคื” CourtChoosingSystem, ื”ืžืืคืฉืจืช ืœื ืชื— ืื ืฉื™ื ื•ืžื’ืจืฉื™ื, ืœื–ื”ื•ืช ืžื’ืจืฉื™ื ื–ืžื™ื ื™ื ื•ืœื”ืคื™ืฅ ืœื”ื ืฉื—ืงื ื™ื;
  • ื”ื•ืกื™ืคื” PersonMovementSystem, ืฉืžื—ืคืฉืช ืื ืฉื™ื ืฉื”ื•ืงืฆื• ืœื‘ืชื™ ื”ืžืฉืคื˜, ื•ืื ื”ื ืœื ืฉื, ืื– ืฉื•ืœื—ืช ืื ืฉื™ื ืœืืŸ ืฉื”ื ืฆืจื™ื›ื™ื ืœื”ื™ื•ืช.

ืžืฉื—ืง Rust ื‘-24 ืฉืขื•ืช: ื—ื•ื•ื™ืช ื”ืชืคืชื—ื•ืช ืื™ืฉื™ืช

ืกื›ื•ื

ื ื”ื ื™ืชื™ ืžืื•ื“ ืœืขื‘ื•ื“ ืขืœ ื”ืžืฉื—ืง ื”ืคืฉื•ื˜ ื”ื–ื”. ื™ืชืจ ืขืœ ื›ืŸ, ืื ื™ ืฉืžื— ืฉื”ืฉืชืžืฉืชื™ ื‘- Rust ื›ื“ื™ ืœื›ืชื•ื‘ ืืช ื–ื”, ื›ื™:

  • ื—ืœื•ื“ื” ื ื•ืชื ืช ืœืš ืืช ืžื” ืฉืืชื” ืฆืจื™ืš;
  • ื™ืฉ ืœื• ืชื™ืขื•ื“ ืžืฆื•ื™ืŸ, ื—ืœื•ื“ื” ื“ื™ ืืœื’ื ื˜ื™ืช;
  • ื”ืขืงื‘ื™ื•ืช ืžื’ื ื™ื‘ื”;
  • ืืชื” ืœื ืฆืจื™ืš ืœื ืงื•ื˜ ื‘ืฉื™ื‘ื•ื˜, ื”ืขืชืงื” ืื• ืคืขื•ืœื•ืช ื“ื•ืžื•ืช ืื—ืจื•ืช, ืžื” ืฉืขืฉื™ืชื™ ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื‘-C++;
  • ื”ืืคืฉืจื•ื™ื•ืช ืงืœื•ืช ืžืื•ื“ ืœืฉื™ืžื•ืฉ ื•ืžื˜ืคืœื•ืช ื‘ืฉื’ื™ืื•ืช ื‘ืฆื•ืจื” ื˜ื•ื‘ื” ืžืื•ื“;
  • ืื ื ื™ืชืŸ ื”ื™ื” ืœื”ืจื›ื™ื‘ ืืช ื”ืคืจื•ื™ืงื˜, ืื– 99% ืžื”ื–ืžืŸ ื”ื•ื ืขื•ื‘ื“, ื•ื‘ื“ื™ื•ืง ื›ืžื• ืฉืฆืจื™ืš. ืื ื™ ื—ื•ืฉื‘ ืฉื”ื•ื“ืขื•ืช ื”ืฉื’ื™ืื” ืฉืœ ื”ืžื”ื“ืจ ื”ืŸ ื”ื˜ื•ื‘ื•ืช ื‘ื™ื•ืชืจ ืฉืจืื™ืชื™.

ืคื™ืชื•ื— ื”ืžืฉื—ืงื™ื ื‘-Rust ืจืง ืžืชื—ื™ืœ. ืื‘ืœ ื™ืฉ ื›ื‘ืจ ืงื”ื™ืœื” ื™ืฆื™ื‘ื” ื•ื“ื™ ื’ื“ื•ืœื” ืฉืคื•ืขืœืช ืœืคืชื•ื— ืืช Rust ืœื›ื•ืœื. ืœื›ืŸ, ืื ื™ ืžืกืชื›ืœ ืขืœ ืขืชื™ื“ ื”ืฉืคื” ื‘ืื•ืคื˜ื™ืžื™ื•ืช, ืžืฆืคื” ืœืชื•ืฆืื•ืช ื”ืขื‘ื•ื“ื” ื”ืžืฉื•ืชืคืช ืฉืœื ื•.

Skillbox ืžืžืœื™ืฆื”:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”