Ke pāʻani nei iā Rust i nā hola 24: ʻike pilikino pilikino

Ke pāʻani nei iā Rust i nā hola 24: ʻike pilikino pilikino

Ma kēia ʻatikala e kamaʻilio wau e pili ana i koʻu ʻike pilikino i ka hoʻomohala ʻana i kahi pāʻani liʻiliʻi ma Rust. Ma kahi o 24 mau hola e hana ai i kahi mana hana (ua hana nui wau i nā ahiahi a i nā hopena pule). ʻAʻole i pau ka pāʻani, akā manaʻo wau e uku ʻia ka ʻike. E kaʻana aku au i nā mea aʻu i aʻo ai a me kekahi mau ʻike aʻu i hana ai i ke kūkulu ʻana i ka pāʻani mai ka wā ʻōpala.

Manaʻo ʻo Skillbox: ʻElua makahiki papa hana "He mea hoʻomohala pūnaewele PRO wau".

Hoʻomaopopo mākou iā ʻoe: no ka poʻe heluhelu a pau o "Habr" - kahi ho'ēmi o 10 rubles i ka wā e kākau inoa ai i kekahi papa Skillbox e hoʻohana ana i ka code promotional "Habr".

No ke aha ʻo Rust?

Ua koho au i kēia ʻōlelo no ka mea ua lohe au i nā mea maikaʻi he nui e pili ana i ia ʻōlelo a ʻike au i ka ulu ʻana a kaulana loa i ka hoʻomohala pāʻani. Ma mua o ka kākau ʻana i ka pāʻani, ua liʻiliʻi koʻu ʻike i ka hoʻomohala ʻana i nā noi maʻalahi ma Rust. Ua lawa kēia e hāʻawi mai iaʻu i ka manaʻo o ke kūʻokoʻa i ke kākau ʻana i ka pāʻani.

No ke aha ka pāʻani a me ke ʻano o ka pāʻani?

Leʻaleʻa ka hana ʻana i nā pāʻani! Manaʻo wau he nui nā kumu, akā no nā papahana "home" koho wau i nā kumuhana i pili ʻole i kaʻu hana maʻamau. He aha kēia pāʻani? Makemake au e hana i kekahi mea e like me ka simulator tennis e hoʻohui i nā Cities Skylines, Zoo Tycoon, Prison Architect a me ka tennis ponoʻī. Ma keʻano laulā, ua lilo ia i pāʻani e pili ana i kahi kula tennis kahi e hele mai ai nā kānaka e pāʻani.

Aʻo ʻenehana

Makemake au e hoʻohana iā Rust, akā ʻaʻole maopopo iaʻu i ka nui o ka hana e hoʻomaka ai. ʻAʻole wau i makemake e kākau i nā ʻāpana pixel a hoʻohana i ka drag-n-drop, no laila ke ʻimi nei au i nā hopena maʻalahi.

Ua loaʻa iaʻu nā kumuwaiwai pono aʻu e kaʻana like me ʻoe:

Ua ʻimi au i kekahi mau ʻenekini pāʻani Rust, ma hope ke koho ʻana iā Piston a me ggez. Ua ʻike au iā lākou i ka hana ʻana i kahi papahana mua. I ka hopena, ua koho au i ka ggez no ka mea ua kūpono ia no ka hoʻokō ʻana i kahi pāʻani 2D liʻiliʻi. Paʻakikī loa ka ʻōnaehana modular o Piston no ka mea hoʻomohala hou (a i ʻole kekahi e hana pū ana me Rust no ka manawa mua).

ʻAno pāʻani

Ua hoʻolilo wau i kekahi manawa noʻonoʻo e pili ana i ka hoʻolālā o ka papahana. ʻO ka hana mua, ʻo ia ka hana ʻana i ka "'āina", nā kānaka a me nā pā tennis. Pono nā kānaka e neʻe a puni nā pā hale a kali. Pono nā mea pāʻani e hoʻomaikaʻi i ka manawa. Eia kekahi, pono e loaʻa kahi mea hoʻoponopono e hiki ai iā ʻoe ke hoʻohui i nā poʻe hou a me nā ʻaha hoʻokolokolo, akā ʻaʻole manuahi kēia.

No ka noʻonoʻo ʻana i nā mea āpau, pono wau e hana.

Hoʻokumu pāʻani

Hoʻomaka: Nā pōʻai a me nā Abstractions

Ua lawe au i kahi laʻana mai ggez a loaʻa iaʻu kahi pōʻai ma ka pale. Kupanaha! I kēia manawa kekahi mau abstractions. Ua manaʻo wau he mea maikaʻi ia e haʻalele i ka manaʻo o kahi mea pāʻani. Pono e hāʻawi a hōʻano hou ʻia kēlā me kēia mea e like me ka ʻōlelo ma aneʻi:

// 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(())
    }
}

Ua hāʻawi mai kēia ʻāpana code iaʻu i kahi papa inoa maikaʻi o nā mea hiki iaʻu ke hoʻololi a hāʻawi i loko o kahi loop maikaʻi like.

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(())
    }
}

pono ka main.rs no ka mea aia nā laina o ke code. Ua hoʻohana wau i kahi manawa liʻiliʻi e hoʻokaʻawale i nā faila a me ka hoʻomaikaʻi ʻana i ka hoʻolālā papa kuhikuhi. ʻO kēia ke ʻano o ia mea ma hope o kēlā:
nā kumuwaiwai -> ʻo ia kahi o nā waiwai āpau (nā kiʻi)
src
- nā hui
— game_object.rs
- pōʻai.rs
— main.rs -> loop loop

Nā kānaka, nā papahele a me nā kiʻi

ʻO ka hana aʻe e hana i kahi mea pāʻani Person a hoʻouka i nā kiʻi. Pono e kūkulu ʻia nā mea āpau ma ke kumu o 32 * 32 tile.

Ke pāʻani nei iā Rust i nā hola 24: ʻike pilikino pilikino

He ʻaha ʻī aku

Ma hope o ke aʻo ʻana i ke ʻano o nā pā tennis, ua hoʻoholo wau e hana iā lākou mai nā tile 4*2. I ka hoʻomaka ʻana, hiki ke hana i kahi kiʻi o kēia nui, a i ʻole e hui pū i nā tile ʻokoʻa 8. Akā, ua ʻike au he ʻelua wale nā ​​tile kūʻokoʻa e pono ai, a eia ke kumu.

Loaʻa iā mākou ʻelua mau tile: 1 a me 2.

Aia kēlā me kēia ʻāpana o ka pā hale i ka tile 1 a i ʻole tile 2. Hiki ke waiho ʻia e like me ka maʻamau a i ʻole ka hoʻohuli ʻana i nā degere 180.

Ke pāʻani nei iā Rust i nā hola 24: ʻike pilikino pilikino

Ke ano hana kumu (hui).

Ma hope o koʻu hoʻokō ʻana i ka hoʻokō ʻana i nā pūnaewele, nā kānaka a me nā palapala 'āina, ua ʻike wau he pono pū kekahi ʻano hui kumu. Ua hoʻokō wau e like me kēia: ke kaomi ʻana i ke pihi, koho ʻia ka mea, a kau ke kaomi i kahi i makemake ʻia. No laila, hiki i ka pihi 1 ke koho i kahi ʻaha, a ʻo ke pihi 2 hiki iā ʻoe ke koho i kahi mea pāʻani.

Akā, pono mākou e hoʻomanaʻo i ke ʻano o ka 1 a me 2, no laila ua hoʻohui au i kahi wireframe e maopopo ai ka mea i koho ʻia. Penei kona ano.

Ke pāʻani nei iā Rust i nā hola 24: ʻike pilikino pilikino

Nā nīnau hoʻolālā a me refactoring

I kēia manawa he mau mea pāʻani kaʻu: nā kānaka, nā pā hale a me nā papahele. Akā, no ka hana ʻana o nā wireframes, pono e haʻi ʻia kēlā me kēia mea mea inā aia nā mea i ke ʻano hōʻikeʻike, a i ʻole ke kaha kiʻi wale ʻia. ʻAʻole maʻalahi kēia.

Me he mea lā iaʻu e pono e noʻonoʻo hou ʻia ka hale hana i kahi ala e hōʻike ai i kekahi mau palena:

  • He pilikia ka loaʻa ʻana o kahi hui e hoʻololi a hoʻohou iā ia iho no ka mea ʻaʻole hiki i kēlā hui ke "ʻike" i ka mea i manaʻo ʻia e hana - he kiʻi a me kahi wireframe;
  • nele i kahi mea hana no ka hoʻololi ʻana i nā waiwai a me nā ʻano ma waena o nā hui pākahi (no ka laʻana, ka waiwai is_build_mode a i ʻole ka hana ʻana i ka ʻano). Hiki ke hoʻohana i ka hoʻoilina, ʻoiai ʻaʻohe ala kūpono e hoʻokō ai iā Rust. ʻO kaʻu mea i makemake nui ai ʻo ia ka hoʻolālā;
  • he mea hana no ka launa pū ʻana ma waena o nā hui e hoʻonoho i nā kānaka i nā ʻaha;
  • ʻO nā hui ponoʻī he hui pū ʻana o ka ʻikepili a me ka loiloi i hele koke i waho o ka mana.

Ua hana hou au i ka noiʻi ʻana a ʻike au i ka hoʻolālā ECS - Pūnaehana Hui Pūnaehana, i hoʻohana mau ʻia i nā pāʻani. Eia nā pōmaikaʻi o ka ECS:

  • hoʻokaʻawale ʻia ka ʻikepili mai ka loiloi;
  • haku mele ma kahi o ka hoʻoilina;
  • ʻikepili-centric architecture.

Hōʻike ʻia ʻo ECS e ʻekolu manaʻo kumu:

  • nā hui - ke ʻano o ka mea i kuhikuhi ʻia e ka mea hōʻike (hiki ke lilo i mea pāʻani, pōlele, a i ʻole kekahi mea ʻē aʻe);
  • ʻāpana - nā mea i hana ʻia me lākou. Laʻana - ka hoʻolilo ʻana i nā ʻāpana, nā wahi a me nā mea ʻē aʻe. He mau waihona ʻikepili kēia;
  • ʻōnaehana - hoʻohana lākou i nā mea ʻelua a me nā ʻāpana, me nā ʻano hana a me nā loina e pili ana i kēia ʻikepili. ʻO kahi laʻana he ʻōnaehana hoʻololi e hoʻololi i nā hui āpau me ka hoʻolilo ʻana i nā ʻāpana a hana i ka unuhi.

Ma hope o ke aʻo ʻana, ua maopopo ka hoʻoponopono ʻana o ECS i kēia mau pilikia:

  • ka hoʻohana ʻana i ka hoʻolālā ma kahi o ka hoʻoilina e hoʻonohonoho i nā hui ma ka ʻōnaehana;
  • e hoʻopau i nā code jumble ma o nā ʻōnaehana mana;
  • me ka hoʻohana ʻana i nā ala e like me is_build_mode e mālama i ka logic wireframe ma kahi hoʻokahi - ma ka ʻōnaehana hana.

ʻO kēia ka mea i hana ma hope o ka hoʻokō ʻana i ka ECS.

nā kumuwaiwai -> ʻo ia kahi o nā waiwai āpau (nā kiʻi)
src
- nā ʻāpana
— kūlana.rs
— kanaka.rs
— ka hale tennis.rs
— papahele.rs
- wireframe.rs
— mouse_tracked.rs
- nā kumuwaiwai
—iole.rs
- nā ʻōnaehana
- rendering.rs
- mau.rs
- utils.rs
— world_factory.rs -> nā hana hale hana honua
— main.rs -> loop loop

Hoʻonoho mākou i nā kānaka i nā ʻaha

Ua maʻalahi ka ECS i ke ola. I kēia manawa ua loaʻa iaʻu kahi ala ʻōnaehana e hoʻohui i ka ʻikepili i nā hui a hoʻohui i ka loiloi e pili ana i kēlā ʻikepili. A ʻo kēia ka mea i hiki ke hoʻonohonoho i ka māhele ʻana o nā kānaka i waena o nā ʻaha.

He aha kaʻu i hana ai:

  • hoʻohui i ka ʻikepili e pili ana i nā ʻaha i hāʻawi ʻia iā Person;
  • hoʻohui i ka ʻikepili e pili ana i ka poʻe i puʻunaue ʻia i TennisCourt;
  • hoʻohui ʻia ʻo CourtChoosingSystem, kahi e hiki ai iā ʻoe ke nānā i nā kānaka a me nā ʻaha hoʻokolokolo, ʻike i nā ʻaha i loaʻa a hāʻawi i nā mea pāʻani iā ​​lākou;
  • hoʻohui i kahi PersonMovementSystem, e ʻimi ana i nā poʻe i hāʻawi ʻia i nā ʻaha, a inā ʻaʻole lākou i laila, a laila hoʻouna i nā poʻe i kahi e pono ai lākou.

Ke pāʻani nei iā Rust i nā hola 24: ʻike pilikino pilikino

Loaʻa i luna

Ua hauʻoli loa au i ka hana ʻana i kēia pāʻani maʻalahi. Eia kekahi, hauʻoli wau i kaʻu hoʻohana ʻana iā Rust e kākau iā ia, no ka mea:

  • Hāʻawi ka Rust i kāu mea e pono ai;
  • he palapala maikaʻi loa, nani loa ka Rust;
  • ʻoluʻolu ke kūlike;
  • ʻAʻole pono ʻoe e hoʻohana i ka cloning, kope ʻana a i ʻole nā ​​​​hana like ʻole, aʻu i hana pinepine ai ma C ++;
  • He maʻalahi loa nā koho e hoʻohana a mālama maikaʻi i nā hewa;
  • inā hiki ke hoʻohui ʻia ka papahana, a laila 99% o ka manawa e hana ai, a e like me ka mea e pono ai. Manaʻo wau ʻo nā memo hewa o ka compiler ka mea maikaʻi loa aʻu i ʻike ai.

Ke hoʻomaka nei ka hoʻomohala pāʻani ma Rust. Akā aia kahi kaiāulu kūpaʻa a nui loa e hana ana e wehe iā Rust i nā mea āpau. No laila, nānā au i ka wā e hiki mai ana o ka ʻōlelo me ka manaʻo maikaʻi, e kakali ana i ka hopena o kā mākou hana maʻamau.

Manaʻo ʻo Skillbox:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka