Igranje Rust v 24 urah: izkušnja osebnega razvoja

Igranje Rust v 24 urah: izkušnja osebnega razvoja

V tem članku bom govoril o svoji osebni izkušnji z razvojem majhne igre v Rustu. Izdelava delujoče različice je trajala približno 24 ur (večinoma sem delal zvečer ali ob vikendih). Igra še zdaleč ni končana, a mislim, da bo izkušnja koristna. Delil bom, kar sem se naučil, in nekaj opažanj, ki sem jih naredil med gradnjo igre iz nič.

Skillbox priporoča: Dvoletni praktični tečaj "Sem PRO spletni razvijalec".

Spomnimo: za vse bralce "Habr" - popust v višini 10 rubljev ob vpisu v kateri koli tečaj Skillbox s promocijsko kodo "Habr".

Zakaj Rust?

Ta jezik sem izbral, ker sem o njem slišal veliko dobrega in vidim, da postaja vedno bolj priljubljen pri razvoju iger. Pred pisanjem igre sem imel malo izkušenj z razvojem preprostih aplikacij v Rustu. To je bilo ravno dovolj, da sem imel občutek svobode med pisanjem igre.

Zakaj igra in kakšna igra?

Ustvarjanje iger je zabavno! Želel bi si, da bi bilo razlogov več, a za »domače« projekte izbiram teme, ki niso preveč povezane z mojim rednim delom. katera igra je to? Želel sem narediti nekaj podobnega teniškemu simulatorju, ki združuje Cities Skylines, Zoo Tycoon, Prison Architect in sam tenis. Na splošno se je izkazalo, da gre za igro o teniški akademiji, kamor ljudje pridejo igrat.

Tehnično usposabljanje

Želel sem uporabiti Rust, vendar nisem natančno vedel, koliko dela bi bilo potrebno za začetek. Nisem želel pisati senčil pikslov in uporabljati povleci in spusti, zato sem iskal najbolj prilagodljive rešitve.

Našel sem koristne vire, ki jih delim z vami:

Raziskal sem več motorjev iger Rust in na koncu izbral Piston in ggez. Nanje sem naletel med delom na prejšnjem projektu. Na koncu sem izbral ggez, ker se mi je zdel bolj primeren za izvedbo majhne 2D igre. Modularna struktura Pistona je preveč zapletena za razvijalca začetnika (ali nekoga, ki prvič dela z Rustom).

Struktura igre

Nekaj ​​časa sem razmišljal o arhitekturi projekta. Prvi korak je narediti "zemljo", ljudi in teniška igrišča. Ljudje se morajo premikati po sodiščih in čakati. Igralci morajo imeti veščine, ki se sčasoma izboljšajo. Poleg tega bi moral obstajati urejevalnik, ki vam omogoča dodajanje novih ljudi in sodišč, vendar to ni več brezplačno.

Ko sem vse dobro premislil, sem se lotil dela.

Ustvarjanje igre

Začetek: Krogi in abstrakcije

Vzel sem primer iz ggez in dobil krog na ekranu. Čudovito! Zdaj pa nekaj abstrakcij. Mislil sem, da bi bilo lepo, če bi se abstrahirali od ideje predmeta igre. Vsak predmet je treba upodobiti in posodobiti, kot je navedeno tukaj:

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

Ta del kode mi je dal lep seznam objektov, ki bi jih lahko posodobil in upodobil v enako lepi zanki.

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 je nujen, ker vsebuje vse vrstice kode. Nekaj ​​časa sem porabil za ločevanje datotek in optimizacijo strukture imenika. Takole je izgledalo potem:
viri -> tukaj so vsa sredstva (slike)
src
- entitete
— game_object.rs
— krog.rs
— main.rs -> glavna zanka

Ljudje, tla in slike

Naslednji korak je ustvariti predmet igre Person in naložiti slike. Vse naj bo zgrajeno na osnovi ploščic 32*32.

Igranje Rust v 24 urah: izkušnja osebnega razvoja

Teniška igrišča

Po študiju, kako izgledajo teniška igrišča, sem se odločil, da jih naredim iz ploščic 4*2. Sprva je bilo mogoče narediti sliko te velikosti ali sestaviti 8 ločenih ploščic. Potem pa sem spoznal, da sta potrebni samo dve unikatni ploščici, in tukaj je razlog.

Skupaj imamo dve takšni ploščici: 1 in 2.

Vsak del igrišča je sestavljen iz ploščice 1 ali ploščice 2. Lahko ju postavite kot običajno ali obrnete za 180 stopinj.

Igranje Rust v 24 urah: izkušnja osebnega razvoja

Osnovni način gradnje (montaže).

Ko mi je uspelo doseči upodabljanje mest, ljudi in zemljevidov, sem ugotovil, da je potreben tudi osnovni način sestavljanja. Jaz sem to implementiral takole: ob pritisku na gumb je predmet izbran, klik pa ga postavi na želeno mesto. Torej, gumb 1 vam omogoča izbiro igrišča, gumb 2 pa vam omogoča izbiro igralca.

Vendar si moramo še vedno zapomniti, kaj pomenita 1 in 2, zato sem dodal žični okvir, da bo jasno, kateri predmet je bil izbran. Takole izgleda.

Igranje Rust v 24 urah: izkušnja osebnega razvoja

Vprašanja o arhitekturi in refaktoriranju

Zdaj imam več predmetov za igro: ljudi, igrišča in tla. Toda da bi žični okviri delovali, je treba vsaki entiteti predmeta povedati, ali so sami predmeti v predstavitvenem načinu ali pa je okvir preprosto narisan. To ni zelo priročno.

Zdelo se mi je, da je treba arhitekturo premisliti na način, ki bo razkril nekatere omejitve:

  • Imeti entiteto, ki se upodablja in posodablja sama, je težava, ker ta entiteta ne bo mogla "vedeti", kaj naj upodablja - sliko in žični okvir;
  • pomanjkanje orodja za izmenjavo lastnosti in obnašanja med posameznimi entitetami (na primer lastnost is_build_mode ali upodabljanje obnašanja). Mogoče bi bilo uporabiti dedovanje, čeprav ni ustreznega načina za njegovo implementacijo v Rust. Kar sem res potreboval, je bila postavitev;
  • za dodelitev ljudi na sodišča je bilo potrebno orodje za interakcijo med subjekti;
  • same entitete so bile mešanica podatkov in logike, ki je hitro ušla izpod nadzora.

Še malo sem raziskoval in odkril arhitekturo ECS - sistem komponent entitet, ki se pogosto uporablja v igrah. Tukaj so prednosti ECS:

  • podatki so ločeni od logike;
  • sestava namesto dedovanja;
  • podatkovno osredotočena arhitektura.

Za ECS so značilni trije osnovni pojmi:

  • entitete - vrsta predmeta, na katerega se identifikator nanaša (lahko je igralec, žoga ali kaj drugega);
  • komponente – entitete so sestavljene iz njih. Primer – komponenta upodabljanja, lokacije in drugo. To so podatkovna skladišča;
  • sistemi - uporabljajo objekte in komponente ter vsebujejo vedenje in logiko, ki temeljita na teh podatkih. Primer je sistem upodabljanja, ki ponavlja vse entitete s komponentami upodabljanja in izvaja upodabljanje.

Po študiju je postalo jasno, da ECS rešuje naslednje težave:

  • uporaba postavitve namesto dedovanja za sistemsko organiziranje entitet;
  • znebiti se zmešnjave kode prek nadzornih sistemov;
  • z uporabo metod, kot je is_build_mode, da ohranimo logiko žične konstrukcije na istem mestu – v sistemu upodabljanja.

To se je zgodilo po uvedbi ECS.

viri -> tukaj so vsa sredstva (slike)
src
- komponente
— položaj.rs
— oseba.rs
— tennis_court.rs
— nadstropje.rs
- wireframe.rs
— mouse_tracked.rs
- sredstva
—miška.rs
- sistemi
— rendering.rs
— konstante.rs
— utils.rs
— world_factory.rs -> funkcije svetovne tovarne
— main.rs -> glavna zanka

Ljudi razporejamo na sodišča

ECS je olajšal življenje. Zdaj sem imel sistematičen način za dodajanje podatkov entitetam in dodajanje logike na podlagi teh podatkov. In to je posledično omogočilo organizirano razporeditev ljudi po sodiščih.

Kaj sem naredil:

  • dodani podatki o dodeljenih sodiščih Osebi;
  • dodani podatki o razporejenih ljudeh na TennisCourt;
  • dodan CourtChoosingSystem, ki vam omogoča analizo ljudi in igrišč, zaznavanje razpoložljivih igrišč in razporeditev igralcev nanje;
  • dodal PersonMovementSystem, ki išče osebe, ki so dodeljene sodišči, in če jih ni, jih pošlje, kamor morajo biti.

Igranje Rust v 24 urah: izkušnja osebnega razvoja

Seštejemo

Zelo sem užival pri delu na tej preprosti igri. Poleg tega sem vesel, da sem za pisanje uporabil Rust, ker:

  • Rust vam da tisto, kar potrebujete;
  • ima odlično dokumentacijo, Rust je precej eleganten;
  • konsistenca je hladna;
  • ni vam treba zatekati k kloniranju, kopiranju ali drugim podobnim dejanjem, kar sem pogosto počel v C++;
  • Možnosti so zelo enostavne za uporabo in zelo dobro obravnavajo napake;
  • če je bilo projekt mogoče prevesti, potem 99% časa deluje in točno tako, kot bi moral. Mislim, da so sporočila o napakah prevajalnika najboljša, kar sem jih videl.

Razvoj iger v Rustu se šele začenja. Toda že obstaja stabilna in precej velika skupnost, ki si prizadeva za odprtje Rusta za vse. Zato z optimizmom zrem v prihodnost jezika in se veselim rezultatov našega skupnega dela.

Skillbox priporoča:

Vir: www.habr.com

Dodaj komentar