ãã®èšäºã§ã¯ãRust ã§å°ããªã²ãŒã ãéçºããç§ã®å人çãªçµéšã«ã€ããŠè©±ããŸãã å®çšçãªããŒãžã§ã³ãäœæããã®ã«çŽ 24 æéããããŸãã (ç§ã¯äž»ã«å€æ¹ãé±æ«ã«äœæ¥ããŸãã)ã ã²ãŒã ã¯å®æã«ã¯çšé ãã§ããããã®çµéšã¯ããããã®ãããã®ã«ãªããšæããŸãã ã²ãŒã ããŒãããæ§ç¯ãããšãã«åŠãã ããšãšèŠ³å¯ããããšãå
±æããŸãã
ã¹ãã«ããã¯ã¹ã¯æ¬¡ã®ããšãæšå¥šããŸãã XNUMX幎éã®å®è·µã³ãŒã¹
ãç§ã¯ããã®ãŠã§ãéçºè ã§ãã .ãªãã€ã³ããŒïŒ ãHabrãã®ãã¹ãŠã®èªè ã察象 - ãHabrãããã¢ãŒã·ã§ã³ ã³ãŒãã䜿çšããŠã¹ãã«ããã¯ã¹ ã³ãŒã¹ã«ç»é²ãããš 10 ã«ãŒãã«ã®å²åŒã
ãªãéã³ãã®ãïŒ
ç§ããã®èšèªãéžæããã®ã¯ããã®èšèªã«ã€ããŠè¯ãããšãããããèããŠãããã²ãŒã éçºã«ãããŠãã®èšèªããŸããŸã人æ°ããããšèŠãŠããããã§ãã ã²ãŒã ãæžãåãç§ã¯ Rust ã§åçŽãªã¢ããªã±ãŒã·ã§ã³ãéçºããçµéšãã»ãšãã©ãããŸããã§ããã ããã¯ãã²ãŒã ãäœæããéã«èªç±æãäžããã®ã«ååã§ããã
ãªããã®ã²ãŒã ãªã®ããã©ããªã²ãŒã ãªã®ãïŒ
ã²ãŒã ãäœãã®ã¯æ¥œããã§ããïŒ ãã£ãšçç±ãããã°ããã®ã§ãããã家åºããããžã§ã¯ãã§ã¯ãéåžžã®ä»äºãšããŸãé¢ä¿ã®ãªããããã¯ãéžã³ãŸãã ããã¯äœã®ã²ãŒã ã§ãã? Cities SkylinesãZoo TycoonãPrison ArchitectããããŠããã¹ãã®ãã®ãçµã¿åãããããã¹ ã·ãã¥ã¬ãŒã¿ãŒã®ãããªãã®ãäœãããã£ãã®ã§ãã äžè¬çã«ãããã¯äººã ãéã³ã«æ¥ãããã¹ã¢ã«ãããŒã«ã€ããŠã®ã²ãŒã ã§ããããšãå€æããŸããã
æè¡ç ä¿®
Rust ã䜿çšããããšæã£ãŠããŸãããã䜿ãå§ããã®ã«ã©ã®ãããã®åºç€äœæ¥ãå¿ èŠã«ãªããæ£ç¢ºã«ã¯ããããŸããã§ããã ãã¯ã»ã« ã·ã§ãŒããŒãäœæãããããã©ãã° ã¢ã³ã ããããã䜿çšããããªãã£ãã®ã§ãæãæè»ãªãœãªã¥ãŒã·ã§ã³ãæ¢ããŠããŸããã
圹ç«ã€ãªãœãŒã¹ãèŠã€ããã®ã§ãå ±æããŸãã
ããéãã§ããŸãã â ã²ãŒã éçºã«å¿ èŠãª Rust èŠçŽ ã®ãªã¹ããRust ã²ãŒã éçºãµãã¬ãã£ãã; ç¡æã®ãã¯ã»ã«ã¢ãŒãã
ããã€ãã® Rust ã²ãŒã ãšã³ãžã³ãæ€èšããæçµçã« Piston ãš ggez ãéžæããŸããã 以åã®ãããžã§ã¯ãã«åãçµãã§ãããšãã«ãããã«åºäŒããŸããã æçµçã«ãå°èŠæš¡ãª 2D ã²ãŒã ã®å®è£ ã«ã¯ 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
â ãµãŒã¯ã«.rs
â main.rs -> ã¡ã€ã³ã«ãŒã
人ãåºãç»å
次ã®ã¹ãããã§ã¯ã人ç©ã²ãŒã ãªããžã§ã¯ããäœæããç»åãèªã¿èŸŒã¿ãŸãã ãã¹ãŠã¯ 32*32 ã¿ã€ã«ã«åºã¥ããŠæ§ç¯ããå¿ èŠããããŸãã
ããã¹ã³ãŒã
ããã¹ã³ãŒããã©ã®ãããªãã®ããç 究ããçµæã4*2ã®ã¿ã€ã«ã§ããã¹ã³ãŒããäœãããšã«ããŸããã åœåã¯ããã®ãµã€ãºã®ç»åãäœæãããã8 ã€ã®åå¥ã®ã¿ã€ã«ãçµã¿åããããããããšãå¯èœã§ããã ããããã®åŸãå¿ èŠãªåºæã®ã¿ã€ã«ã¯ XNUMX ã€ã ãã§ããããšã«æ°ä»ããŸããããã®çç±ã¯æ¬¡ã®ãšããã§ãã
ãã®ãããªã¿ã€ã«ã¯åèš 1 ã€ãããŸã: 2 ãš XNUMXã
ã³ãŒãã®åã»ã¯ã·ã§ã³ã¯ã¿ã€ã« 1 ãŸãã¯ã¿ã€ã« 2 ã§æ§æãããŸãããããã¯éåžžã©ããã«ã¬ã€ã¢ãŠãããããšãã180 床å転ããŠã¬ã€ã¢ãŠãããããšãã§ããŸãã
åºæ¬æ§ç¯ïŒçµç«ïŒã¢ãŒã
ãµã€ãã人ç©ãå°å³ã®ã¬ã³ããªã³ã°ããªããšãéæããåŸãåºæ¬çãªã¢ã»ã³ã㪠ã¢ãŒããå¿ èŠã§ããããšã«æ°ä»ããŸããã ç§ã¯ããã次ã®ããã«å®è£ ããŸããããã¿ã³ãæŒããããšãªããžã§ã¯ããéžæãããã¯ãªãã¯ãããšãªããžã§ã¯ããç®çã®å Žæã«é 眮ãããŸãã ãããã£ãŠããã¿ã³ 1 ã§ã³ãŒããéžæã§ãããã¿ã³ 2 ã§ãã¬ãŒã€ãŒãéžæã§ããŸãã
ãã ãã1 ãš 2 ã®æå³ãèŠããŠããå¿ èŠããããããã©ã®ãªããžã§ã¯ããéžæãããŠããããæ確ã«ããããã«ã¯ã€ã€ãŒãã¬ãŒã ãè¿œå ããŸããã èŠãç®ã¯ãããªæãã§ãã
ã¢ãŒããã¯ãã£ãšãªãã¡ã¯ã¿ãªã³ã°ã«é¢ãã質å
ããã§ã人ãã³ãŒããåºãªã©ã®ã²ãŒã ãªããžã§ã¯ããããã€ãã§ããŸããã ãã ããã¯ã€ã€ãŒãã¬ãŒã ãæ©èœããããã«ã¯ãåãªããžã§ã¯ã ãšã³ãã£ãã£ã«ããªããžã§ã¯ãèªäœããã¢ã³ã¹ãã¬ãŒã·ã§ã³ ã¢ãŒãã«ããã®ãããããšããã¬ãŒã ãåã«æç»ãããŠããã®ããéç¥ããå¿ èŠããããŸãã ããã¯ããŸã䟿å©ã§ã¯ãããŸããã
ããã€ãã®å¶éãæããã«ããæ¹æ³ã§ã¢ãŒããã¯ãã£ãåèããå¿ èŠãããããã«ç§ã«ã¯æããŸããã
- ããèªäœãã¬ã³ããªã³ã°ããã³æŽæ°ãããšã³ãã£ãã£ãæã€ããšã¯ããã®ãšã³ãã£ãã£ãã¬ã³ããªã³ã°ãã¹ããã® (ç»åãšã¯ã€ã€ãŒãã¬ãŒã ) ããèªèãã§ããªããããåé¡ã«ãªããŸãã
- åã ã®ãšã³ãã£ãã£éã§ããããã£ãšåäœã亀æããããã®ããŒã« (is_build_mode ããããã£ãåäœã¬ã³ããªã³ã°ãªã©) ãäžè¶³ããŠããã ç¶æ¿ã䜿çšããããšã¯å¯èœã§ãããRust ã§å®è£ ããé©åãªæ¹æ³ã¯ãããŸããã ç§ãæ¬åœã«å¿ èŠãšããŠããã®ã¯ã¬ã€ã¢ãŠãã§ããã
- 人ã ãæ³å»·ã«å²ãåœãŠãã«ã¯ããšã³ãã£ãã£éã®å¯Ÿè©±ã®ããã®ããŒã«ãå¿ èŠã§ããã
- ãšã³ãã£ãã£èªäœã¯ããŒã¿ãšããžãã¯ã®æ··åç©ã§ãããããã«å¶åŸ¡äžèœã«ãªã£ãŠããŸããŸããã
ããã«èª¿æ»ããŠã¢ãŒããã¯ãã£ãçºèŠããŸãã
ECS - ãšã³ãã£ãã£ã³ã³ããŒãã³ãã·ã¹ãã ãã²ãŒã ã§ãã䜿ãããŸãã ECS ã®å©ç¹ã¯æ¬¡ã®ãšããã§ãã
- ããŒã¿ã¯ããžãã¯ããåé¢ãããŠããŸãã
- ç¶æ¿ã§ã¯ãªãåæã
- ããŒã¿äžå¿ã®ã¢ãŒããã¯ãã£ã
ECS ã¯ã次㮠XNUMX ã€ã®åºæ¬æŠå¿µã«ãã£ãŠç¹åŸŽä»ããããŸãã
- ãšã³ãã£ã㣠- èå¥åãåç §ãããªããžã§ã¯ãã®ã¿ã€ã (ãã¬ãŒã€ãŒãããŒã«ããŸãã¯ãã®ä»ã®ãã®ã§ããå¯èœæ§ããããŸã)ã
- ã³ã³ããŒãã³ã - ãšã³ãã£ãã£ã¯ã³ã³ããŒãã³ãã§æ§æãããŸãã äŸ - ã¬ã³ããªã³ã° ã³ã³ããŒãã³ããå Žæãªã©ã ãããã¯ããŒã¿ ãŠã§ã¢ããŠã¹ã§ãã
- ã·ã¹ãã - ãªããžã§ã¯ããšã³ã³ããŒãã³ãã®äž¡æ¹ã䜿çšããããã«ãã®ããŒã¿ã«åºã¥ãåäœãšããžãã¯ãå«ãŸããŠããŸãã äŸãšããŠã¯ãã¬ã³ããªã³ã° ã³ã³ããŒãã³ãã䜿çšããŠãã¹ãŠã®ãšã³ãã£ãã£ãå埩åŠçããŠã¬ã³ããªã³ã°ãå®è¡ããã¬ã³ããªã³ã° ã·ã¹ãã ããããŸãã
調æ»ããçµæãECS ã次ã®åé¡ã解決ããããšãæããã«ãªããŸããã
- ç¶æ¿ã®ä»£ããã«ã¬ã€ã¢ãŠãã䜿çšããŠãšã³ãã£ãã£ãäœç³»çã«æŽçããŸãã
- å¶åŸ¡ã·ã¹ãã ãéããŠã³ãŒãã®æ··ä¹±ãåãé€ãã
- is_build_mode ãªã©ã®ã¡ãœããã䜿çšããŠãã¯ã€ã€ãã¬ãŒã ããžãã¯ãã¬ã³ããªã³ã° ã·ã¹ãã å ã®åãå Žæã«ä¿æããŸãã
ECSå°å ¥åŸã¯ãããªããŸããã
ãªãœãŒã¹ -> ããã«ãã¹ãŠã®ã¢ã»ããããããŸã (ç»å)
SRC
- ã³ã³ããŒãã³ã
âposition.rs
â person.rs
â ããã¹ã³ãŒã.rs
â ããã¢.rs
- ã¯ã€ã€ãŒãã¬ãŒã .rs
âmouse_tracked.rs
- ãªãœãŒã¹
âmouse.rs
- ã·ã¹ãã
â rendering.rs
â constants.rs
â utils.rs
â world_factory.rs -> ã¯ãŒã«ããã¡ã¯ããªãŒé¢æ°
â main.rs -> ã¡ã€ã³ã«ãŒã
ç§ãã¡ã¯è£å€æã«äººãå²ãåœãŠãŸã
ECS ã¯ç掻ã楜ã«ããŸãã ããã§ããšã³ãã£ãã£ã«ããŒã¿ãè¿œå ãããã®ããŒã¿ã«åºã¥ããŠããžãã¯ãè¿œå ããäœç³»çãªæ¹æ³ãã§ããŸããã ãããŠããã«ãããæ³å»·å ã®äººã®é 眮ãæŽçããããšãå¯èœã«ãªããŸããã
ç§ãäœãããïŒ
- å²ãåœãŠãããè£å€æã«é¢ããããŒã¿ãå人ã«è¿œå ããŸããã
- åæ£ãã人ã ã«é¢ããããŒã¿ã TennisCourt ã«è¿œå ããŸããã
- CourtChoosingSystem ãè¿œå ããŸãããããã«ããã人ã ãšã³ãŒããåæããå©çšå¯èœãªã³ãŒããæ€åºããããã«éžæãåé ããããšãã§ããŸãã
- è£å€æã«å²ãåœãŠããã人ãæ¢ããããã«ããªãå Žåã¯ãå¿ èŠãªå Žæã«äººãéããŸãã
èŠçŽ
ãã®ã·ã³ãã«ãªã²ãŒã ã«åãçµãã®ãæ¬åœã«æ¥œããã£ãã§ãã ããã«ãRust ã䜿çšããŠæžããŠããã£ããšæããŸãããã®çç±ã¯æ¬¡ã®ãšããã§ãã
- Rust ã¯å¿ èŠãªãã®ãæäŸããŸãã
- Rust ã«ã¯åªããããã¥ã¡ã³ãããããRust ã¯éåžžã«ãšã¬ã¬ã³ãã§ãã
- äžè²«æ§ã¯ã¯ãŒã«ã§ãã
- ç§ã C++ ã§ããè¡ã£ãŠãããã¯ããŒã³äœæãã³ããŒããŸãã¯ãã®ä»ã®åæ§ã®æäœã«é Œãå¿ èŠã¯ãããŸããã
- ãªãã·ã§ã³ã¯éåžžã«äœ¿ããããããšã©ãŒãããŸãåŠçããŸãã
- ãããžã§ã¯ããã³ã³ãã€ã«ã§ããå Žåã99% ã®ç¢ºçã§ãæ£ããåäœããŸãã ã³ã³ãã€ã©ã®ãšã©ãŒ ã¡ãã»ãŒãžã¯ãç§ãèŠãäžã§æé«ã®ãã®ã ãšæããŸãã
Rust ã§ã®ã²ãŒã éçºã¯ãŸã å§ãŸã£ãã°ããã§ãã ããããRust ã誰ã«ã§ãå ¬éããããã«åãçµãã§ãããå®å®ããããªã倧èŠæš¡ãªã³ãã¥ããã£ããã§ã«ååšããŸãã ãããã£ãŠãç§ã¯ãã®èšèªã®å°æ¥ã楜芳çã«èŠãŠãããç§ãã¡ã®å ±éã®åãçµã¿ã®çµæã楜ãã¿ã«ããŠããŸãã
ã¹ãã«ããã¯ã¹ã¯æ¬¡ã®ããšãæšå¥šããŸãã
- ãªã³ã©ã€ã³ã³ãŒã¹
ãè·æ¥ããã³ããšã³ãéçºè ã .- å®è·µã³ãŒã¹
ãã¢ãã€ã«ããããããŒPROã .- å®è·µäžå¹Žã³ãŒã¹
ã0ããPROãŸã§ã®PHPéçºè ã .
åºæïŒ habr.com