
V tem članku bom delila osebne izkušnje pri razvoju male igre v Rustu. Ustvarjanje delujoče različice je trajalo približno 24 ur (predvsem sem delala zvečer ali ob koncih tedna). Igra je še daleč od konca, a verjamem, da bo izkušnja koristna. Povedala bom, česa sem se naučila, in o nekaterih opažanjih, ki sem jih imela pri gradnji igre od začetka.
Skillbox priporoča: Двухлетний практический курс .
Opominjamo: za vse bralce »Habra« — popust 10 000 rubljev ob vpisu na kateri koli tečaj Skillbox s promo kodo »Habr«.
Zakaj Rust?
Izbrala sem ta jezik, ker sem slišala veliko dobrih stvari o njem in vidim, da postaja vse bolj priljubljen na področju razvoja iger. Pred pisanjem igre sem imela nekaj izkušenj z razvojem preprostih aplikacij v Rustu. To je bilo ravno dovolj, da sem začutila določen občutek svobode pri pisanju igre.
Zakaj prav igra in kakšna igra?
Ustvarjanje iger je zabavno! Rada bi, da bi bilo razlogov več, a za »domače« projekte izbiram teme, ki niso preveč tesno povezane z mojo običajno delo. Kakšna igra? Želela sem narediti nekaj takega kot teniški simulator, kjer se združijo Cities Skylines, Zoo Tycoon, Prison Architect in seveda tenis. Na koncu je nastala igra o teniški akademiji, kjer ljudje prihajajo igrati.
Tehnična priprava
Želela sem uporabiti Rust, a natančno nisem vedela, koliko raziskovanja bo potrebno. Nisem hotela pisati pikselnih shaderjev in uporabljati drsanja in pada, zato sem iskala najbolj fleksibilne rešitve.
Našla sem koristne vire, ki jih delim z vami:
- — seznam potrebnih elementov za razvoj iger v Rustu;
Preučila sem nekaj Rust iger motorjev, na koncu pa izbrala Piston in ggez. S temi sem se srečevala pri delu na prejšnjem projektu. Na koncu sem se odločila za ggez, saj se mi je zdel bolj primeren za realizacijo majhne 2D igre. Modularna struktura Piston je preveč zapletena za začetnika (ali nekoga, ki prvič dela z Rustom).
Struktura igre
Porabila sem nekaj časa za razmišljanje o arhitekturi projekta. Prvi korak je ustvariti 'zemljo', ljudi in teniške igrišča. Ljudje se morajo gibati po igriščih in čakati. Igralci morajo imeti sposobnosti, ki se s časom izboljšujejo. Poleg tega mora biti na voljo urejevalnik, ki omogoča dodajanje novih ljudi in igrišč, a to ni zastonj.
Ko sem premislila vse, sem se lotila dela.
Ustvarjanje igre
Začetek: krogi in abstractions
Vzela sem primer iz ggez in dobila krog na ekranu. Neverjetno! Zdaj malo abstrakcij. Zdi se mi, da je dobro abstrahirati od ideje igralnega objekta. Vsak objekt mora biti upodobljen in posodobljen, 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 omogočil, da sem dobila odličen seznam objektov, ki jih lahko posodobim in upodobim v vsaj enako odličnem ciklu.
mpl event::EventHandler for MainState {
fn update(&mut self, context: &mut Context) -> GameResult {
// Posodobite vse objekte
for object in self.objects.iter_mut() {
object.update(context)?;
}
Ok(())
}
fn draw(&mut self, context: &mut Context) -> GameResult {
graphics::clear(context);
// Narišite vse objekte
for object in self.objects.iter_mut() {
object.draw(context)?;
}
graphics::present(context);
Ok(())
}
} main.rs je potreben, ker vsebuje vse vrstice kode. Porabila sem malo časa, da sem razdelila datoteke in optimizirala strukturo imenika. Tako je zdaj vse videti:
resources -> tukaj so vsi viri (slike)
src
— entitete
— game_object.rs
— circle.rs
— main.rs -> glavna zanka
Ljudje, igrišča in slike
Naslednji korak je ustvarjanje igralnega objekta Oseba in nalaganje slik. Vse mora biti zgrajeno na osnovi ploščic velikosti 32*32.

Tenis igrišča
Po preučevanju, kako izgledajo tenis igrišča, sem se odločila, da jih naredim iz ploščic 4*2. Sprva je bilo mogoče narediti sliko te velikosti ali pa sestaviti skupaj 8 ločenih ploščic. A kmalu sem spoznala, da potrebujem le dve edinstveni ploščici, in to je razlog.
Skupaj imamo dve taki ploščici: 1 in 2.
Vsak del igrišča je sestavljen iz ploščice 1 ali ploščice 2. Lahko so postavljene običajno ali pa obrnjene za 180 stopinj.

Glavni način gradnje (sestavljanja)
Potem ko sem dosegla upodabljanje igrišč, ljudi in zemljevidov, sem spoznala, da potrebujem tudi osnovni način sestavljanja. Uresničila sem ga tako: ko je gumb pritisnjen - objekt je izbran, klikanje pa ga postavi na pravo mesto. Tako gumb 1 omogoča izbiro igrišča, gumb 2 pa izbiro igralca.
Toda potrebno je tudi zapomniti, kaj pomenita 1 in 2, zato sem dodala žičnato mrežo, da bi bilo jasno, kateri objekt je izbran. Tako to izgleda.

Vprašanja o arhitekturi in refaktoringu
Zdaj imam nekaj igralnih objektov: ljudje, igrišča in nadstropja. Da bi delovali prototipi, je treba vsakemu objektu sporočiti, ali so ti objekti v načinu prikazovanja ali pa gre le za narisano ovrednotenje. To ni prav priročno.
Zdel se mi je, da je treba ponovno premisliti arhitekturo, da se razkrijejo določene omejitve:
- prisotnost entitete, ki se sama prikazuje in posodablja, je težava, saj ta entiteta ne more 'vedeti', kaj mora renderirati – sliko ali prototip;
- pomanjkanje orodja za izmenjavo lastnosti in vedenja med posameznimi entitetami (primer – lastnost is_build_mode ali pa upodobitev vedenja). Uporaba dediščine bi bila mogoča, čeprav v Rustu ni normalnega načina za njeno implementacijo. Kar sem resnično potrebovala, je bila kompozicija;
- orodje za interakcijo med entitetami je bilo potrebno, da bi dodelili ljudi na igrišča;
- same entitete so predstavljale mešanico podatkov in logike, kar je hitro postalo neobvladljivo.
Opravila sem dodatno raziskovanje in odkrila arhitekturo , ki se običajno uporablja v igrah. Tukaj so prednosti ECS:
- podatki so ločeni od logike;
- kompozicija namesto dediščine;
- arhitektura, usmerjena v podatke.
Za ECS so značilni trije osnovni koncepti:
- entitete – tip objekta, na katerega se sklicuje identifikator (to je lahko igralec, žogica ali karkoli drugega);
- komponente – iz katerih so sestavljene entitete. Primer – komponenta za prikaz, lokacijo in druge. To so skladišča podatkov;
- sistem – uporablja tako objekte kot komponente, poleg tega vsebuje vedenje in logiko, ki temelji na teh podatkih. Primer – sistem prikazovanja, ki pregleduje vse entitete s komponentami za prikaz in se ukvarja s renderiranjem.
Po preučevanju je postalo jasno, da ECS rešuje naslednje probleme:
- uporaba kompozicije namesto dediščine za sistemsko organizacijo entitet;
- znebitev natrpanosti kode z uporabo sistemov za upravljanje;
- uporaba metod, kot je is_build_mode, da se logika prototipa shrani na enem mestu – v sistemu prikazovanja.
Tukaj je, kaj je nastalo po uvedbi ECS.
resources -> tukaj so vsi viri (slike)
src
– komponente
– position.rs
– person.rs
– tennis_court.rs
– floor.rs
– wireframe.rs
– mouse_tracked.rs
– viri
– mouse.rs
– sistemi
– rendering.rs
– constants.rs
— utils.rs
— world_factory.rs -> funkcije tovarne sveta
— main.rs -> glavna zanka
Dodeljujem ljude na terene
ECS je olakšao život. Sada sam imala sistemski put za dodavanje podataka entitetima i dodavanje logike zasnovane na tim podacima. To je, zauzvrat, omogućilo organizaciju raspodjele ljudi po terenima.
Šta sam uradila:
- dodala podatke o dodeljenim terenima u Osobu;
- dodala podatke o raspodeljenim ljudima u TeniskiTeren;
- dodala sistem OdabiraTerena, koji analizira ljude i terene, pronalazi dostupne terene i raspoređuje igrače na njih;
- dodala sistem KretanjaOsobu, koji traži ljude dodeljene terenima, i ako ih tamo nema, šalje ljude gde je potrebno.

Zaključno
Veoma mi se dopalo da radim na ovoj jednostavnoj igri. Štaviše, zadovoljna sam što sam je napisala u Rustu, jer:
- Rust vam daje ono što vam je potrebno;
- ima odličnu dokumentaciju, Rust je prilično elegantan;
- konstantnost je sjajna;
- ne moram pribegavati kloniranju, kopiranju ili sličnim radnjama, što sam često radila u C++;
- Options su veoma korisni za rad, takođe su odlično rukovodeći greškama;
- ako je projekat uspešno kompajliran, u 99% slučajeva radi onako kako treba. Poruke grešaka kompajlera su po mom mišljenju najbolje koje sam videla.
Razvoj igara u Rustu tek započinje. Ali već postoji stabilna i prilično velika zajednica koja radi na tome da otvori Rust za sve. Zato na budućnost jezika gledam optimistično, sa nestrpljenjem očekujući rezultate našeg zajedničkog rada.
Skillbox priporoča:
- Spletni tečaj .
- Praktični tečaj .
- Практический годовой курс .
Izvor: habr.com
