Spēlējot Rust 24 stundu laikā: personīgās attīstības pieredze

Spēlējot Rust 24 stundu laikā: personīgās attīstības pieredze

Å ajā rakstā es runāŔu par savu personÄ«go pieredzi, izstrādājot nelielu spēli Rust. Darba versijas izveide aizņēma aptuveni 24 stundas (pārsvarā strādāju vakaros vai brÄ«vdienās). Spēle ne tuvu nav pabeigta, taču domāju, ka pieredze bÅ«s atalgojoÅ”a. PadalÄ«Å”os ar to, ko uzzināju un dažiem novērojumiem, ko izdarÄ«ju, veidojot spēli no nulles.

Skillbox iesaka: Divu gadu praktiskais kurss "Es esmu PRO tīmekļa izstrādātājs".

Atgādinām: visiem "Habr" lasītājiem - atlaide 10 000 rubļu, reģistrējoties jebkurā Skillbox kursā, izmantojot "Habr" reklāmas kodu.

Kāpēc Rust?

Izvēlējos Å”o valodu, jo esmu par to dzirdējis daudz laba un redzu, ka tā kļūst arvien populārāka spēļu izstrādē. Pirms spēles rakstÄ«Å”anas man bija maz pieredzes vienkārÅ”u lietojumprogrammu izstrādē Rust. Tas bija tikai pietiekami, lai man radÄ«tu brÄ«vÄ«bas sajÅ«tu, rakstot spēli.

Kāpēc spēle un kāda veida spēle?

Spēļu veidoÅ”ana ir jautra! Gribētos, lai bÅ«tu vairāk iemeslu, bet ā€œmājasā€ projektiem izvēlos tēmas, kas nav pārāk cieÅ”i saistÄ«tas ar manu parasto darbu. Kas Ŕī ir par spēli? Es gribēju izveidot kaut ko lÄ«dzÄ«gu tenisa simulatoram, kas apvieno Cities Skylines, Zoo Tycoon, Prison Architect un paÅ”u tenisu. Kopumā tā izvērtās spēle par tenisa akadēmiju, kur cilvēki nāk spēlēt.

Tehniskā apmācība

Es gribēju izmantot Rust, bet es precÄ«zi nezināju, cik daudz pamata bÅ«s nepiecieÅ”ams, lai sāktu. Es negribēju rakstÄ«t pikseļu ēnotājus un izmantot drag-n-drop, tāpēc meklēju elastÄ«gākos risinājumus.

Es atradu noderīgus resursus, ar kuriem dalos ar jums:

Es izpētÄ«ju vairākus Rust spēļu dzinējus, galu galā izvēloties Piston un ggez. Ar tiem saskāros, strādājot pie iepriekŔējā projekta. Beigās izvēlējos ggez, jo tas Ŕķita piemērotāks nelielas 2D spēles Ä«stenoÅ”anai. Virzuļa moduļu struktÅ«ra ir pārāk sarežģīta iesācēju izstrādātājam (vai kādam, kurÅ” pirmo reizi strādā ar Rust).

Spēles struktūra

Es pavadīju kādu laiku, domājot par projekta arhitektūru. Pirmais solis ir izveidot "zemi", cilvēkus un tenisa kortus. Cilvēkiem jāpārvietojas pa tiesām un jāgaida. Spēlētājiem jābūt prasmēm, kas laika gaitā uzlabojas. Turklāt vajadzētu būt redaktoram, kas ļauj pievienot jaunus cilvēkus un tiesas, taču tas vairs nav bezmaksas.

Pārdomājis visu, ķēros pie darba.

Spēles izveide

Sākums: apļi un abstrakcijas

Es paņēmu piemēru no ggez un ekrānā ieguvu apli. BrÄ«niŔķīgi! Tagad dažas abstrakcijas. Es domāju, ka bÅ«tu jauki abstrahēties no idejas par spēles objektu. Katrs objekts ir jāatveido un jāatjaunina, kā norādÄ«ts Å”eit:

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

Šis koda fragments man sniedza jauku objektu sarakstu, kurus es varētu atjaunināt un atveidot tikpat jaukā cilpā.

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 ir nepiecieÅ”ams, jo tajā ir visas koda rindas. Es pavadÄ«ju nedaudz laika, atdalot failus un optimizējot direktoriju struktÅ«ru. Pēc tam tas izskatÄ«jās Ŕādi:
resursi -> Å”eit atrodas visi lÄ«dzekļi (attēli)
src
- vienības
ā€” game_object.rs
ā€” aplis.rs
ā€” main.rs -> galvenā cilpa

Cilvēki, stāvi un attēli

Nākamais solis ir izveidot Personas spēles objektu un ielādēt attēlus. Viss jābūvē uz 32*32 flīžu bāzes.

Spēlējot Rust 24 stundu laikā: personīgās attīstības pieredze

Tenisa korts

IzpētÄ«jis, kā izskatās tenisa korti, nolēmu tos izgatavot no 4*2 flÄ«zēm. Sākotnēji bija iespēja izgatavot Ŕāda izmēra attēlu, vai arÄ« salikt kopā 8 atseviŔķas flÄ«zes. Bet tad es sapratu, ka vajadzÄ«gas tikai divas unikālas flÄ«zes, un lÅ«k, kāpēc.

Kopumā mums ir divas Ŕādas flīzes: 1 un 2.

Katra laukuma sadaļa sastāv no 1. vai 2. flīzes. Tos var izklāt kā parasti vai apgriezt par 180 grādiem.

Spēlējot Rust 24 stundu laikā: personīgās attīstības pieredze

Pamata uzbūves (montāžas) režīms

Kad man izdevās panākt vietņu, cilvēku un karÅ”u renderÄ“Å”anu, es sapratu, ka ir nepiecieÅ”ams arÄ« pamata montāžas režīms. Es to Ä«stenoju Ŕādi: nospiežot pogu, objekts tiek atlasÄ«ts, un klikŔķis novieto to vajadzÄ«gajā vietā. Tātad, poga 1 ļauj izvēlēties laukumu, bet poga 2 ļauj izvēlēties spēlētāju.

Bet mums joprojām ir jāatceras, ko nozÄ«mē 1 un 2, tāpēc es pievienoju karkasu, lai bÅ«tu skaidrs, kurÅ” objekts ir atlasÄ«ts. Tas izskatās Ŕādi.

Spēlējot Rust 24 stundu laikā: personīgās attīstības pieredze

ArhitektÅ«ras un pārstrukturÄ“Å”anas jautājumi

Tagad man ir vairāki spēles objekti: cilvēki, laukumi un grÄ«das. Bet, lai stiepļu rāmji darbotos, katrai objekta entÄ«tijai ir jāpasaka, vai paÅ”i objekti atrodas demonstrācijas režīmā, vai arÄ« rāmis ir vienkārÅ”i uzzÄ«mēts. Tas nav Ä«paÅ”i ērti.

Man Ŕķita, ka arhitektūra ir jāpārdomā tā, lai atklātu dažus ierobežojumus:

  • EntÄ«tija, kas pati renderē un atjaunina, ir problēma, jo Ŕī entÄ«tija nevarēs ā€œzinātā€, kas tai ir jāatveido ā€“ attēlu un karkasu;
  • rÄ«ka trÅ«kums rekvizÄ«tu un uzvedÄ«bas apmaiņai starp atseviŔķām entÄ«tijām (piemēram, rekvizÄ«ts is_build_mode vai uzvedÄ«bas renderÄ“Å”ana). Varētu izmantot mantojumu, lai gan Rustā nav pareizi to ieviest. Tas, kas man patieŔām bija vajadzÄ«gs, bija izkārtojums;
  • bija nepiecieÅ”ams instruments mijiedarbÄ«bai starp struktÅ«rām, lai norÄ«kotu cilvēkus tiesās;
  • paÅ”as entÄ«tijas bija datu un loÄ£ikas sajaukums, kas ātri izkļuva no kontroles.

Es veicu vēl dažus pētÄ«jumus un atklāju arhitektÅ«ru ECS ā€” entÄ«tijas komponentu sistēma, ko parasti izmanto spēlēs. Å eit ir ECS priekÅ”rocÄ«bas:

  • dati ir atdalÄ«ti no loÄ£ikas;
  • sastāvs mantojuma vietā;
  • uz datiem orientēta arhitektÅ«ra.

ECS raksturo trīs pamatjēdzieni:

  • entÄ«tijas ā€” objekta veids, uz kuru attiecas identifikators (tas varētu bÅ«t spēlētājs, bumba vai kas cits);
  • sastāvdaļas ā€“ entÄ«tijas veido no tām. Piemērs - renderÄ“Å”anas komponents, atraÅ”anās vietas un citi. Tās ir datu noliktavas;
  • sistēmas - tās izmanto gan objektus, gan komponentus, kā arÄ« satur uzvedÄ«bu un loÄ£iku, kas ir balstÄ«ta uz Å”iem datiem. Piemērs ir renderÄ“Å”anas sistēma, kas atkārtojas caur visām entÄ«tijām ar renderÄ“Å”anas komponentiem un veic renderÄ“Å”anu.

Pēc tā izpētes kļuva skaidrs, ka ECS atrisina Ŕādas problēmas:

  • izkārtojuma izmantoÅ”ana mantojuma vietā, lai sistēmiski organizētu entÄ«tijas;
  • atbrÄ«voÅ”anās no kodu jucekļa, izmantojot kontroles sistēmas;
  • izmantojot tādas metodes kā is_build_mode, lai saglabātu karkasa loÄ£iku tajā paŔā vietā ā€” renderÄ“Å”anas sistēmā.

Tas notika pēc ECS ievieÅ”anas.

resursi -> Å”eit atrodas visi lÄ«dzekļi (attēli)
src
- sastāvdaļas
ā€”pozÄ«cija.rs
ā€” persona.rs
ā€” tennis_court.rs
ā€” stāvs.rs
- wireframe.rs
ā€” mouse_tracked.rs
- resursi
-mouse.rs
- sistēmas
ā€” rendering.rs
ā€” konstantes.rs
ā€” utils.rs
ā€” world_factory.rs -> pasaules rÅ«pnÄ«cas funkcijas
ā€” main.rs -> galvenā cilpa

Mēs norīkojam cilvēkus tiesām

ECS ir padarÄ«jusi dzÄ«vi vieglāku. Tagad man bija sistemātisks veids, kā pievienot datus entÄ«tijām un pievienot loÄ£iku, pamatojoties uz Å”iem datiem. Un tas savukārt ļāva organizēt cilvēku sadali pa tiesām.

Ko es esmu darījis:

  • pievienoti dati par Personai pieŔķirtajām tiesām;
  • pievienoti dati par izplatÄ«tajiem cilvēkiem TennisCourt;
  • pievienota CourtChoosingSystem, kas ļauj analizēt cilvēkus un laukumus, atklāt pieejamos laukumus un izplatÄ«t tiem spēlētājus;
  • pievienota PersonMovementSystem, kas meklē tiesām norÄ«kotos cilvēkus un ja viņu nav, tad sÅ«ta cilvēkus, kur vajag.

Spēlējot Rust 24 stundu laikā: personīgās attīstības pieredze

Apkopojot

Man ļoti patika strādāt pie Ŕīs vienkārŔās spēles. Turklāt es priecājos, ka rakstÄ«Å”anai izmantoju Rustu, jo:

  • RÅ«sa sniedz jums to, kas jums nepiecieÅ”ams;
  • tai ir lieliska dokumentācija, Rust ir diezgan elegants;
  • konsistence ir forÅ”a;
  • jums nav jāizmanto klonÄ“Å”ana, kopÄ“Å”ana vai citas lÄ«dzÄ«gas darbÄ«bas, ko es bieži darÄ«ju programmā C++;
  • Opcijas ir ļoti viegli lietojamas un ļoti labi tiek galā ar kļūdām;
  • ja projektu izdevās sastādÄ«t, tad 99% gadÄ«jumu tas strādā, un tieÅ”i tā, kā vajadzētu. Es domāju, ka kompilatora kļūdu ziņojumi ir vislabākie, ko esmu redzējis.

Spēles izstrāde Rustā tikai sākas. Bet jau ir stabila un diezgan liela kopiena, kas strādā, lai atvērtu Rust ikvienam. Tāpēc es ar optimismu raugos uz valodas nākotni, ar nepacietību gaidot mūsu kopīgā darba rezultātus.

Skillbox iesaka:

Avots: www.habr.com

Pievieno komentāru