ืืืืืจ ืื ืืืืจ ืขื ืืืืืื ืืืืฉืืช ืฉืื ืืคืืชืื ืืฉืืง ืงืื ื- Rust. ืืงื ืืขืจื 24 ืฉืขืืช ืืืฆืืจ ืืจืกื ืขืืืืช (ืขืืืชื ืืขืืงืจ ืืขืจืืื ืื ืืกืืคื ืฉืืืข). ืืืฉืืง ืจืืืง ืืืืกืชืืื, ืืื ืื ื ืืืฉื ืฉืืืืืื ืชืืื ืืชืืืืช. ืืืืืง ืืช ืื ืฉืืืืชื ืืืื ืชืฆืคืืืช ืฉืขืฉืืชื ืืืื ืื ืืืช ืืืฉืืง ืืืคืก.
Skillbox ืืืืืฆื: ืงืืจืก ืืขืฉื ืฉื ืชืืื
"ืื ื ืืคืชื ืืชืจืื PRO" .ืื ื ืืืืืจืื: ืืื ืงืืจืื Habr - ืื ืื ืฉื 10 ืจืืื ืืขืช ืืจืฉืื ืืื ืงืืจืก Skillbox ืืืืฆืขืืช ืงืื ืืืืื ืฉื Habr.
ืืื ืืืืื?
ืืืจืชื ืืฉืคื ืืื ืื ืฉืืขืชื ืขืืื ืืจืื ืืืจืื ืืืืื ืืื ื ืจืืื ืฉืืื ืืืคืืช ืืืชืจ ืืืืชืจ ืคืืคืืืจืืช ืืคืืชืื ืืฉืืงืื. ืืคื ื ืืชืืืช ืืืฉืืง, ืืื ืื ืืขื ื ืืกืืื ืืคืืชืื ืืืฉืืืื ืคืฉืืืื ื- Rust. ืื ืืื ืืกืคืืง ืืื ืืชืช ืื ืชืืืฉืช ืืืคืฉ ืืืื ืืชืืืช ืืืฉืืง.
ืืื ืืืฉืืง ืืืืื ืกืื ืฉื ืืฉืืง?
ืืขืฉืืช ืืฉืืงืื ืื ืืืฃ! ืืืืืื ืืืื ืขืื ืกืืืืช, ืืื ืืคืจืืืงืืื "ืืืชืืื" ืื ื ืืืืจืช ื ืืฉืืื ืฉืืื ื ืงืฉืืจืื ืืืชืจ ืืื ืืขืืืื ืืจืืืื ืฉืื. ืืืื ืืฉืืง ืื? ืจืฆืืชื ืืืฆืืจ ืืฉืื ืืื ืกืืืืืืืจ ืื ืืก ืืืฉืื ืงืืื ืงืืื ืืก โโืขืจืื, ืืืืงืื ืื ืืืืืช, ืืืจืืื ืืืื ืืืื ืืก ืขืฆืื. ืืืื, ืืชืืจืจ ืฉืื ืืฉืืง ืขื ืืงืืืืืช ืื ืืก ืฉืื ืืืื ืืฉืืง.
ืืืืื ืืื ื
ืจืฆืืชื ืืืฉืชืืฉ ื- Rust, ืืื ืื ืืืขืชื ืืืืืง ืืื ืขืืืืช ืืืกืื ืชืืืจืฉ ืืื ืืืชืืื. ืื ืจืฆืืชื ืืืชืื ืืฆืืืืช ืคืืงืกืืื ืืืืฉืชืืฉ ืืืจืืจ-n-ืืจืืค, ืื ืืืคืฉืชื ืืช ืืคืชืจืื ืืช ืืืืืฉืื ืืืืชืจ.
ืืฆืืชื ืืฉืืืื ืฉืืืืฉืืื ืฉืื ื ืืืืง ืืืชื:
ืื ืื ื ืืฉืืงืื ืืืจ - ืจืฉืืื ืฉื ืจืืืื Rust ืืืจืืฉืื ืืคืืชืื ืืฉืืงืื;ืืคืชื ืืฉืืง ืืืืื subreddit; ืืื ืืช ืคืืงืกืืื ืืืื ื.
ืืงืจืชื ืืื ืื ืืขื ืืฉืืง 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 ืืจืืืื.
ืืืจืฉื ืื ืืก
ืืืืจ ืฉืืืืชื ืืื ื ืจืืื ืืืจืฉื ืื ืืก, ืืืืืชื ืืืืื ืืืชื ืืืจืืืื 4*2. ืืชืืืื, ื ืืชื ืืื ืืืฆืืจ ืชืืื ื ืืืืื ืื, ืื ืืืจืืื 8 ืืจืืืื ื ืคืจืืื. ืืื ืื ืืื ืชื ืฉืฆืจืื ืจืง ืฉื ื ืืจืืืื ืืืืืืืื, ืืื ื ืืกืืื.
ืืกื ืืื ืืฉ ืื ื ืฉื ื ืืจืืืื ืืืื: 1 ื-2.
ืื ืืืง ืฉื ืืืืจืฉ ืืืจืื ืืืจืื 1 ืื ืืจืื 2. ื ืืชื ืืคืจืืก ืืืชื ืืจืืื ืื ืืืคืื ืืืชื ื-180 ืืขืืืช.
ืืฆื ืื ืืื (ืืจืืื) ืืกืืกื
ืืืืจ ืฉืืฆืืืชื ืืืฉืื ืจืื ืืืจ ืฉื ืืชืจืื, ืื ืฉืื ืืืคืืช, ืืื ืชื ืฉืฆืจืื ืื ืืฆื assembly ืืกืืกื. ืืืฉืืชื ืืช ืื ืื: ืืฉืืืืฆืื ืขื ืืืคืชืืจ, ืืืืืืืงื ื ืืืจ, ืืืงืืืง ืืืงื ืืืชื ืืืงืื ืืจืฆืื. ืื, ืืคืชืืจ 1 ืืืคืฉืจ ืื ืืืืืจ ืืืจืฉ, ืืืคืชืืจ 2 ืืืคืฉืจ ืื ืืืืืจ ืฉืืงื.
ืืื ืื ืื ื ืขืืืื ืฆืจืืืื ืืืืืจ ืื ืืืฉืืขืืช ืฉื 1 ื-2, ืื ืืืกืคืชื ืืกืืจืช wireframe ืืื ืืืืืืจ ืืืื ืืืืืืงื ื ืืืจ. ืื ืื ื ืจืื.
ืฉืืืืช ืืจืืืืงืืืจื ืืฉืืืืจ
ืขืืฉืื ืืฉ ืื ืืื ืืคืฆื ืืฉืืง: ืื ืฉืื, ืืืจืฉืื ืืจืฆืคืืช. ืืื ืขื ืื ืช ืฉ-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 ืืื ืืืชืื ืืช ืื, ืื:
- ืืืืื ื ืืชื ืช ืื ืืช ืื ืฉืืชื ืฆืจืื;
- ืืฉ ืื ืชืืขืื ืืฆืืื, ืืืืื ืื ืืืื ืืืช;
- ืืขืงืืืืช ืืื ืืื;
- ืืชื ืื ืฆืจืื ืื ืงืื ืืฉืืืื, ืืขืชืงื ืื ืคืขืืืืช ืืืืืช ืืืจืืช, ืื ืฉืขืฉืืชื ืืขืชืื ืงืจืืืืช ื-C++;
- ืืืคืฉืจืืืืช ืงืืืช ืืืื ืืฉืืืืฉ ืืืืคืืืช ืืฉืืืืืช ืืฆืืจื ืืืื ืืืื;
- ืื ื ืืชื ืืื ืืืจืืื ืืช ืืคืจืืืงื, ืื 99% ืืืืื ืืื ืขืืื, ืืืืืืง ืืื ืฉืฆืจืื. ืื ื ืืืฉื ืฉืืืืขืืช ืืฉืืืื ืฉื ืืืืืจ ืื ืืืืืืช ืืืืชืจ ืฉืจืืืชื.
ืคืืชืื ืืืฉืืงืื ื-Rust ืจืง ืืชืืื. ืืื ืืฉ ืืืจ ืงืืืื ืืฆืืื ืืื ืืืืื ืฉืคืืขืืช ืืคืชืื ืืช Rust ืืืืื. ืืื, ืื ื ืืกืชืื ืขื ืขืชืื ืืฉืคื ืืืืคืืืืืืช, ืืฆืคื ืืชืืฆืืืช ืืขืืืื ืืืฉืืชืคืช ืฉืื ื.
Skillbox ืืืืืฆื:
- ืงืืจืก ืืงืืื
"ืืคืชื ืืืืชื ืืงืฆืืขื" .- ืงืืจืก ืืขืฉื
"Mobile Developer PRO" .- ืงืืจืก ืืขืฉื ืื ืฉื ื
"ืืคืชื PHP ื-0 ื-PRO" .
ืืงืืจ: www.habr.com