Ukudlala iRust kwiiyure ezingama-24: amava ophuhliso lomntu

Ukudlala iRust kwiiyure ezingama-24: amava ophuhliso lomntu

Kweli nqaku ndiza kuthetha ngamava am obuqu okuphuhlisa umdlalo omncinci kwiRust. Kuthathe malunga neeyure ezingama-24 ukwenza inguqulelo yokusebenza (ubukhulu becala bendisebenza ngokuhlwa okanye ngeempelaveki). Umdlalo usekude ukuba ugqitywe, kodwa ndicinga ukuba amava aya kuba nomvuzo. Ndiza kwabelana ngento endiyifundileyo kunye nokunye endikuqwalaseleyo endikwenzileyo ngelixa ndisakha umdlalo ukusuka ekuqaleni.

I-Skillbox iyacebisa: Ikhosi yokusebenza yeminyaka emibini "Ndingumphuhlisi wewebhu wePRO".

Siyakhumbuza: kubo bonke abafundi be "Habr" - isaphulelo se-ruble ye-10 xa ubhalisa kuyo nayiphi na ikhosi ye-Skillbox usebenzisa ikhowudi yokuphromotha "Habr".

Kutheni Umhlwa?

Ndikhethe olu lwimi kuba ndive izinto ezininzi ezintle ngalo kwaye ndibona lusiya luthandwa kakhulu kuphuhliso lomdlalo. Ngaphambi kokubhala umdlalo, bendinamava amancinci okuphuhlisa izicelo ezilula kwiRust. Oku kwakwanele ukundinika imvakalelo yenkululeko ngelixa ndibhala umdlalo.

Kutheni lo mdlalo kwaye hlobo luni lomdlalo?

Ukwenza imidlalo kumnandi! Ndinqwenela ukuba bekukho izizathu ezininzi, kodwa kwiiprojekthi "zasekhaya" ndikhetha izihloko ezingahambelani kakhulu nomsebenzi wam oqhelekileyo. Ngowuphi umdlalo lo? Ndandifuna ukwenza into efana ne-tennis simulator edibanisa iCities Skylines, Zoo Tycoon, Prison Architect kunye nentenetya ngokwayo. Ngokubanzi, kuye kwaba ngumdlalo malunga nesikolo sentenetya apho abantu beza kudlala.

Uqeqesho lobuchwephesha

Ndandifuna ukusebenzisa iRust, kodwa ndandingazi ncam ukuba ungakanani umhlaba oza kuwuthatha ukuqalisa. Khange ndifune ukubhala i-pixel shaders kwaye ndisebenzise i-drag-n-drop, ke bendijonge ezona zisombululo zibhetyebhetye.

Ndifumene izixhobo eziluncedo endibelana ngazo nawe:

Ndiphonononge iinjini ezininzi zomdlalo weRust, ekugqibeleni ndakhetha iPiston kunye neggez. Ndadibana nabo ngelixa ndisebenza kwiprojekthi yangaphambili. Ekugqibeleni, ndakhetha i-ggez kuba yayibonakala ifaneleka ngakumbi ukuphumeza umdlalo omncinci we-2D. Ulwakhiwo lweemodyuli zePiston luntsonkothile kakhulu kumphuhlisi oqalayo (okanye umntu osebenza noRust okokuqala).

Ulwakhiwo lomdlalo

Ndachitha ixesha elithile ndicinga malunga nokwakhiwa kweprojekthi. Inyathelo lokuqala kukwenza "umhlaba", abantu kunye neenkundla zentenetya. Abantu kufuneka bajikeleze ezinkundleni kwaye balinde. Abadlali kufuneka babe nezakhono eziphucula ngokuhamba kwexesha. Kwaye, kufuneka kubekho umhleli okuvumela ukuba wongeze abantu abatsha kunye neenkundla, kodwa oku akusekho simahla.

Ndicinge yonke into, ndiye ndasebenza.

Ukudalwa komdlalo

Ukuqala: Izangqa kunye nezinto ezithathwayo

Ndithathe umzekelo kwi-ggez ndafumana isangqa kwiscreen. Iyamangalisa! Ngoku ezinye izithintelo. Ndicinge ukuba kuya kuba kuhle ukukhupha umbono wento yomdlalo. Into nganye kufuneka inikezelwe kwaye ihlaziywe njengoko kuchaziwe apha:

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

Eli cwecwe lekhowudi lindinike uluhlu oluhle lwezinto endinokuhlaziya kwaye ndinikezele ngelophu entle 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 iyimfuneko kuba iqulethe yonke imigca yekhowudi. Ndichithe ixesha elincinci ndisahlula iifayile kwaye ndiphucula ubume bolawulo. Nantsi indlela eyabonakala ngayo emva koko:
izixhobo -> kulapho zonke ii-asethi zikhoyo (imifanekiso)
src
- amaqumrhu
— umdlalo_object.rs
- isangqa.rs
— main.rs -> main loop

Abantu, imigangatho kunye nemifanekiso

Isinyathelo esilandelayo kukudala into yomdlalo woMntu kunye nokulayisha imifanekiso. Yonke into kufuneka yakhiwe ngesiseko se-32 * 32 tile.

Ukudlala iRust kwiiyure ezingama-24: amava ophuhliso lomntu

Iinkundla zeTennis

Emva kokufunda ukuba iinkundla zentenetya zijongeka njani, ndagqiba ekubeni ndizenze ukusuka kwi-4 * 2 yeethayile. Ekuqaleni, kwakunokwenzeka ukwenza umfanekiso walo bukhulu, okanye ukubeka ndawonye ii-tile ezi-8 ezihlukeneyo. Kodwa ke ndaqonda ukuba zimbini kuphela iithayile ezizodwa ezifunekayo, kwaye nantsi isizathu.

Xa zizonke zineethayile ezimbini ezinje: 1 kunye no-2.

Icandelo ngalinye lenkundla liqukethe i-tile 1 okanye i-tile 2. Ziyakwazi ukubekwa njengesiqhelo okanye zijike i-180 degrees.

Ukudlala iRust kwiiyure ezingama-24: amava ophuhliso lomntu

Indlela yolwakhiwo olusisiseko (indibano).

Emva kokuba ndikwazile ukunikezela ngeesayithi, abantu kunye neemephu, ndiye ndaqonda ukuba indlela yokuhlanganisana esisiseko nayo iyafuneka. Ndiyiphumeze ngolu hlobo: xa iqhosha licinezelwa, into ikhethiwe, kwaye unqakrazo uyibeke kwindawo oyifunayo. Ke, iqhosha 1 likuvumela ukuba ukhethe inkundla, kwaye iqhosha 2 likuvumela ukuba ukhethe umdlali.

Kodwa kusafuneka sikhumbule ukuba u-1 kunye no-2 uthetha ukuthini, ngoko ke ndongeze i-wireframe ukuze icace ukuba yeyiphi into ekhethiweyo. Oku kubonakala ngathi.

Ukudlala iRust kwiiyure ezingama-24: amava ophuhliso lomntu

Ulwakhiwo kunye nemibuzo yokuhlaziya

Ngoku ndinezinto zemidlalo ezininzi: abantu, iinkundla kunye nemigangatho. Kodwa ukuze iifreyimi zocingo zisebenze, iqumrhu ngalinye lezinto kufuneka lixelelwe ukuba ngaba izinto ngokwazo zikwimo yokubonisa, okanye isakhelo sizotywe ngokulula. Oku akulula kakhulu.

Kwakubonakala kum ngathi uyilo kufuneka luqwalaselwe ngokutsha ngendlela eveze imida ethile:

  • Ukuba nequmrhu elinikezelayo kunye nokuzihlaziya kuyingxaki kuba elo qumrhu aliyi kukwazi "ukwazi" oko limele linikeze - umfanekiso kunye ne-wireframe;
  • ukungabikho kwesixhobo sokutshintshiselana ngeepropati kunye nokuziphatha phakathi kwezinto ezikhoyo (umzekelo, ipropathi ye-is_build_mode okanye unikezelo lokuziphatha). Kuya kwenzeka ukusebenzisa ilifa, nangona kungekho ndlela ifanelekileyo yokuyiphumeza kwi-Rust. Eyona nto ndandiyidinga ngokwenene yayiyiyo;
  • isixhobo sokusebenzisana phakathi kwamaqumrhu sasifuneka ukunika abantu ezinkundleni;
  • amaqumrhu ngokwawo ayengumxube wedatha kunye nengqiqo eyaphuma ngokukhawuleza kulawulo.

Ndenze uphando ngakumbi kwaye ndafumanisa i-architecture I-ECS - Inkqubo yeCandelo leQumrhu, edla ngokusetyenziswa kwimidlalo. Nazi izibonelelo ze-ECS:

  • idatha yahlulwe kwingqiqo;
  • ukwakhiwa endaweni yelifa;
  • data-centric bokwakha.

I-ECS iphawulwa ngamabinzana amathathu asisiseko:

  • amaqumrhu - uhlobo lwento leyo isazisi sibhekisa kuyo (inokuba ngumdlali, ibhola, okanye enye into);
  • amacandelo - amaqumrhu enziwe ngawo. Umzekelo - icandelo lonikezelo, iindawo kunye nabanye. Ezi ziindawo zokugcina iinkcukacha;
  • iinkqubo - zisebenzisa zombini izinto kunye namalungu, kunye ziqulathe ukuziphatha kunye nengqiqo esekelwe kule datha. Umzekelo yinkqubo yonikezelo ephinda-phinda kuwo onke amaqumrhu anamacandelo onikezelo kwaye yenza unikezelo.

Emva kokuyifunda, kwacaca ukuba i-ECS isombulula ezi ngxaki zilandelayo:

  • ukusebenzisa uyilo endaweni yelifa ukuququzelela amaqumrhu ngokwenkqubo;
  • ukususa ikhowudi ye-jumble ngokusebenzisa iinkqubo zokulawula;
  • usebenzisa iindlela ezifana ne-is_build_mode ukugcina ingqiqo ye-wireframe kwindawo enye - kwindlela yonikezelo.

Oku kwenzeka emva kokuphunyezwa kwe-ECS.

izixhobo -> kulapho zonke ii-asethi zikhoyo (imifanekiso)
src
- amacandelo
—isikhundla.rs
- umntu.rs
- tennis_court.rs
- umgangatho.rs
- wireframe.rs
— mouse_tracked.rs
- izixhobo
— impuku.rs
- iinkqubo
- unikezelo.rs
- constants.rs
- utils.rs
- world_factory.rs -> imisebenzi yefektri yehlabathi
— main.rs -> main loop

Sabela abantu ezinkundleni

I-ECS yenze ubomi balula. Ngoku bendinendlela ecwangcisiweyo yokongeza idatha kumaqumrhu kwaye ndongeze ingqiqo esekelwe kuloo datha. Kwaye oku, kwenza ukuba kube nokwenzeka ukulungelelanisa ukusasazwa kwabantu ezinkundleni.

Ndenze ntoni:

  • iinkcukacha ezongeziweyo malunga neenkundla ezabelwe uMntu;
  • idatha eyongeziweyo malunga nabantu abasasazwayo kwi-TennisCourt;
  • i-CourtChoosingSystem eyongeziweyo, ekuvumela ukuba uhlalutye abantu kunye neenkundla, ukhangele iinkundla ezikhoyo kwaye usasaze abadlali kubo;
  • added a PersonMovementSystem, ejonga abantu ababelwe iinkundla, kwaye ukuba abekho, ithumela abantu apho kufuneka babe khona.

Ukudlala iRust kwiiyure ezingama-24: amava ophuhliso lomntu

Ukuqulunqa

Ndikonwabele kakhulu ukusebenza kulo mdlalo ulula. Ngaphezu koko, ndiyavuya kuba ndisebenzise uRust ukuyibhala, kuba:

  • Umhlwa ukunika into oyifunayo;
  • inoxwebhu olugqwesileyo, iRust intle kakhulu;
  • ukuhambelana kupholile;
  • akufuneki ubhenele kwi-cloning, ukukopa okanye ezinye izenzo ezifanayo, endihlala ndizenza kwi-C ++;
  • Iinketho zilula kakhulu ukusebenzisa kunye nokusingatha iimpazamo kakuhle kakhulu;
  • ukuba iprojekthi ikwazile ukuqulunqwa, ngoko ke i-99% yexesha isebenza, kwaye kanye njengoko kufanele. Ndicinga ukuba imiyalezo yemposiso yomqokeleli yeyona ilungileyo ndiyibonileyo.

Uphuhliso lomdlalo kwiRust luqala nje. Kodwa sele kukho uluntu oluzinzileyo nolukhulu olusebenza ukuvula iRust kuye wonke umntu. Ke ngoko, ndijonge ikamva lolwimi ngethemba, ndijonge phambili kwiziphumo zomsebenzi wethu oqhelekileyo.

I-Skillbox iyacebisa:

umthombo: www.habr.com

Yongeza izimvo