Milalao Rust ao anatin'ny 24 ora: traikefa amin'ny fampandrosoana manokana

Milalao Rust ao anatin'ny 24 ora: traikefa amin'ny fampandrosoana manokana

Amin'ity lahatsoratra ity dia hiresaka momba ny traikefako manokana amin'ny famolavolana lalao kely amin'ny Rust aho. Naharitra 24 ora teo ho eo ny famoronana dikan-teny miasa (ny hariva na ny faran'ny herinandro no niasako matetika). Mbola tsy vita ny lalao, saingy heveriko fa hahafaly ny traikefa. Hizara ny zavatra nianarako sy ny fanamarihana nataoko nandritra ny fananganana ny lalao hatramin'ny voalohany aho.

Skillbox dia manoro hevitra: Taranja azo ampiharina roa taona "Izaho dia mpamorona tranonkala PRO".

Mampahatsiahy izahay: ho an'ny mpamaky rehetra ny "Habr" - fihenam-bidy 10 roubles rehefa misoratra anarana amin'ny taranja Skillbox rehetra mampiasa ny code promotional "Habr".

Nahoana no Rust?

Nisafidy ity fiteny ity aho satria naheno zavatra tsara maro momba azy ary hitako fa miha-malaza hatrany amin'ny fampandrosoana lalao. Talohan'ny nanoratako ny lalao dia tsy dia nanana traikefa firy tamin'ny famolavolana fampiharana tsotra amin'ny Rust aho. Izany dia ampy nanome ahy fahatsapana fahafahana teo am-panoratana ny lalao.

Nahoana ny lalao ary inona no karazana lalao?

Mahafinaritra ny manao lalao! Maniry aho raha misy antony maro kokoa, fa ho an'ny tetikasa "trano" dia misafidy lohahevitra tsy dia mifandray loatra amin'ny asako mahazatra aho. Lalao inona ity? Te-hanao zavatra toy ny simulator tenisy aho izay manambatra ny Skylines Cities, Zoo Tycoon, Prison Architect ary tennis mihitsy. Amin'ny ankapobeny dia lasa lalao momba ny akademia tenisy izay misy ny olona milalao.

Fanofanana ara-teknika

Te-hampiasa Rust aho, saingy tsy fantatro tsara hoe ohatrinona no ilaina hanombohana. Tsy te hanoratra shaders pixel aho ary hampiasa drag-n-drop, ka nitady vahaolana mora indrindra aho.

Nahita loharano mahasoa izay zaraiko aminao aho:

Nikaroka motera lalao Rust maromaro aho, tamin'ny farany nisafidy Piston sy ggez. Nifanena tamin'izy ireo aho teo am-panaovana tetikasa teo aloha. Tamin'ny farany dia nisafidy ggez aho satria toa mety kokoa amin'ny fampiharana lalao 2D kely. Ny firafitry ny modular an'ny Piston dia sarotra loatra ho an'ny mpamorona vaovao (na olona izay sambany miasa amin'ny Rust).

Firafitry ny lalao

Nandany fotoana kely aho nieritreritra momba ny maritrano momba ny tetikasa. Ny dingana voalohany dia ny fanaovana "tany", ny olona ary ny kianja filalaovana tennis. Tsy maintsy mivezivezy eny amin’ny fitsarana ny olona ary miandry. Ny mpilalao dia tsy maintsy manana fahaiza-manao izay mivoatra rehefa mandeha ny fotoana. Fanampin'izay, tokony hisy tonian-dahatsoratra ahafahanao manampy olona sy fitsarana vaovao, saingy tsy maimaim-poana intsony izany.

Rehefa nieritreritra tsara ny zava-drehetra aho dia nanomboka niasa.

Famoronana lalao

Fiantombohana: faribolana sy abstraction

Naka ohatra avy amin'ny ggez aho ary nahazo faribolana teo amin'ny efijery. Mahagaga! Ankehitriny abstractions sasany. Nihevitra aho fa tsara ny miala amin'ny hevitra momba ny lalao. Ny zavatra tsirairay dia tsy maintsy adika sy havaozina araka ny voalaza eto:

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

Ity sombin-kaody ity dia nanome ahy lisitr'ireo zavatra azoko havaozina sy adika amin'ny loop mahafinaritra mitovy.

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

ilaina ny main.rs satria misy ny andalana code rehetra ao anatiny. Nandany fotoana kely aho nanasaraka ireo rakitra sy nanatsara ny firafitry ny lahatahiry. Toy izao ny endriny taorian’izay:
loharano -> eto no misy ny fananana rehetra (sary)
src
- fikambanana
— game_object.rs
— faribolana.rs
— main.rs -> loop lehibe

Olona, ​​gorodona ary sary

Ny dingana manaraka dia ny mamorona zavatra lalao Persona ary mametaka sary. Ny zava-drehetra dia tokony haorina amin'ny fototry ny 32 * 32 taila.

Milalao Rust ao anatin'ny 24 ora: traikefa amin'ny fampandrosoana manokana

Fitsarana tenisy

Rehefa avy nandinika ny endriky ny kianja filalaovana tenisy aho dia nanapa-kevitra ny hanao azy ireo amin'ny taila 4*2. Tamin'ny voalohany dia azo natao ny nanao sary amin'io habe io, na nanangona taila 8 misaraka. Tsapako anefa avy eo fa taila tsy manam-paharoa roa ihany no ilaina, ary izao no antony.

Amin'ny fitambarany dia manana taila roa toy izany izahay: 1 sy 2.

Ny fizarana tsirairay ao amin'ny kianja dia misy taila 1 na taila 2. Azo apetraka toy ny mahazatra izy ireo na mihodina 180 degre.

Milalao Rust ao anatin'ny 24 ora: traikefa amin'ny fampandrosoana manokana

Fomba fanorenana fototra (assembly).

Rehefa vitako ny nandika ny tranokala, ny olona ary ny sarintany, dia tsapako fa ilaina koa ny fomba fanaovana fivoriambe fototra. Nataoko toy izao izany: rehefa voatsindry ny bokotra, dia voafantina ilay zavatra, ary ny tsindry dia mametraka azy amin'ny toerana irina. Noho izany, ny bokotra 1 dia ahafahanao misafidy fitsarana, ary ny bokotra 2 dia ahafahanao misafidy mpilalao.

Saingy mbola mila tadidintsika ny dikan'ny 1 sy 2, ka nampiana wireframe aho mba hanazavana ny zavatra nofantenana. Toy izao ny endriny.

Milalao Rust ao anatin'ny 24 ora: traikefa amin'ny fampandrosoana manokana

Architecture sy refactoring fanontaniana

Ankehitriny dia manana zavatra lalao maromaro aho: olona, ​​kianja ary gorodona. Fa mba hahafahan'ny wireframes miasa, ny singa tsirairay dia tokony holazaina raha toa ka ao anatin'ny fomba fihetsiketsehana ny zavatra, na raha atao sary fotsiny ny frame iray. Tsy dia mety loatra izany.

Noheveriko fa mila nodinihina indray ny maritrano amin'ny fomba izay mampiseho fetra sasany:

  • Olana ny fananana enti-mitondra sy manavao ny tenany satria tsy ho afaka "hahalala" izay tokony havoakany - sary sy tariby;
  • tsy fisian'ny fitaovana hifanakalozana fananana sy fitondran-tena eo amin'ny sampan-draharaha tsirairay (ohatra, ny fananana is_build_mode na fanehoana fihetsika). Azo atao ny mampiasa lova, na dia tsy misy fomba tsara hampiharana azy amin'ny Rust aza. Ny tena nilaiko dia ny layout;
  • nilaina ny fitaovana hifaneraserana eo amin'ny sampana mba hanendry olona ho any amin'ny fitsarana;
  • ireo sampana mihitsy dia fifangaroan'ny angona sy lojika izay tsy voafehy haingana.

Nanao fikarohana bebe kokoa aho ary nahita ny maritrano ECS - Rafitra singa singa, izay matetika ampiasaina amin'ny lalao. Ireto ny tombontsoa azo avy amin'ny ECS:

  • misaraka amin'ny lojika ny data;
  • composition fa tsy lova;
  • maritrano mifototra amin'ny data.

Ny ECS dia miavaka amin'ny foto-kevitra fototra telo:

  • entity - ny karazana zavatra tian'ny mpanondro (mety ho mpilalao, baolina, na zavatra hafa);
  • singa - entiny no mandrafitra azy ireo. Ohatra - rendering singa, toerana sy ny hafa. Ireo dia trano fanatobiana data;
  • rafitra - samy mampiasa zavatra sy singa izy ireo, miampy ny fitondran-tena sy ny lojika mifototra amin'ity data ity. Ny ohatra iray dia rafitra fandrefesana izay miverimberina amin'ny sampan-draharaha rehetra misy singa mandika ary manao ny fandikana.

Rehefa avy nandinika izany dia nanjary nazava fa ny ECS dia mamaha ireto olana manaraka ireto:

  • fampiasana ny layout fa tsy lova mba handaminana ireo sampana ara-dalàna;
  • manala ny code jumble amin'ny alalan'ny rafitra fanaraha-maso;
  • mampiasa fomba toy ny is_build_mode mba hitazonana ny lojika wireframe ao amin'ny toerana iray ihany - ao amin'ny rafitra famandrihana.

Izany no nitranga taorian'ny fampiharana ny ECS.

loharano -> eto no misy ny fananana rehetra (sary)
src
- singa
— position.rs
— olona.rs
— tennis_court.rs
— gorodona.rs
- wireframe.rs
— mouse_tracked.rs
- harena
— totozy.rs
- rafitra
— rendering.rs
— constants.rs
— utils.rs
— world_factory.rs -> fiasan'ny orinasa maneran-tany
— main.rs -> loop lehibe

Manendry olona ho any amin'ny fitsarana izahay

Nanamora ny fiainana ny ECS. Ankehitriny dia nanana fomba rafitra aho hanampiana angona amin'ny enti-manana ary hanampy lojika mifototra amin'io data io. Ary izany indray no nahafahana nandamina ny fitsinjarana ny olona eny anivon’ny fitsarana.

Inona no nataoko:

  • nampiana angona momba ny fitsarana voatendry ho an'ny olona;
  • nampiana angona momba ny olona nozaraina tamin'ny TennisCourt;
  • nanampy ny CourtChoosingSystem, izay ahafahanao mamakafaka ny olona sy ny fitsarana, mamantatra ny fitsarana misy ary mizara mpilalao amin'izy ireo;
  • nanampy PersonMovementSystem, izay mitady olona voatendry ho any amin'ny fitsarana, ary raha tsy eo izy ireo, dia mandefa olona any amin'izay ilainy.

Milalao Rust ao anatin'ny 24 ora: traikefa amin'ny fampandrosoana manokana

Famintinana

Tena nahafinaritra ahy ny niasa tamin'ity lalao tsotra ity. Ankoatra izany, faly aho fa nampiasa Rust nanoratra azy, satria:

  • Ny harafesina dia manome anao izay ilainao;
  • manana antontan-taratasy tena tsara izy io, kanto ny Rust;
  • mangatsiatsiaka ny tsy miovaova;
  • tsy mila mampiasa cloning, kopia na hetsika hafa mitovy amin'izany ianao, izay matetika ataoko amin'ny C ++;
  • Ny safidy dia tena mora ampiasaina ary mitantana tsara ny lesoka;
  • Raha azo natambatra ny tetikasa, dia 99% ny fotoana niasany, ary araka ny tokony ho izy. Heveriko fa ny hafatra diso amin'ny compiler no tsara indrindra hitako.

Vao manomboka ny fivoaran'ny lalao ao amin'ny Rust. Saingy efa misy vondrom-piarahamonina marin-toerana sy somary lehibe miasa hanokatra Rust ho an'ny rehetra. Noho izany, mijery ny ho avin'ny fiteny aho amin'ny fanantenana, miandrandra ny vokatry ny asa iombonana.

Skillbox dia manoro hevitra:

Source: www.habr.com

Add a comment