Ukudlala i-Rust emahoreni angama-24: ukuzithuthukisa komuntu siqu

Ukudlala i-Rust emahoreni angama-24: ukuzithuthukisa komuntu siqu

Kulesi sihloko ngizokhuluma ngolwazi lwami lomuntu siqu lokuthuthukisa umdlalo omncane eRust. Kuthathe cishe amahora angama-24 ukwenza inguqulo esebenzayo (izikhathi eziningi ngangisebenza kusihlwa noma ngezimpelasonto). Umdlalo usekude nokuphela, kodwa ngicabanga ukuthi ukuzizwisa kuzoba nomvuzo. Ngizokwabelana ngalokho engikufundile kanye nokunye engikuqaphelile engikwenzile ngenkathi ngakha igeyimu kusukela ekuqaleni.

I-Skillbox iyancoma: Isifundo sokwenza iminyaka emibili "Ngingumthuthukisi wewebhu we-PRO".

Siyakukhumbuza: kubo bonke abafundi be-"Habr" - isaphulelo sama-ruble angu-10 lapho ubhalisa kunoma yisiphi isifundo se-Skillbox usebenzisa ikhodi yephromoshini ethi "Habr".

Kungani Kugqwala?

Ngikhethe lolu limi ngoba kuningi okuhle engikuzwile ngalo futhi ngibona luya ngokuya luduma ekuthuthukisweni kwemidlalo. Ngaphambi kokubhala umdlalo, benginolwazi oluncane lokuthuthukisa izinhlelo zokusebenza ezilula ku-Rust. Lokhu bekwanele ukunginika umuzwa wenkululeko ngenkathi ngibhala umdlalo.

Kungani umdlalo futhi hlobo luni lomdlalo?

Ukwenza imidlalo kumnandi! Ngifisa sengathi bekunezizathu ezengeziwe, kodwa kumaphrojekthi "ekhaya" ngikhetha izihloko ezingahlobene kakhulu nomsebenzi wami ojwayelekile. Imuphi umdlalo lo? Bengifuna ukwenza into efana nesifanisi sethenisi esihlanganisa iCities Skylines, Zoo Tycoon, Prison Architect kanye nethenisi uqobo. Sekukonke, kube wumdlalo omayelana nesikole sethenisi lapho abantu beza khona bezodlala.

Ukuqeqeshwa kobuchwepheshe

Ngangifuna ukusebenzisa i-Rust, kodwa ngangingazi ukuthi kwakuzodingeka isisekelo esingakanani ukuqalisa. Bengingafuni ukubhala ama-pixel shader futhi ngisebenzise i-drag-n-drop, ngakho bengifuna izixazululo ezivumelana nezimo kakhulu.

Ngithole izinsiza eziwusizo engabelana ngazo nawe:

Ngihlole izinjini ezimbalwa zegeyimu ye-Rust, ekugcineni ngakhetha i-Piston ne-ggez. Ngazifica ngisasebenza kuphrojekthi edlule. Ekugcineni, ngikhethe i-ggez ngoba ibonakale ifaneleka kakhulu ukusebenzisa igeyimu encane ye-2D. Isakhiwo se-modular ye-Piston siyinkimbinkimbi kakhulu kunjiniyela osaqalayo (noma othile osebenza noRust okokuqala ngqa).

Isakhiwo somdlalo

Ngichithe isikhathi ngicabanga ngesakhiwo sephrojekthi. Isinyathelo sokuqala ukwenza "umhlaba", abantu kanye nezinkantolo zethenisi. Abantu kumele bazulazule ezinkantolo balinde. Abadlali kumele babe namakhono athuthukayo ngokuhamba kwesikhathi. Futhi, kufanele kube nomhleli okuvumela ukuthi ungeze abantu abasha nezinkantolo, kodwa lokhu akusamahhala.

Ngemva kokucabangisisa ngakho konke, ngaqala ukusebenza.

Ukudalwa kwegeyimu

Isiqalo: Imibuthano kanye Nezifinyezo

Ngithathe isibonelo ku-ggez ngathola umbuthano esikrinini. Kuyamangalisa! Manje ezinye izifinyezo. Ngicabange ukuthi kungaba kuhle ukukhipha umbono wento yomdlalo. Into ngayinye kufanele inikezwe futhi ibuyekezwe njengoba kushiwo lapha:

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

Lolu cezu lwekhodi lunginikeze uhlu oluhle lwezinto engingakwazi ukuzibuyekeza futhi ngizinikeze ngeluphu enhle ngokulinganayo.

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 iyadingeka ngoba iqukethe yonke imigqa yekhodi. Ngichithe isikhathi esincane ngihlukanisa amafayela futhi ngithuthukisa ukwakheka kwemibhalo. Nansi indlela okwabukeka ngayo ngemva kwalokho:
izinsiza -> kulapho zonke izimpahla zikhona (izithombe)
src
- izinhlangano
— umdlalo_object.rs
- indilinga.rs
— main.rs -> iluphu eyinhloko

Abantu, phansi nemifanekiso

Isinyathelo esilandelayo ukwakha into yegeyimu yomuntu bese ulayisha izithombe. Konke kufanele kwakhiwe ngesisekelo samathayili angama-32*32.

Ukudlala i-Rust emahoreni angama-24: ukuzithuthukisa komuntu siqu

Izinkantolo eziyishumi

Ngemva kokufunda ukuthi izinkundla zethenisi zibukeka kanjani, nginqume ukuzenza ngamathayili angu-4*2. Ekuqaleni, kwakungenzeka ukwenza isithombe salo sayizi, noma ukuhlanganisa amathayili angu-8 ahlukene. Kodwa-ke ngabona ukuthi kwakudingeka amathayili amabili kuphela ahlukile, futhi yingakho.

Sekukonke sinamathayela amabili anjalo: 1 no-2.

Isigaba ngasinye senkantolo siqukethe ithayela 1 noma ithayela 2. Angabekwa njengokujwayelekile noma aphendulwe amadigri angu-180.

Ukudlala i-Rust emahoreni angama-24: ukuzithuthukisa komuntu siqu

Imodi yokwakhiwa okuyisisekelo (umhlangano).

Ngemva kokuba ngikwazile ukuzuza ukunikezwa kwamasayithi, abantu namamephu, ngabona ukuthi imodi yomhlangano eyisisekelo nayo yayidingeka. Ngiyisebenzise kanje: lapho inkinobho icindezelwa, into iyakhethwa, bese ukuchofoza kuyibeka endaweni oyifunayo. Ngakho, inkinobho 1 ikuvumela ukuthi ukhethe inkundla, futhi inkinobho 2 ikuvumela ukuthi ukhethe umdlali.

Kodwa sisadinga ukukhumbula ukuthi u-1 no-2 usho ukuthini, ngakho ngingeze i-wireframe ukuze ngicacise ukuthi iyiphi into ekhethiwe. Lokhu kubukeka kanjani.

Ukudlala i-Rust emahoreni angama-24: ukuzithuthukisa komuntu siqu

Imibuzo ye-Architecture kanye ne-refactoring

Manje nginezinto eziningi zegeyimu: abantu, izinkantolo kanye nephansi. Kodwa ukuze ama-wireframe asebenze, ibhizinisi ngalinye lidinga ukutshelwa ukuthi ingabe izinto ngokwazo zikumodi yokubonisa, noma ukuthi uhlaka luvele ludwetshwe. Lokhu akulula kakhulu.

Kimina kwabonakala sengathi ukwakheka kwakudingeka kucatshangelwe kabusha ngendlela eyembule imikhawulo ethile:

  • Ukuba nebhizinisi elizinikezelayo nelizibuyekezayo kuyinkinga ngoba lelo bhizinisi ngeke likwazi “ukwazi” ukuthi kufanele linikeze ini - isithombe nohlaka locingo;
  • ukuntuleka kwethuluzi lokushintshanisa izakhiwo nokuziphatha phakathi kwezinkampani ngazinye (isibonelo, impahla ye-is_build_mode noma ukunikezela ngokuziphatha). Kungasetshenziswa ifa, nakuba ingekho indlela efanele yokulisebenzisa ku-Rust. Engangikudinga ngempela kwakuwukuhlela;
  • kwakudingeka ithuluzi lokusebenzelana phakathi kwezinhlangano ukuze kwabelwe abantu ezinkantolo;
  • izinhlangano ngokwazo beziyingxube yedatha nengqondo eyaphuma ngokushesha ekulawuleni.

Ngenza olunye ucwaningo futhi ngathola i-architecture I-ECS - Isistimu Yengxenye Yebhizinisi, evame ukusetshenziswa emidlalweni. Nazi izinzuzo ze-ECS:

  • idatha ihlukaniswe ku-logic;
  • ukwakheka esikhundleni sefa;
  • i-data-centric architecture.

I-ECS ibonakala ngemiqondo emithathu eyisisekelo:

  • amabhizinisi - uhlobo lwento isihlonzi esibhekisela kuyo (kungaba umdlali, ibhola, noma enye into);
  • izingxenye - izinhlaka zakhiwe ngazo. Isibonelo - ingxenye yokuhlinzeka, izindawo nokunye. Lezi yizindawo zokugcina idatha;
  • amasistimu - asebenzisa kokubili izinto nezingxenye, futhi aqukethe ukuziphatha nokunengqondo okusekelwe kule datha. Isibonelo isistimu yokunikezela ephindaphinda kuwo wonke amabhizinisi anezingxenye zokunikezela futhi yenza ukunikezwa.

Ngemva kokuyifunda, kwacaca ukuthi i-ECS ixazulula izinkinga ezilandelayo:

  • ukusebenzisa isakhiwo esikhundleni sefa ukuhlela amabhizinisi ngendlela ehlelekile;
  • ukususa i-code jumble ngokusebenzisa izinhlelo zokulawula;
  • usebenzisa izindlela ezifana ne-is_build_mode ukuze ugcine i-logic ye-wireframe isendaweni efanayo - ohlelweni lokunikeza.

Yilokhu okwenzeka ngemva kokuqaliswa kwe-ECS.

izinsiza -> kulapho zonke izimpahla zikhona (izithombe)
src
- izingxenye
-isikhundla.rs
- umuntu.rs
- tennis_court.rs
- phansi.rs
- i-wireframe.rs
— mouse_tracked.rs
- izinsiza
-igundane.rs
- amasistimu
- ukunikeza.rs
- njalonjalo.rs
- utils.rs
— world_factory.rs -> imisebenzi yefekthri yomhlaba
— main.rs -> iluphu eyinhloko

Sibeka abantu ezinkantolo

I-ECS yenze ukuphila kwaba lula. Manje ngase ngibe nendlela ehlelekile yokwengeza idatha kuzinhlangano futhi ngengeze ingqondo ngokusekelwe kuleyo datha. Futhi lokhu, kwenza kwaba nokwenzeka ukuhlela ukusatshalaliswa kwabantu phakathi kwezinkantolo.

Ngenzeni:

  • wanezela imininingwane mayelana nezinkantolo ezabelwe uMuntu;
  • wanezela idatha mayelana nabantu abasabalalisiwe e-TennisCourt;
  • added CourtChoosingSystem, ekuvumela ukuthi uhlaziye abantu nezinkantolo, uthole izinkantolo ezikhona futhi usabalalise abadlali kuzo;
  • yengeza i-PersonMovementSystem, ebheka abantu abanikezwe izinkantolo, futhi uma bengekho, bese ithumela abantu lapho kufanele babe khona.

Ukudlala i-Rust emahoreni angama-24: ukuzithuthukisa komuntu siqu

Ukufingqa

Ngikujabulele kakhulu ukusebenza kulo mdlalo olula. Ngaphezu kwalokho, ngiyajabula ukuthi ngisebenzise uRust ukuyibhala, ngoba:

  • Ukugqwala kukunika okudingayo;
  • inamaphepha amahle kakhulu, iRust inhle kakhulu;
  • ukungaguquguquki kupholile;
  • akudingekile ukuthi usebenzise i-cloning, ukukopisha noma ezinye izenzo ezifanayo, engangivame ukuzenza ku-C++;
  • Izinketho zilula kakhulu ukuzisebenzisa futhi zibambe amaphutha kahle kakhulu;
  • uma ngabe iphrojekthi ikwazile ukuhlanganiswa, bese kuba ngu-99% wesikhathi esebenza ngaso, futhi njengoba kufanele. Ngicabanga ukuthi imilayezo yephutha yesihlanganisi iyona engcono kakhulu engiyibonile.

Ukuthuthukiswa komdlalo ku-Rust kuyaqala. Kodwa sekunomphakathi ozinzile futhi omkhulu ngokwanele osebenza ukuvula i-Rust kuwo wonke umuntu. Ngakho-ke, ngibheka ikusasa lolimi ngethemba, ngibheke phambili emiphumeleni yomsebenzi wethu ofanayo.

I-Skillbox iyancoma:

Source: www.habr.com

Engeza amazwana