Pagdula sa Rust sa 24 oras: personal nga kasinatian sa pag-uswag

Pagdula sa Rust sa 24 oras: personal nga kasinatian sa pag-uswag

Niini nga artikulo maghisgot ako bahin sa akong personal nga kasinatian sa pagpalambo sa usa ka gamay nga dula sa Rust. Nagkinahanglan kini og mga 24 ka oras aron makahimo og usa ka nagtrabaho nga bersyon (kasagaran ko nagtrabaho sa gabii o sa katapusan sa semana). Ang dula layo pa sa pagkahuman, apan sa akong hunahuna ang kasinatian mahimong magantihon. Akong ipaambit ang akong nakat-unan ug pipila ka mga obserbasyon nga akong gihimo samtang nagtukod sa dula gikan sa wala.

Girekomenda sa Skillbox: Duha ka tuig nga praktikal nga kurso "Ako usa ka PRO web developer".

Gipahinumduman namon ikaw: alang sa tanan nga mga magbabasa sa "Habr" - usa ka diskwento sa 10 nga mga rubles kung nagpalista sa bisan unsang kurso sa Skillbox gamit ang code sa promosyon nga "Habr".

Nganong Rust?

Gipili nako kini nga pinulongan tungod kay nakadungog ako og daghang mga maayong butang mahitungod niini ug nakita nako nga kini nahimong mas ug mas popular sa pagpalambo sa dula. Sa wala pa isulat ang dula, gamay ra ang akong kasinatian sa paghimo og yano nga mga aplikasyon sa Rust. Igo lang kini aron mahatagan ako usa ka pagbati sa kagawasan samtang nagsulat sa dula.

Ngano nga duwa ug unsa nga matang sa dula?

Ang paghimo og mga dula makalingaw! Nanghinaut ko nga adunay daghang mga hinungdan, apan alang sa mga proyekto sa "balay" gipili nako ang mga hilisgutan nga dili kaayo suod sa akong regular nga trabaho. Unsa ni nga duwa? Gusto ko nga maghimo usa ka butang nga sama sa usa ka simulator sa tennis nga naghiusa sa mga Cities Skylines, Zoo Tycoon, Prison Architect ug tennis mismo. Sa kinatibuk-an, kini nahimo nga usa ka dula bahin sa usa ka tennis academy diin ang mga tawo moadto aron magdula.

Teknikal nga pagbansay

Gusto nakong gamiton ang Rust, apan wala ko mahibal-an kung unsa ka dako ang gikinahanglan aron magsugod. Dili ko gusto nga magsulat sa mga pixel shader ug mogamit sa drag-n-drop, mao nga nangita ko sa labing flexible nga mga solusyon.

Nakakita kog mapuslanong mga kapanguhaan nga akong gipaambit kanimo:

Gisuhid nako ang daghang Rust game engine, sa katapusan gipili ang Piston ug ggez. Nahimamat nako sila samtang nagtrabaho sa miaging proyekto. Sa katapusan, gipili nako ang ggez tungod kay kini daw mas angay alang sa pagpatuman sa usa ka gamay nga 2D nga dula. Ang modular nga istruktura sa Piston labi ka komplikado alang sa usa ka bag-ong developer (o usa nga nagtrabaho sa Rust sa unang higayon).

Istruktura sa dula

Migahin ko og pipila ka panahon sa paghunahuna mahitungod sa arkitektura sa proyekto. Ang unang lakang mao ang paghimo og "yuta", mga tawo ug mga tennis court. Ang mga tawo kinahanglan nga molihok sa palibot sa mga korte ug maghulat. Ang mga magdudula kinahanglan adunay mga kahanas nga molambo sa paglabay sa panahon. Dugang pa, kinahanglan adunay usa ka editor nga nagtugot kanimo sa pagdugang bag-ong mga tawo ug mga korte, apan kini dili na libre.

Human nahunahuna ang tanan, nagtrabaho ko.

Paglalang sa dula

Sinugdanan: Mga Circle ug Abstractions

Nagkuha ako usa ka pananglitan gikan sa ggez ug nakakuha usa ka lingin sa screen. Kahibulongan! Karon pipila ka mga abstraction. Naghunahuna ko nga maayo nga magpalayo gikan sa ideya sa usa ka butang nga dula. Ang matag butang kinahanglang i-render ug i-update sama sa gipahayag dinhi:

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

Kini nga piraso sa code naghatag kanako usa ka nindot nga lista sa mga butang nga mahimo nakong i-update ug i-render sa parehas nga nindot nga loop.

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

Ang main.rs gikinahanglan tungod kay kini naglangkob sa tanang linya sa code. Gigugol nako ang gamay nga oras sa pagbulag sa mga file ug pag-optimize sa istruktura sa direktoryo. Mao kini ang hitsura pagkahuman niadto:
mga kapanguhaan -> kini kung diin ang tanan nga mga kabtangan (mga imahe)
src
- mga entidad
— game_object.rs
— lingin.rs
— main.rs -> main loop

Mga tawo, salog ug mga imahe

Ang sunod nga lakang mao ang paghimo usa ka butang nga dula sa Tawo ug pag-load sa mga imahe. Ang tanan kinahanglan nga matukod base sa 32 * 32 nga mga tile.

Pagdula sa Rust sa 24 oras: personal nga kasinatian sa pag-uswag

Mga korte sa tennis

Pagkahuman sa pagtuon kung unsa ang hitsura sa mga korte sa tennis, nakahukom ko nga himuon kini gikan sa 4 * 2 nga mga tile. Sa sinugdan, posible nga maghimo usa ka imahe sa kini nga gidak-on, o maghiusa sa 8 nga lainlaing mga tile. Apan akong naamgohan nga duha ra ka talagsaon nga mga tile ang gikinahanglan, ug mao kini ang hinungdan.

Sa kinatibuk-an kami adunay duha ka ingon nga mga tile: 1 ug 2.

Ang matag seksyon sa korte naglangkob sa tile 1 o tile 2. Mahimo kini nga ibutang nga normal o i-flip 180 degrees.

Pagdula sa Rust sa 24 oras: personal nga kasinatian sa pag-uswag

Basic construction (assembly) mode

Human nako makab-ot ang paghubad sa mga site, mga tawo ug mga mapa, akong naamgohan nga gikinahanglan usab ang basic assembly mode. Gipatuman nako kini nga sama niini: kung gipugos ang buton, gipili ang butang, ug ang pag-klik nagbutang niini sa gusto nga lugar. Busa, ang buton 1 nagtugot kanimo sa pagpili sa usa ka korte, ug ang buton 2 nagtugot kanimo sa pagpili sa usa ka magdudula.

Apan kinahanglan gihapon natong hinumdoman kung unsa ang gipasabut sa 1 ug 2, mao nga gidugangan nako ang usa ka wireframe aron maklaro kung unsang butang ang gipili. Mao kini ang hitsura niini.

Pagdula sa Rust sa 24 oras: personal nga kasinatian sa pag-uswag

Mga pangutana sa arkitektura ug refactoring

Karon ako adunay daghang mga butang sa dula: mga tawo, korte ug salog. Apan aron molihok ang mga wireframe, ang matag entidad sa butang kinahanglan isulti kung ang mga butang mismo naa sa demonstration mode, o kung ang usa ka bayanan gi-drawing lang. Kini dili kaayo kombenyente.

Para nako ang arkitektura kinahanglan nga hunahunaon pag-usab sa paagi nga nagpadayag sa pipila ka mga limitasyon:

  • Ang pagbaton ug entidad nga naghubad ug nag-update sa kaugalingon usa ka problema tungod kay kana nga entidad dili "makahibalo" kung unsa ang kinahanglan nga i-render - usa ka imahe ug usa ka wireframe;
  • kakulang sa usa ka himan alang sa pagbayloay sa mga kabtangan ug pamatasan tali sa indibidwal nga mga entidad (pananglitan, ang is_build_mode nga kabtangan o paghubad sa pamatasan). Posible nga gamiton ang kabilin, bisan kung wala’y husto nga paagi aron ipatuman kini sa Rust. Ang gikinahanglan gyud nako mao ang layout;
  • gikinahanglan ang usa ka himan alang sa interaksyon tali sa mga entidad aron matudlo ang mga tawo ngadto sa mga korte;
  • ang mga entidad sa ilang kaugalingon usa ka sinagol nga datos ug lohika nga dali nga nawala sa kontrol.

Nag-research pa ko ug nakadiskubre sa arkitektura ECS - Sistema sa Component sa Entity, nga sagad gigamit sa mga dula. Ania ang mga benepisyo sa ECS:

  • ang datos nahimulag gikan sa lohika;
  • komposisyon imbes nga kabilin;
  • arkitektura nga nakasentro sa datos.

Ang ECS ​​gihulagway sa tulo ka batakang konsepto:

  • entidad - ang matang sa butang nga gitumong sa tigpaila (kini mahimo nga usa ka magdudula, bola, o uban pa);
  • mga sangkap - ang mga entidad gilangkoban niini. Pananglitan - rendering component, lokasyon ug uban pa. Kini ang mga bodega sa datos;
  • mga sistema - gigamit nila ang mga butang ug sangkap, dugang nga adunay sulud ug lohika nga gibase sa kini nga datos. Ang usa ka pananglitan mao ang usa ka sistema sa paghubad nga nag-uli sa tanan nga mga entidad nga adunay mga sangkap sa pag-render ug gihimo ang paghubad.

Human sa pagtuon niini, nahimong klaro nga ang ECS ​​nagsulbad sa mosunod nga mga problema:

  • gamit ang layout imbes nga kabilin aron sistematikong pag-organisar ang mga entidad;
  • pagwagtang sa code jumble pinaagi sa mga sistema sa pagkontrol;
  • gamit ang mga pamaagi sama sa is_build_mode aron mapadayon ang logic sa wireframe sa parehas nga lugar - sa sistema sa paghubad.

Mao kini ang nahitabo human sa pagpatuman sa ECS.

mga kapanguhaan -> kini kung diin ang tanan nga mga kabtangan (mga imahe)
src
- mga sangkap
—posisyon.rs
— tawo.rs
— tennis_court.rs
- salog.rs
- wireframe.rs
— mouse_tracked.rs
- mga kapanguhaan
— mouse.rs
- mga sistema
— rendering.rs
— constants.rs
— utils.rs
— world_factory.rs -> mga function sa pabrika sa kalibutan
— main.rs -> main loop

Gi-assign namo ang mga tawo sa mga korte

Gipasayon ​​sa ECS ang kinabuhi. Karon ako adunay sistematikong paagi sa pagdugang sa datos sa mga entidad ug pagdugang og lohika base sa maong datos. Ug kini, sa baylo, nagpaposible sa pag-organisar sa pag-apod-apod sa mga tawo taliwala sa mga korte.

Unsa akong nabuhat:

  • dugang nga datos bahin sa gi-assign nga mga korte sa Tawo;
  • dugang nga datos bahin sa gipang-apod-apod nga mga tawo sa TennisCourt;
  • dugang nga CourtChoosingSystem, nga nagtugot kanimo sa pag-analisar sa mga tawo ug mga korte, pag-ila sa mga magamit nga korte ug pag-apod-apod sa mga magdudula ngadto kanila;
  • midugang usa ka PersonMovementSystem, nga nangita sa mga tawo nga gi-assign sa mga korte, ug kung wala sila didto, ipadala ang mga tawo kung asa sila kinahanglan.

Pagdula sa Rust sa 24 oras: personal nga kasinatian sa pag-uswag

Pagsumada

Nalingaw kaayo ko sa pagtrabaho niining yano nga dula. Dugang pa, nalipay ako nga gigamit nako ang Rust sa pagsulat niini, tungod kay:

  • Ang taya naghatag kanimo sa imong gikinahanglan;
  • kini adunay maayo kaayo nga dokumentasyon, ang Rust medyo elegante;
  • bugnaw ang pagkamakanunayon;
  • dili ka kinahanglan nga modangop sa pag-clone, pagkopya o uban pang susama nga mga aksyon, nga kanunay nakong gibuhat sa C ++;
  • Ang mga kapilian sayon ​​kaayo gamiton ug maayo kaayo ang pagdumala sa mga sayop;
  • kung ang proyekto mahimo nga ma-compile, unya 99% sa oras nga kini molihok, ug eksakto kung unsa kini kinahanglan. Sa akong hunahuna ang mga mensahe sa sayup sa compiler mao ang labing kaayo nga akong nakita.

Ang pag-uswag sa dula sa Rust nagsugod pa lang. Apan adunay na usa ka lig-on ug medyo dako nga komunidad nga nagtrabaho aron maablihan ang Rust sa tanan. Busa, akong gitan-aw ang kaugmaon sa pinulongan uban ang pagkamalaumon, nga nagpaabut sa mga resulta sa atong komon nga trabaho.

Girekomenda sa Skillbox:

Source: www.habr.com

Idugang sa usa ka comment