Kutamba Rust mumaawa makumi maviri nemana: ruzivo rwekuvandudza pachako

Kutamba Rust mumaawa makumi maviri nemana: ruzivo rwekuvandudza pachako

Muchinyorwa chino ini ndichataura nezve chiitiko changu chega chekugadzira mutambo mudiki muRust. Zvakatora anenge maawa e24 kugadzira shanduro yekushanda (Ini ndaiwanzoshanda manheru kana pakupera kwevhiki). Mutambo wacho hausati wapera, asi ndinofunga kuti chiitiko chacho chichava nemubairo. Ndichagovera zvandakadzidza uye zvimwe zvandakaona ndichigadzira mutambo kubva pakutanga.

Skillbox inokurudzira: Makore maviri anoshanda kosi "Ini ndiri PRO webhu developer".

Tinoyeuchidza: kune vese vaverengi veHabr - a 10 ruble mutengo paunenge uchinyoresa mune chero Skillbox kosi uchishandisa iyo Habr promo kodhi.

Nei Muchiita Ngura?

Ndakasarudza mutauro uyu nekuti ndakanzwa zvakawanda zvakanaka nezvawo uye ndinouona uchiwedzera kufarirwa mukusimudzira mitambo. Ndisati ndanyora mutambo uyu, ndakanga ndisina ruzivo rwekugadzira manyorerwo ari nyore muRust. Izvi zvaive zvakakwana kuti ndipe pfungwa yekusununguka ndichinyora mutambo.

Sei mutambo uye mutambo werudzii?

Kuita mitambo kunonakidza! Ndinoshuva kuti dai paine zvikonzero zvakawanda, asi kune mapurojekiti e "kumba" ini ndinosarudza misoro isinganyanyi kuwirirana nebasa rangu renguva dzose. Mutambo upi uyu? Ini ndaida kugadzira chimwe chinhu senge tennis simulator inosanganisa Cities Skylines, Zoo Tycoon, Prison Architect uye tennis pachayo. Kazhinji, wakave mutambo we tennis academy uko vanhu vanouya kuzotamba.

Kudzidziswa kwehunyanzvi

Ndaida kushandisa Rust, asi ndakanga ndisingazivi kuti yaizotora hwaro hwakadini kuti nditange. Ini ndaisada kunyora mapixel shaders uye kushandisa dhonza-n-kudonha, saka ndaitsvaga mhinduro dzinochinjika.

Ndawana zviwanikwa zvinobatsira zvandinogovana newe:

Ndakaongorora akati wandei Rust mutambo injini, pakupedzisira ndichisarudza Piston uye ggez. Ndakavawana ndichishanda pane imwe purojekiti yapfuura. Pakupedzisira, ndakasarudza ggez nekuti yaiita senge yakakodzera kuita mutambo mudiki we2D. Piston's modular chimiro chakanyanya kuomarara kune mugadziri weanovice (kana mumwe munhu ari kushanda neRust kekutanga).

Mamiriro emutambo

Ndakatora nguva ndichifunga nezvemavakirwo eprojekti. Danho rekutanga kuita "nyika", vanhu uye tennis matare. Vanhu vanofanira kutenderera mumatare vomirira. Vatambi vanofanirwa kuve nehunyanzvi hunovandudza nekufamba kwenguva. Uyezve, panofanira kuva nemupepeti anokubvumira kuti uwedzere vanhu vatsva nematare, asi izvi hazvisisiri zvemahara.

Ndafunga zvese, ndakabva ndatanga kushanda.

Kusikwa kwemutambo

Kutanga: Denderedzwa uye Abstractions

Ndakatora muenzaniso kubva kuggez ndikawana denderedzwa pachiratidziri. Zvinoshamisa! Iye zvino mamwe maabstractions. Ndakafunga kuti zvingava zvakanaka kubvisa kubva pane pfungwa yechinhu chemutambo. Chinhu chimwe nechimwe chinofanira kupihwa uye kuvandudzwa sezvakataurwa pano:

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

Ichi chidimbu chekodhi chakandipa runyoro rwakanaka rwezvinhu zvandaigona kuvandudza uye kupa mune yakaenzana yakanaka loop.

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 inodiwa nekuti ine mitsara yese yekodhi. Ndakapedza nguva shoma ndichipatsanura mafaera uye nekugadzirisa dhairekitori chimiro. Izvi ndizvo zvazvakaita mushure meizvi:
zviwanikwa -> apa ndipo pane zvinhu zvese (mifananidzo)
Src
- masangano
β€” game_object.rs
- circle.rs
- main.rs -> main loop

Vanhu, pasi uye mifananidzo

Nhanho inotevera ndeyekugadzira Munhu mutambo chinhu uye kurodha mifananidzo. Zvese zvinofanirwa kuvakwa pahwaro hwe32 * 32 mataira.

Kutamba Rust mumaawa makumi maviri nemana: ruzivo rwekuvandudza pachako

Tennis matare

Mushure mekudzidza kuti matare etenisi anotaridzika sei, ndakafunga kuvagadzira kubva ku4 * 2 mataira. Pakutanga, zvaive zvichikwanisika kugadzira mufananidzo wehukuru uhu, kana kuisa pamwe 8 matiles akasiyana. Asi ndakazoona kuti paidiwa matiles maviri chete akasiyana, ndosaka.

Pakazara tine matiles maviri akadai: 1 uye 2.

Chikamu chimwe nechimwe chedare chine tile 1 kana tile 2. Inogona kuiswa seyakajairika kana kupeta 180 degrees.

Kutamba Rust mumaawa makumi maviri nemana: ruzivo rwekuvandudza pachako

Basic kuvaka (assembly) mode

Mushure mekunge ndakwanisa kuwana masayiti, vanhu uye mepu, ndakaona kuti nzira yekusangana yaidiwa zvakare. Ndakazviita seizvi: kana bhatani rikadzvanywa, chinhu chinosarudzwa, uye kudzvanya kuchiisa munzvimbo yaunoda. Saka, bhatani 1 rinokutendera kuti usarudze dare, uye bhatani 2 rinokutendera iwe kusarudza mutambi.

Asi tichiri kuda kurangarira kuti 1 na 2 zvinorevei, saka ndakaisa wireframe kuti ijekese kuti ndechipi chinhu chakasarudzwa. Izvi ndizvo zvazvinoita.

Kutamba Rust mumaawa makumi maviri nemana: ruzivo rwekuvandudza pachako

Architecture uye refactoring mibvunzo

Iye zvino ndine zvinhu zvakawanda zvemitambo: vanhu, matare uye pasi. Asi kuti mawaya mafiremu ashande, chimwe nechimwe chinhu chinoda kuudzwa kana zvinhu zvacho zviri mukuratidzira, kana kuti furemu inodhirowa. Izvi hazvisi nyore.

Zvaiita sekuti chivakwa chaifanira kudzokororwa nenzira yakaratidza zvimwe zvisingakwanisi:

  • Kuve nechinhu chinozvipa nekuzvinatsiridza idambudziko nekuti icho mubatanidzwa hachizokwanisa "kuziva" icho chinofanirwa kupa - mufananidzo newaya;
  • kushaikwa kwechishandiso chekutsinhanisa zvivakwa uye maitiro pakati pemasangano ega (semuenzaniso, is_build_mode pfuma kana maitiro ekupa). Zvingave zvinogoneka kushandisa nhaka, kunyangwe pasina nzira kwayo yekuishandisa muRust. Chandaida chaizvo kwaiva marongerwo;
  • chombo chekudyidzana pakati pemasangano chaidiwa kupa vanhu kumatare;
  • iwo masangano pachawo aive musanganiswa wedata uye pfungwa dzakakurumidza kubuda mukutonga.

Ndakaita imwe tsvagiridzo ndikawana mavakirwo acho ECS - Entity Component System, iyo inowanzoshandiswa mumitambo. Heano mabhenefiti eECS:

  • data yakaparadzaniswa kubva kune logic;
  • kuumbwa panzvimbo yenhaka;
  • data-centric architecture.

ECS inoratidzwa nematatu ekutanga pfungwa:

  • masangano - rudzi rwechinhu chinorehwa nemuzivi (chinogona kuva mutambi, bhora, kana chimwewo chinhu);
  • zvikamu - masangano anoumbwa nawo. Muenzaniso - kupa chikamu, nzvimbo uye zvimwe. Aya matura data;
  • masisitimu - anoshandisa zvese zvinhu uye zvikamu, pamwe neane maitiro uye pfungwa dzakavakirwa pane iyi data. Muenzaniso igadziriso inodzokorodza kuburikidza nemasangano ese ane zvikamu zvekupa uye kuita iyo.

Mushure mekuidzidza, zvakava pachena kuti ECS inogadzirisa matambudziko anotevera:

  • kushandisa marongerwo pachinzvimbo chenhaka kuronga masangano nenzira yakarongeka;
  • kubvisa kodhi jumble kuburikidza nekutonga masisitimu;
  • uchishandisa nzira dzakaita se_build_mode kuchengetedza wireframe logic iri munzvimbo imwechete - mune rendering system.

Izvi ndizvo zvakaitika mushure mekushandisa ECS.

zviwanikwa -> apa ndipo pane zvinhu zvese (mifananidzo)
Src
- zvikamu
-nzvimbo.rs
- munhu.rs
β€” tennis_court.rs
- pasi.rs
- wireframe.rs
β€” mouse_tracked.rs
- zviwanikwa
-mouse.rs
- masisitimu
- kupa.rs
- constants.rs
- utils.rs
β€” world_factory.rs -> world fekitori mabasa
- main.rs -> main loop

Tinoisa vanhu kumatare edzimhosva

ECS yakaita kuti hupenyu huve nyore. Zvino ini ndanga ndine nzira yakarongeka yekuwedzera data kune masangano uye kuwedzera logic zvichienderana neiyo data. Uye izvi, zvakare, zvakaita kuti zvikwanisike kuronga kugoverwa kwevanhu pakati pematare.

Ndakaitei?

  • yakawedzera data pamusoro pematare akapiwa kuMunhu;
  • yakawedzera data nezve vanhu vakagoverwa kuTennisCourt;
  • akawedzera CourtChoosingSystem, iyo inokutendera kuti uongorore vanhu nematare, kuona matare aripo uye kugovera vatambi kwavari;
  • akawedzera PersonMovementSystem, inotarisa vanhu vakaiswa kumatare, uye kana vasipo, inobva yatumira vanhu kwavanofanira kunge vari.

Kutamba Rust mumaawa makumi maviri nemana: ruzivo rwekuvandudza pachako

Summing up

Ndainakidzwa chaizvo nekushanda pamutambo uyu uri nyore. Uyezve, ndinofara kuti ndakashandisa Rust kuinyora, nokuti:

  • Ngura inokupa zvaunoda;
  • ine zvinyorwa zvakanakisa, Rust inoyevedza;
  • kuwirirana kunotonhorera;
  • haufaniri kushandisa cloning, kukopa kana zvimwe zviito zvakafanana, izvo zvandaiwanzoita muC ++;
  • Sarudzo dziri nyore kwazvo kushandisa uye kubata zvikanganiso zvakanaka kwazvo;
  • kana purojekiti yakakwanisa kuumbwa, ipapo 99% yenguva yainoshanda, uye sezvainofanirwa kuita. Ini ndinofunga iyo compiler kukanganisa meseji ndiyo yakanakisa yandaona.

Kuvandudzwa kwemutambo muRust kuchangotanga. Asi kwatove nenharaunda yakagadzikana uye yakakura zvakaringana iri kushanda kuvhura Rust kumunhu wese. Nokudaro, ndinotarisa ramangwana remutauro netariro, tichitarisira migumisiro yebasa redu rakafanana.

Skillbox inokurudzira:

Source: www.habr.com

Voeg