Kusewera Rust m'maola 24: zochitika zachitukuko

Kusewera Rust m'maola 24: zochitika zachitukuko

M'nkhaniyi ndilankhula za zomwe ndakumana nazo pakupanga masewera ang'onoang'ono ku Rust. Zinatenga pafupifupi maola 24 kupanga mtundu wogwirira ntchito (nthawi zambiri ndimagwira ntchito madzulo kapena Loweruka ndi Lamlungu). Masewerawa ali kutali kwambiri, koma ndikuganiza kuti zochitikazo zidzakhala zopindulitsa. Ndigawana zomwe ndaphunzira komanso zomwe ndidawona popanga masewerawa kuyambira pachiyambi.

Skillbox imalimbikitsa: Zaka ziwiri zothandiza maphunziro "Ndine wopanga mawebusayiti a PRO".

Tikukukumbutsani: kwa owerenga onse a Habr - kuchotsera ma ruble 10 polembetsa maphunziro aliwonse a Skillbox pogwiritsa ntchito nambala yotsatsira ya Habr.

N'chifukwa Chiyani Dzimbiri?

Ndinasankha chinenerochi chifukwa ndamva zabwino zambiri za icho ndipo ndikuchiwona chikuchulukirachulukira pakukula kwamasewera. Ndisanalembe masewerawa, ndinalibe chidziwitso chochepa chopanga mapulogalamu osavuta ku Rust. Izi zinali zokwanira kuti ndikhale ndi ufulu womasuka ndikulemba masewerawo.

Chifukwa chiyani masewerawa ndi masewera otani?

Kupanga masewera ndikosangalatsa! Ndikukhumba pakanakhala zifukwa zambiri, koma pa ntchito za "kunyumba" ndimasankha mitu yomwe sikugwirizana kwambiri ndi ntchito yanga yokhazikika. Ndi game yanji imeneyi? Ndinkafuna kupanga chinachake chonga masewera a tennis omwe amaphatikiza Cities Skylines, Zoo Tycoon, Prison Architect ndi tennis yokha. Nthawi zambiri, adakhala masewera okhudza malo ophunzirira tennis komwe anthu amabwera kudzasewera.

Maphunziro aukadaulo

Ndinkafuna kugwiritsa ntchito Dzimbiri, koma sindinkadziwa kuti ndiyenera kuchita chiyani kuti ndiyambe. Sindinkafuna kulemba ma pixel shaders ndikugwiritsa ntchito drag-n-drop, kotero ndimayang'ana mayankho osinthika kwambiri.

Ndapeza zothandiza zomwe ndimagawana nanu:

Ndidasanthula injini zingapo zamasewera a Rust, ndikusankha Piston ndi ggez. Ndinawapeza ndikugwira ntchito yapitayi. Pamapeto pake, ndidasankha ggez chifukwa idawoneka yoyenera kukhazikitsa masewera ang'onoang'ono a 2D. Mapangidwe a Piston ndi ovuta kwambiri kwa wopanga novice (kapena wina yemwe akugwira ntchito ndi Rust kwa nthawi yoyamba).

Kapangidwe ka masewera

Ndinakhala kanthawi ndikuganiza za kamangidwe ka polojekitiyi. Gawo loyamba ndikupanga "dziko", anthu ndi makhothi a tennis. Anthu amayenera kuyendayenda m'makhoti ndikudikirira. Osewera ayenera kukhala ndi luso lomwe limakula pakapita nthawi. Kuphatikiza apo, payenera kukhala mkonzi yemwe amakulolani kuti muwonjezere anthu atsopano ndi makhothi, koma izi sizilinso zaulere.

Nditaganizira zonse, ndinayamba kugwira ntchito.

Kupanga masewera

Chiyambi: Zozungulira ndi Zosakaniza

Ndinatenga chitsanzo kuchokera ku ggez ndikupeza bwalo pazenera. Zodabwitsa! Tsopano ena abstractions. Ndidaganiza kuti zingakhale bwino kusiya lingaliro lachinthu chamasewera. Chinthu chilichonse chiyenera kuperekedwa ndi kusinthidwa monga momwe tafotokozera apa:

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

Kachidutswa ka code kameneka kandipatsa mndandanda wabwino wazinthu zomwe ndimatha kuzisintha ndikuzipereka mwanjira yabwino.

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 ndiyofunikira chifukwa ili ndi mizere yonse yamakhodi. Ndidakhala kwakanthawi pang'ono kulekanitsa mafayilo ndikuwongolera mawonekedwe ake. Izi ndi zomwe zidawoneka pambuyo pake:
zothandizira -> apa ndi pomwe zinthu zonse zili (zithunzi)
src
- mabungwe
- game_object.rs
- kuzungulira.rs
- main.rs -> lupu lalikulu

Anthu, pansi ndi zithunzi

Chotsatira ndikupanga chinthu chamasewera a Munthu ndikunyamula zithunzi. Chilichonse chiyenera kumangidwa pamaziko a 32 * 32 matailosi.

Kusewera Rust m'maola 24: zochitika zachitukuko

Makhothi a tennis

Nditaphunzira momwe makhothi a tennis amawonekera, ndidaganiza zowapanga kuchokera ku matailosi 4 * 2. Poyamba, zinali zotheka kupanga chithunzi cha kukula uku, kapena kuyika pamodzi matailosi 8 osiyana. Koma kenako ndinazindikira kuti matailosi awiri okha apadera amafunikira, ndipo chifukwa chake.

Pazonse tili ndi matailosi awiri otere: 1 ndi 2.

Chigawo chilichonse cha khoti chimakhala ndi tile 1 kapena tile 2. Zitha kuikidwa ngati zachilendo kapena zopindika madigiri 180.

Kusewera Rust m'maola 24: zochitika zachitukuko

Basic zomangamanga (assembly) mode

Nditakwanitsa kumasulira malo, anthu ndi mamapu, ndinazindikira kuti pakufunikanso kusonkhana. Ndinakhazikitsa motere: batani likakanikiza, chinthucho chimasankhidwa, ndikudina ndikuchiyika pamalo omwe mukufuna. Chifukwa chake, batani 1 limakupatsani mwayi wosankha bwalo, ndipo batani 2 limakupatsani mwayi wosankha wosewera.

Koma tifunikabe kukumbukira zomwe 1 ndi 2 amatanthauza, kotero ndinawonjezera wireframe kuti ndimveke bwino chinthu chomwe chasankhidwa. Izi ndi momwe zimawonekera.

Kusewera Rust m'maola 24: zochitika zachitukuko

Zomangamanga ndi mafunso refactoring

Tsopano ndili ndi zinthu zingapo zamasewera: anthu, makhothi ndi pansi. Koma kuti ma wireframe agwire ntchito, chinthu chilichonse chimayenera kuuzidwa ngati zinthuzo zili munjira yowonetsera, kapena ngati chimango chimangojambula. Izi sizothandiza kwambiri.

Zinkawoneka kwa ine kuti zomangazo ziyenera kuganiziridwanso m'njira yomwe imasonyeza zofooka zina:

  • Kukhala ndi bungwe lomwe limadziwonetsera ndikudzisintha palokha ndi vuto chifukwa bungweli silingathe "kudziwa" zomwe likuyenera kupereka - chithunzi ndi mawaya;
  • kusowa kwa chida chosinthira zinthu ndi machitidwe pakati pa mabungwe omwe ali pawokha (mwachitsanzo, is_build_mode katundu kapena kuwonetsa khalidwe). Zingakhale zotheka kugwiritsa ntchito cholowa, ngakhale kuti palibe njira yoyenera yogwiritsira ntchito Rust. Chimene ndinkafunikira kwenikweni chinali masanjidwe;
  • chida cholumikizirana pakati pa mabungwe chidafunikira kuti anthu aperekedwe ku makhothi;
  • mabungwe omwewo anali osakanikirana a data ndi malingaliro omwe adatuluka mwachangu.

Ndinafufuzanso zambiri ndikupeza kamangidwe kake ECS - Entity Component System, yomwe imagwiritsidwa ntchito kwambiri pamasewera. Nawa maubwino a ECS:

  • deta imasiyanitsidwa ndi malingaliro;
  • kupanga m'malo mwa cholowa;
  • data-centric zomangamanga.

ECS imadziwika ndi mfundo zitatu zofunika:

  • mabungwe - mtundu wa chinthu chomwe chizindikiritso chimatanthawuza (chikhoza kukhala wosewera mpira, mpira, kapena china chake);
  • zigawo - mabungwe amapangidwa ndi iwo. Chitsanzo - popereka gawo, malo ndi zina. Awa ndi malo osungira deta;
  • machitidwe - amagwiritsa ntchito zinthu zonse ndi zigawo zake, kuphatikizanso amakhala ndi machitidwe ndi malingaliro otengera deta iyi. Chitsanzo ndi makina owonetsera omwe amabwereza mabizinesi onse okhala ndi zigawo zowonetsera ndikuchita zowonetsera.

Nditaphunzira, zinaonekeratu kuti ECS imathetsa mavuto otsatirawa:

  • kugwiritsa ntchito masanjidwe m'malo mwa cholowa kupanga mabungwe mwadongosolo;
  • kuchotsa ma code jumble kudzera mu machitidwe owongolera;
  • kugwiritsa ntchito njira ngati is_build_mode kusunga malingaliro a wireframe pamalo omwewo - munjira yoperekera.

Izi ndi zomwe zidachitika pambuyo pokhazikitsa ECS.

zothandizira -> apa ndi pomwe zinthu zonse zili (zithunzi)
src
- zigawo zikuluzikulu
-malo.rs
- munthu.rs
- tennis_court.rs
- pansi.rs
- wireframe.rs
- mouse_tracked.rs
- zothandizira
-mouse.rs
- machitidwe
- kupereka.rs
- zokhazikika.rs
- utils.rs
- world_factory.rs -> ntchito za fakitale yapadziko lonse lapansi
- main.rs -> lupu lalikulu

Timagawira anthu ku makhoti

ECS yapangitsa moyo kukhala wosavuta. Tsopano ndinali ndi njira yowonjezereka yowonjezerera deta ku mabungwe ndikuwonjezera malingaliro okhudzana ndi deta. Ndipo zimenezi zinapangitsa kuti pakhale zotheka kulinganiza kagaΕ΅idwe ka anthu m’makhoti.

Ndachita chiyani:

  • anawonjezera zambiri za makhothi omwe aperekedwa kwa Munthu;
  • adawonjezera zambiri za anthu omwe adagawidwa ku TennisCourt;
  • adawonjezera CourtChoosingSystem, yomwe imakupatsani mwayi wosanthula anthu ndi makhothi, kuzindikira makhothi omwe alipo ndikugawa osewera kwa iwo;
  • adawonjezera PersonMovementSystem, yomwe imayang'ana anthu omwe amaperekedwa ku makhothi, ndipo ngati palibe, imatumiza anthu kumene akuyenera kukhala.

Kusewera Rust m'maola 24: zochitika zachitukuko

Kuphatikizidwa

Ndinkasangalala kwambiri kugwira ntchito pamasewera osavuta awa. Komanso, ndine wokondwa kuti ndinagwiritsa ntchito Rust kulemba, chifukwa:

  • Dzimbiri limakupatsani zomwe mukusowa;
  • ili ndi zolemba zabwino kwambiri, Dzimbiri ndi zokongola kwambiri;
  • kusasinthasintha ndi kozizira;
  • simukuyenera kutembenukira ku cloning, kukopera kapena zina zofananira, zomwe ndimachita nthawi zambiri mu C ++;
  • Zosankha ndizosavuta kugwiritsa ntchito ndikuwongolera zolakwika bwino;
  • ngati polojekitiyo inatha kupangidwa, ndiye kuti 99% ya nthawi yomwe ikugwira ntchito, komanso momwe iyenera kukhalira. Ndikuganiza kuti mauthenga olakwika a compiler ndi abwino kwambiri omwe ndawonapo.

Kukula kwamasewera ku Rust kukungoyamba kumene. Koma pali kale gulu lokhazikika komanso lalikulu lomwe likugwira ntchito yotsegula Dzimbiri kwa aliyense. Choncho, ndimayang'ana tsogolo la chinenerocho ndi chiyembekezo, ndikuyembekezera zotsatira za ntchito yathu wamba.

Skillbox imalimbikitsa:

Source: www.habr.com

Kuwonjezera ndemanga