MĂ€ng Rustis 24 tunni jooksul: isiklik arenduskogemus

MĂ€ng Rustis 24 tunni jooksul: isiklik arenduskogemus

Selles artiklis jagan oma isiklikku kogemust vÀikese mÀngu arendamisel Rustis. Töötava versiooni loomiseks kulus umbes 24 tundi (peamiselt töötasin Ôhtuti vÔi nÀdalavahetustel). MÀng on veel kaugel valmimisest, kuid arvan, et see kogemus on kasulik. RÀÀgin, mida Ôppisin, ja mÔnest tÀhelepanekust, mida tegin mÀngu nullist ehitamisel.

Skillbox soovitab: Kaheaastane praktiline kursus „Mina olen PRO veebiarendaja“.

Tuletame meelde: kĂ”igile «Habra» lugejatele — 10 000 rubla soodustus, kui registreerite end Skillboxi mis tahes kursusele promokoodi «Habr» abil.

Miks Rust?

Valisin selle keele, kuna olin kuulnud sellest palju head ja nĂ€en, et see muutub mĂ€nguarenduse valdkonnas ĂŒha populaarsemaks. Enne mĂ€ngu kirjutamist oli mul vĂ€hene kogemus lihtsate rakenduste arendamisel Rustis. Seda oli just piisavalt, et tunda kindlat vabadust mĂ€ngu kirjutamisel.

Miks just mÀng ja milline mÀng?

MÀngude loomine on lÔbus! Sooviksin, et pÔhjus oleks rohkem, kuid koduste projektide puhul valin teeman, mis ei ole liiga closely seotud minu tavapÀrase tööga. Mis mÀng see on? Soovis teha midagi nagu tennis sims, kus segunevad Cities Skylines, Zoo Tycoon, Prison Architect ja tennis ise. KokkuvÔttes kujunes vÀlja mÀng tennisekadeemiast, kuhu inimesed tulevad mÀngima.

Tehniline ettevalmistus

Soovisin kasutada Rust'i, kuid ma ei teadnud tÀpselt, kui palju tuleb alustada nullist. Ma ei soovinud kirjutada pikslite varjutusi ja kasutada drag-n-drop'i, seega otsisin paindlikumaid lahendusi.

Leidsin kasulikke ressursse, mida jagan teiega:

Uurisin mitmeid mÀngumootoreid Rust'is, valides lÔpuks Piston ja ggez. Kohtusin nendega, töötades varasema projekti kallal. LÔpuks valisin ggez, kuna see tundus sobivam vÀikese 2D-mÀngu elluviimiseks. Piston'i modulaarne struktuur on algajale arendajale (vÔi sellele, kes esmakordselt Rust'iga töötab) liiga keeruline.

MĂ€ngu struktuur

Kulutasin veidi aega projekti arhitektuuri mĂ”tlemiseks. Esimene samm on luua „maa“, inimesed ja tennisevĂ€ljakud. Inimesed peavad vĂ€ljakutel liikuma ja ootama. MĂ€ngijatel peavad olema oskused, mis ajas arenevad. Lisaks peab olema redaktor, mis vĂ”imaldab lisada uusi inimesi ja vĂ€ljakuid, kuid see ei ole enam tasuta.

Kui kÔik lÀbi mÔeldud, asusin tööle.

MĂ€ngu loomine

Algus: ringid ja abstraktsioonid

VĂ”tsin eeskujuks ggez'i ja sain ringi ekraanile. Imeline! NĂŒĂŒd natuke abstraktsioone. Tundus, et oleks hea, kui abstrakteeruda mĂ€ngu objekti ideest. Iga objekt peab olema renderdatud ja uuendatud, nagu siin nĂ€idatud:

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

See koodilĂ”ik vĂ”imaldas mul saada suurepĂ€rase objekti nimekirja, mida saan uuendada ja renderdada vĂ€hemalt sama suurepĂ€rases tsĂŒklis.

mpl event::EventHandler for MainState {
    fn update(&mut self, context: &mut Context) -> GameResult {
        // Uuenda kÔik objektid
        for object in self.objects.iter_mut() {
            object.update(context)?;
        }
 
        Ok(())
    }
 
    fn draw(&mut self, context: &mut Context) -> GameResult {
        graphics::clear(context);
 
        // Joonista kÔik objektid
        for object in self.objects.iter_mut() {
            object.draw(context)?;
        }
 
        graphics::present(context);
 
        Ok(())
    }
}

main.rs on vajalik, kuna seal on kÔik koodiread. MÀletan, et kulutasin natuke aega failide jagamisele ja kaustastruktuuri optimeerimisele. Nii see kÔik pÀrast muutus:
resources -> siia kogunevad kÔik varad (pildid)
src
— entities
— game_object.rs
— circle.rs
— main.rs -> pĂ”hitsĂŒkkel

Inimesed, tasanded ja pildid

JÀrgmine etapp on mÀngu objekti Person loomine ja piltide laadimine. KÔik peab olema ehitatud 32*32 plaatide alusel.

MĂ€ng Rustis 24 tunni jooksul: isiklik arenduskogemus

TennisevÀljakud

Uurides, kuidas tennisevĂ€ljakud vĂ€lja nĂ€evad, otsustasin teha need 4*2 plaatidest. Alguses oleks vĂ”inud sellise suuruse jaoks teha kas ĂŒhe pildi vĂ”i kokku panna 8 eraldi plaati. Kuid hiljem sain aru, et on vajalikud vaid kaks ainulaadset plaati, ja siit tulenebki pĂ”hjus.

Kokku on meil ainult kaks sellist plaati: 1 ja 2.

Iga vÀljakusektsioon koosneb plaadist 1 vÔi plaadist 2. Need vÔivad paikneda nagu tavaliselt vÔi olla pööratud 180 kraadi.

MĂ€ng Rustis 24 tunni jooksul: isiklik arenduskogemus

Peamine ehitamisreĆŸiim (kokkupanek)

PĂ€rast seda, kui sain renderdamisega hakkama, mĂ€rkasin, et on vajalik ka pĂ”hikoosolekureĆŸiim. Selle lahendasin nii: kui nuppu vajutatakse — objekt on valitud ja klikk paigutab selle soovitud kohta. Nii annab nupp 1 vĂ”imaluse valida koht, samas kui nupp 2 vĂ”imaldab valida mĂ€ngijat.

Kuid peame veel meeles pidama, mida 1 ja 2 tÀhendavad, seetÔttu lisasin juhtplaani, et selge oleks, milline objekt on valitud. Nii see vÀlja nÀeb.

MĂ€ng Rustis 24 tunni jooksul: isiklik arenduskogemus

KĂŒsimused arhitektuuri ja refaktoreerimise kohta

NĂŒĂŒd on mul mitu mĂ€nguobjekti: inimesed, vĂ€ljakud ja korrused. Kuid selleks, et juhtplaanid töötaksid, peab iga objekti ĂŒhik olema kursis, kas objektid on esitluse reĆŸiimis vĂ”i on lihtsalt joonistatud raam. See ei ole kuigi mugav.

Mulle tundus, et arhitektuuri tuleks ĂŒmber mĂ”elda, et leida mĂ”ned piirangud:

  • ĂŒksuse olemasolu, mis kuvab ja uuendab ennast, on probleem, kuna see ĂŒhik ei suuda 'teada', mida ta peab renderdama — pilti ja juhtplaani;
  • puuduvad vahendid omaduste ja kĂ€itumise vahetamiseks ĂŒksikute objektide vahel (nĂ€ide — omadus is_build_mode vĂ”i kĂ€itumise joonistamine). Oleks vĂ”inud kasutada pĂ€randamist, kuigi Rustis pole selle rakendamiseks korralikku viisi. Mind tĂ”eliselt huvitas kompositsioon;
  • vahend objektide omavaheliseks suhtlemiseks oli vajalik, et mÀÀrata inimesi vĂ€ljakutele;
  • need objektid olid andmete ja loogika segu, mis kiiresti hukka lĂ€ks.

Tehnisin veel ja avastasin arhitehtuuri ECS — Entity Component System, mida kasutatakse sageli mĂ€ngudes. Siin on ECS eelised:

  • andmed on eraldatud loogikast;
  • kompositsioon pĂ€rimise asemel;
  • andmepĂ”hine arhitektuur.

ECS-i iseloomustavad kolm pÔhikontseptsiooni:

  • objektid — objekti tĂŒĂŒp, millele viitab identifikaator (see vĂ”ib olla mĂ€ngija, pall vĂ”i midagi muud);
  • komponendid — need moodustavad objektid. NĂ€ide — renderdamise komponent, asukoht ja teised. Need on andmete hoidlad;
  • sĂŒsteemid — nad kasutavad nii objekte kui komponente ning sisaldavad kĂ€itumist ja loogikat, mis pĂ”hinevad nende andmetel. NĂ€ide — renderdamisseade, mis lĂ€bib kĂ”ik olemused koos komponentidega renderdamiseks ja tegeleb joonistamisega.

Uurimise jÀrel selgus, et ECS lahendab jÀrgmised probleemid:

  • komponendi kasutamine asemel pĂ€rimise sĂŒsteemseks korraldamiseks;
  • koodi segadusest vabastamine sĂŒsteemide haldamise kaudu;
  • meetodite nagu is_build_mode kasutamine, et hoida traate loogikat samas kohas — renderdamisseadmes.

Siin on, mis sĂŒndis pĂ€rast ECS-i rakendamist.

resources -> siia kogunevad kÔik varad (pildid)
src
— komponendid
— position.rs
— person.rs
— tennis_court.rs
— floor.rs
— wireframe.rs
— mouse_tracked.rs
— resources
— mouse.rs
— sĂŒsteemid
— rendering.rs
— constants.rs
— utils.rs
— world_factory.rs -> maailmade tehasetooted
— main.rs -> pĂ”hitsĂŒkkel

MÀÀrame inimesed kohtadele

ECS on elu lihtsamaks teinud. NĂŒĂŒd oli mul sĂŒsteemne tee andmete lisamiseks olemustele ja nende andmete pĂ”hjal loogika lisamiseks. See, omakorda, vĂ”imaldas korraldada inimeste jaotamist kohtadele.

Mida ma tegin:

  • lisati Person-i mÀÀratud kohtade andmed;
  • lisati TennisCourt-i jaotatud inimeste andmed;
  • lisatud CourtChoosingSystem, mis vĂ”imaldab analĂŒĂŒsida inimesi ja platsse, avastada saadaolevaid vĂ€ljakuid ja jaotada mĂ€ngijaid neile;
  • lisatud PersonMovementSystem, mis otsib inimesi, kes on mÀÀratud vĂ€ljakutele, ja kui neid seal pole, suunab inimesi sinna, kus nad peavad olema.

MĂ€ng Rustis 24 tunni jooksul: isiklik arenduskogemus

Teeme kokkuvÔtteid

Mulle meeldis vÀga töötada selle lihtsa mÀnguga. Veelgi enam, olen rahul, et kasutasin selle kirjutamiseks Rust'i, kuna:

  • Rust annab teile kĂ”ik, mis vajalik;
  • sellel on suurepĂ€rane dokumentatsioon, Rust on vĂ€ga elegantne;
  • pĂŒsivus on suurepĂ€rane;
  • ei pea kasutama kloonimist, kopeerimist vĂ”i muid sarnaseid toiminguid, mida ma sageli tegin C++-s;
  • Options on vĂ€ga mugavad kasutada ja nad kĂ€sitlevad vigu suurepĂ€raselt;
  • kui projekt Ă”nnestub kompileerida, siis 99% tĂ”enĂ€osusega töötab see just nii, nagu peab. Arvutiviga teated on minu arvates parimad, mida ma olen nĂ€inud.

MĂ€ngude arendamine Rust'i keeles on alles alguses. Kuid juba on olemas stabiilne ja ĂŒsna suur kogukond, mis töötab selle nimel, et avada Rust kĂ”igile. SeetĂ”ttu vaatan keele tulevikku optimistlikult, oodates meie ĂŒhise töö tulemusi kannatamatult.

Skillbox soovitab:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster