MĂ€ng Rustis 24 tunni jooksul: isiklik arenduskogemus

MĂ€ng Rustis 24 tunni jooksul: isiklik arenduskogemus

Selles artiklis rÀÀgin ma oma isiklikust kogemusest vÀikese mÀngu arendamisel Rustis. Töötava versiooni loomine vÔttis aega umbes 24 tundi (peamiselt töötasin Ôhtuti vÔi nÀdalavahetustel). MÀng on endiselt kaugel valmimisest, kuid arvan, et kogemus tuleb kasuks. RÀÀgin, mida Ôppisin, ja mÔningatest tÀhelepanekutest, mis tegin mÀngu nullist ehitamise kÀigus.

Skillbox soovitab: Kaks aastat praktilist kursust „Mina – PRO veebiarendaja“.

Tuletame meelde: kĂ”igile «Habr» lugejatele – 10 000 rubla allahindlus igale Skillboxi kursusele, kasutades sooduskoodi «Habr».

Miks Rust?

Valisin selle keele, kuna olin sellest palju head kuulnud ja nĂ€en, et see muutub mĂ€ngude arenduse alal ĂŒha populaarsemaks. Enne mĂ€ngu kirjutamist oli mul natuke kogemust lihtsate rakenduste arendamisel Rustis. Seda oli just parajalt, et tunda teatud vabadust mĂ€ngu kirjutamisel.

Miks just mÀng ja mis mÀng?

MĂ€ngude loomine on lĂ”bus! Sooviksin, et pĂ”hjus oleks rohkem, kuid „kodu“ projektide jaoks valin teemasid, mis ei ole liiga tihedalt seotud minu tavalise tööga. Mis mĂ€ng see on? Soovisin teha midagi sarnast tennisemĂ€ngimise simulaatorile, kus on ĂŒhendatud Cities Skylines, Zoo Tycoon, Prison Architect ja tenis ise. LĂŒhidalt, tekkis tennisekadeemia mĂ€ng, kuhu inimesed tulevad mĂ€ngima.

Tehniline ettevalmistus

Soovisin kasutada Rusti, aga ei teadnud tĂ€pselt, kui palju tuleb alustada „nullist“. Ma ei tahtnud kirjutada pikselĆĄeedreid ja kasutada lohista-ja-droppa, seetĂ”ttu otsisin kĂ”ige paindlikumaid lahendusi.

Leidsin kasulikke ressursse, millega jagan teiega:

Uurisin mitmeid Rusti mÀngumootoreid, valides lÔpuks Piston ja ggez. Olen nende kahel varasemate projektide kÀigus kokku puutunud. Otsustasin ggez'i kasuks, kuna see tundus sobivam vÀikese 2D-mÀngu realiseerimiseks. Pistoni modulaarne struktuur on liiga keeruline algavale arendajale (vÔi kellelegi, kes töötab Rustiga esmakordselt).

MĂ€ngu struktuur

KĂ€isin veidi aega projekti arhitektuuri ĂŒle mĂ”tlema. Esimene samm on luua „maa“, inimesed ja tennisekorterid. Inimesed peavad liikuma korterite vahel ja ootama. MĂ€ngijatel peaks olema oskused, mis ajas paranevad. Lisaks peab olema redigeerija, mis vĂ”imaldab uusi inimesi ja kortereid lisada, kuid see ei ole enam tasuta.

PÀrast kÔike lÀbimÔtlemist asusin tööle.

MĂ€ngu loomine

Algus: ringid ja abstraktsioonid

VĂ”tsin eeskuju ggez'ist ja sain ringi ekraanile. Üllatav! NĂŒĂŒd mĂ”ned abstraktsioonid. Tundus, et oleks hea abstraktida mĂ€nguobjekti ideest. Iga objekt peab olema joonistatud 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 objektiloendi, mida ma saan uuendada ja joonistada sama hĂ€sti toimivas 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. Kulutasin natuke aega, et jagada failid ja optimeerida kaustastruktuuri. Nii see kÔik pÀrast seda vÀlja nÀeb:
resources -> siia kogunevad kÔik varad (pildid)
src
— entities
— game_object.rs
— circle.rs
— main.rs -> peatsĂŒkkel

Inimesed, platsid ja pildid

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

MĂ€ng Rustis 24 tunni jooksul: isiklik arenduskogemus

Tennis platsid

Uurides, millised tennisplatsid vÀlja nÀevad, otsustasin need valmistada 4*2 plaatidest. Alguses vÔis teha sellise suurusega pildi vÔi kokku panna 8 eraldi plaati. Kuid hiljem sain aru, et on vajalikud vaid kaks ainulaadset plaati ja siin on miks.

Kokku on meil kaks sellist plaati: 1 ja 2.

Iga platsiosa koosneb plaatidest 1 vÔi 2. Need vÔivad olla paigutatud tavaliselt vÔi pööratud 180 kraadi.

MĂ€ng Rustis 24 tunni jooksul: isiklik arenduskogemus

PĂ”hirakenduse (kokkupaneku) reĆŸiim

PĂ€rast seda, kui suudasin joonistada platsid, inimesed ja kaardid, mĂ”istsin, et on vajalik ka pĂ”hikokkupaneku reĆŸiim. Selle rakendasin jĂ€rgmiselt: kui nuppu vajutada - objekt valitakse ja klikk asetab selle soovitud kohta. Nii vĂ”imaldab nupp 1 valida plats, ja nupp 2 valida mĂ€ngija.

Kuid peame ka meeles pidama, mida 1 ja 2 tÀhendavad, seega lisasin wireframe'i, et oleks selge, 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 et wireframe'id töötaksid, tuleb iga objekti olemasolu kohta teada anda, kas objektid on demonstreerimisreĆŸiimis vĂ”i on lihtsalt raami joonistatud. See ei ole eriti mugav.

Mul tundus, et on vaja arhitektuuri ĂŒmber mĂ”elda, et tuvastada teatud piirangud:

  • olemasolu objekt, mis kuvab ja uuendab ennast, on probleem, kuna see objekt ei saa «teada», mida ta peaks renderdama — pilti ja wireframe'i;
  • puudub tööriist omaduste ja kĂ€itumise jagamiseks eraldi objektide vahel (nĂ€ide — omadus is_build_mode vĂ”i kĂ€itumise joonistamine). Saaks kasutada pĂ€randit, kuigi Rustis ei ole selle rakendamiseks normaalseid viise. Mis mul tĂ”eliselt vajalik oli — see oli kompositsioon;
  • tööriist objektidevaheliseks suhtlemiseks oli vajalik, et mÀÀrata inimesed vĂ€ljakutele;
  • iseendid olid andmete ja loogika segu, mis lĂ€ks vĂ€ga kiiresti kontrolli alt vĂ€lja.

Tegin lisauuringu ja avastasin arhitektuuri ECS — Entity Component System, mida kasutatakse tavaliselt mĂ€ngudes. Siin on ECS-i eelised:

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

ECS-il on kolm pÔhikontseptsiooni:

  • olendid — objekti tĂŒĂŒp, millele viitab identifikaator (see vĂ”ib olla mĂ€ngija, pall vĂ”i miski muu);
  • komponendid — neist koosnevad olendid. NĂ€ide — renderdamise, asukoha ja muud komponendid. Need on andmete hoidlad;
  • sĂŒsteemid — need kasutavad nii objekte kui ka komponente, pluss sisaldavad kĂ€itumist ja loogikat, mis pĂ”hineb nende andmete pĂ”hjal. NĂ€ide — renderdamise sĂŒsteem, mis lĂ€bib kĂ”ik olendid koos renderdamise komponentidega ja tegeleb renderdamisega.

PÀrast uurimist selgus, et ECS lahendab jÀrgmised probleemid:

  • kompositsiooni rakendamine pĂ€randi asemel objektide sĂŒsteemse korraldamise jaoks;
  • koodi segadusest vabanemine juhtimissĂŒsteemide abil;
  • meetodite kasutamine nagu is_build_mode, et hoida wireframe'i loogikat samas kohas — renderdamise sĂŒsteemis.

Nii nÀgi vÀlja 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
— ressursid
— mouse.rs
— sĂŒsteemid
— rendering.rs
— constants.rs
— utils.rs
— world_factory.rs -> maailmadehitusfunktsioonid
— main.rs -> peatsĂŒkkel

MÀÀrasime inimesed vÀljakutele

ECS tegi elu lihtsamaks. NĂŒĂŒd oli mul sĂŒsteemne viis andmete lisamiseks olenditesse ja nendele andmetele pĂ”hineva loogika lisamiseks. See vĂ”imaldas omakorda korraldada inimeste jaotust vĂ€ljakutele.

Mida ma tegin:

  • lisasin mÀÀratud vĂ€ljakute andmed Isikule;
  • lisasin jaotatud inimeste andmed Tenniservile;
  • lisasin CourtChoosingSystem, mis analĂŒĂŒsib inimesi ja vĂ€ljakuid, tuvastab saadavalolevad vĂ€ljakud ja jagab mĂ€ngijad nende vahel;
  • lisasin sĂŒsteemi PersonMovementSystem, mis otsib inimesi, kes on mÀÀratud vĂ€ljakutele, ning kui neid seal pole, suunab inimesi vajalikku kohta.

MĂ€ng Rustis 24 tunni jooksul: isiklik arenduskogemus

Teeme kokkuvÔtte

Mulle vÀga meeldis töötada selle lihtsa mÀngu kallal. Veelgi enam, olen rahul, et kasutasin selle kirjutamiseks Rusti, kuna:

  • Rust annab sulle selle, mida vajad;
  • tal on suurepĂ€rane dokumentatsioon, Rust on ÀÀrmiselt elegantne;
  • pĂŒsivus on Ă€ge;
  • ei ole vaja kasutada tĂŒkeldamist, kopeerimist vĂ”i muid sarnaseid tegevusi, mida ma sageli C++-s tegin;
  • Options on vĂ€ga mugavad, nad kĂ€sitlevad vigu suurepĂ€raselt;
  • kui projekt Ă”nnestub kompileerida, töötab see 99% ajast just nii, nagu peab. Compileri veateated on minu arvates parimad, mida olen nĂ€inud.

MĂ€ngude arendamine Rustis on hetkel alles algusjĂ€rgus. 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.

Skillbox soovitab:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster