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.
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:
Ke pāʻani nei mākou - he papa inoa o nā mea Rust e pono ai no ka hoʻomohala pāʻani;
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.
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 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.
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.
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.