Ua si Rust hauv 24 teev: kev txhim kho tus kheej

Ua si Rust hauv 24 teev: kev txhim kho tus kheej

Hauv tsab xov xwm no kuv yuav tham txog kuv tus kheej kev paub txog kev tsim ib qho kev ua si me me hauv Rust. Nws siv sijhawm li 24 teev los tsim cov haujlwm ua haujlwm (Kuv feem ntau ua haujlwm yav tsaus ntuj lossis hnub so). Qhov kev ua si nyob deb ntawm kev ua tiav, tab sis kuv xav tias qhov kev paub yuav tau txais txiaj ntsig. Kuv mam li qhia qhov kuv tau kawm thiab qee qhov kev soj ntsuam uas kuv tau ua thaum tsim qhov kev ua si los ntawm kos.

Skillbox pom zoo: Ob xyoos xyaum xyaum "Kuv yog PRO web developer".

Peb nco qab: rau txhua tus neeg nyeem Habr - 10 ruble luv nqi thaum tso npe rau hauv ib chav kawm Skillbox siv Habr promo code.

Vim li cas Rust?

Kuv xaiv hom lus no vim tias kuv tau hnov ​​ntau yam zoo txog nws thiab kuv pom tias nws tau dhau los ua neeg nyiam hauv kev txhim kho kev ua si. Ua ntej sau qhov kev ua si, kuv muaj kev paub me ntsis los tsim cov ntawv thov yooj yim hauv Rust. Qhov no tsuas yog txaus los muab kev ywj pheej rau kuv thaum sau qhov kev ua si.

Vim li cas qhov kev ua si thiab hom kev ua si?

Kev ua si yog lom zem! Kuv xav tias muaj ntau qhov laj thawj, tab sis rau cov haujlwm "tsev" kuv xaiv cov ntsiab lus uas tsis cuam tshuam nrog kuv txoj haujlwm tsis tu ncua. Qhov no yog dab tsi game? Kuv xav ua ib yam dab tsi zoo li kev sib tw ntaus pob tesniv uas ua ke nrog Cities Skylines, Zoo Tycoon, Tus Kws Lij Choj Hauv Tsev Loj thiab ntaus pob tesniv nws tus kheej. Feem ntau, nws tau dhau los ua ib qho kev ua si hais txog lub tsev kawm ntaus pob tesniv uas tib neeg tuaj ua si.

Kev cob qhia txuj ci

Kuv xav siv Rust, tab sis kuv tsis paub meej npaum li cas nws yuav siv los pib. Kuv tsis xav sau pixel shaders thiab siv luag-n-poob, yog li kuv tab tom nrhiav cov kev daws teeb meem yooj yim tshaj plaws.

Kuv pom cov ntaub ntawv muaj txiaj ntsig uas kuv qhia rau koj:

Kuv tshawb nrhiav ntau lub tshuab ua si Rust, thaum kawg xaiv Piston thiab ggez. Kuv tau hla lawv thaum ua haujlwm ntawm qhov project dhau los. Thaum kawg, kuv xaiv ggez vim nws zoo nkaus li tsim nyog rau kev ua si 2D me me. Piston's modular qauv yog qhov nyuaj heev rau tus tsim tawm tshiab (lossis ib tus neeg ua haujlwm nrog Rust thawj zaug).

Game qauv

Kuv tau siv qee lub sij hawm xav txog cov architecture ntawm qhov project. Thawj kauj ruam yog ua "av", tib neeg thiab tennis lub tsev hais plaub. Cov neeg yuav tsum tsiv mus nyob ib ncig ntawm lub tsev hais plaub thiab tos. Cov neeg ua si yuav tsum muaj kev txawj ntse uas txhim kho lub sijhawm. Ntxiv rau, yuav tsum muaj tus editor uas tso cai rau koj ntxiv cov neeg tshiab thiab cov tsev hais plaub, tab sis qhov no tsis pub dawb lawm.

Tau xav txog txhua yam dhau los, kuv tau mus ua haujlwm.

Kev ua si tsim

Pib: Vajvoog thiab Abstractions

Kuv coj ib qho piv txwv los ntawm ggez thiab tau txais ib lub voj voog ntawm qhov screen. Zoo kawg! Tam sim no ib co abstractions. Kuv xav tias nws yuav zoo rau abstract deb ntawm lub tswv yim ntawm cov khoom ua si. Txhua yam khoom yuav tsum tau muab thiab kho tshiab raws li tau teev tseg ntawm no:

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

Cov lej no tau muab rau kuv ib daim ntawv teev cov khoom zoo uas kuv tuaj yeem hloov kho thiab ua rau hauv ib lub voj zoo sib npaug.

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 yog qhov tsim nyog vim nws muaj tag nrho cov kab ntawm cov cai. Kuv siv sij hawm me ntsis cais cov ntaub ntawv thiab optimizing cov qauv directory. Nov yog qhov nws zoo li tom qab ntawd:
Resources -> qhov no yog qhov twg tag nrho cov cuab tam yog (duab)
Src
- cov koom haum
— game_object.rs
— circle.rs
— main.rs —> lub ntsiab voj

Cov neeg, pem teb thiab cov duab

Cov kauj ruam tom ntej yog los tsim tus neeg ua si khoom thiab thauj cov duab. Txhua yam yuav tsum tau ua los ntawm 32 * 32 vuas.

Ua si Rust hauv 24 teev: kev txhim kho tus kheej

Ntaus pob tesniv

Tom qab kawm seb lub tsev hais plaub ntaus pob tesniv zoo li cas, kuv txiav txim siab ua lawv los ntawm 4 * 2 vuas. Thaum xub thawj, nws muaj peev xwm ua tau ib daim duab ntawm qhov loj me, los yog muab tso ua ke 8 cais cov vuas. Tab sis tom qab ntawd kuv pom tau hais tias tsuas yog ob lub pob zeb tshwj xeeb xav tau, thiab ntawm no yog vim li cas.

Nyob rau hauv tag nrho peb muaj ob cov vuas xws li: 1 thiab 2.

Txhua ntu ntawm lub tsev hais plaub muaj cov pobzeb 1 lossis pobzeb 2. Lawv tuaj yeem muab tso rau hauv qhov qub lossis flipped 180 degrees.

Ua si Rust hauv 24 teev: kev txhim kho tus kheej

Kev tsim kho yooj yim (kev sib dhos) hom

Tom qab kuv tau tswj hwm kom ua tiav cov chaw, cov neeg thiab cov duab qhia chaw, kuv pom tau tias yuav tsum muaj hom kev sib dhos yooj yim. Kuv tau siv nws zoo li no: thaum nias lub pob, cov khoom raug xaiv, thiab nias qhov chaw nyob rau hauv qhov chaw xav tau. Yog li, khawm 1 tso cai rau koj xaiv lub tsev hais plaub, thiab khawm 2 tso cai rau koj xaiv tus neeg ua si.

Tab sis peb tseem yuav tsum nco ntsoov tias 1 thiab 2 txhais li cas, yog li kuv ntxiv ib lub wireframe kom paub meej tias yam khoom twg raug xaiv. Qhov no yog qhov nws zoo li.

Ua si Rust hauv 24 teev: kev txhim kho tus kheej

Architecture thiab refactoring cov lus nug

Tam sim no kuv muaj ob peb yam khoom ua si: neeg, tsev hais plaub thiab hauv pem teb. Tab sis txhawm rau kom wireframes ua haujlwm, txhua qhov khoom lag luam yuav tsum tau qhia seb cov khoom lawv tus kheej puas nyob hauv kev ua qauv qhia, lossis seb lub thav duab tsuas yog kos. Qhov no tsis yooj yim heev.

Nws zoo nkaus li rau kuv tias architecture yuav tsum tau rov xav dua hauv txoj hauv kev uas qhia qee qhov kev txwv:

  • Muaj ib lub koom haum uas renders thiab hloov kho nws tus kheej yog ib qho teeb meem vim hais tias lub koom haum yuav tsis muaj peev xwm "paub" dab tsi nws yuav tsum render - ib tug duab thiab ib tug wireframe;
  • tsis muaj lub cuab yeej rau kev sib pauv khoom thiab kev coj tus cwj pwm ntawm ib tus neeg (piv txwv li, cov cuab yeej is_build_mode lossis kev coj cwj pwm). Nws yuav muaj peev xwm siv tau qub txeeg qub teg, txawm hais tias tsis muaj txoj hauv kev los siv nws hauv Rust. Qhov kuv xav tau tiag tiag yog qhov layout;
  • ib qho cuab yeej rau kev sib cuam tshuam ntawm cov koom haum yog xav tau los muab cov neeg rau hauv tsev hais plaub;
  • cov koom haum lawv tus kheej yog qhov sib xyaw ntawm cov ntaub ntawv thiab cov logic uas tau tawm ntawm kev tswj tau sai.

Kuv tau ua qee qhov kev tshawb fawb ntxiv thiab tshawb pom cov architecture ECS - Cov Txheej Txheem Txheej Txheem, uas yog feem ntau siv hauv kev ua si. Nov yog cov txiaj ntsig ntawm ECS:

  • cov ntaub ntawv yog cais los ntawm logic;
  • muaj pes tsawg leeg tsis yog qub txeeg qub teg;
  • data-centric architecture.

ECS yog tus cwj pwm los ntawm peb lub ntsiab lus tseem ceeb:

  • cov koom haum - hom khoom uas tus cim hais txog (nws tuaj yeem yog tus neeg ncaws pob, pob, lossis lwm yam);
  • Cheebtsam - cov koom haum yog tsim los ntawm lawv. Piv txwv - rendering Cheebtsam, qhov chaw thiab lwm yam. Cov no yog cov ntaub ntawv warehouses;
  • systems - lawv siv ob yam khoom thiab cov khoom, ntxiv rau muaj tus cwj pwm thiab cov laj thawj uas ua raws li cov ntaub ntawv no. Ib qho piv txwv yog ib qho rendering system uas iterates los ntawm txhua qhov chaw nrog rendering Cheebtsam thiab ua qhov rendering.

Tom qab kawm nws, nws tau pom tseeb tias ECS daws cov teeb meem hauv qab no:

  • siv layout es tsis yog qub txeeg qub teg los npaj cov koom haum systemically;
  • tshem tawm code jumble los ntawm kev tswj systems;
  • siv txoj kev zoo li is_build_mode kom lub wireframe logic nyob rau hauv tib qhov chaw - nyob rau hauv lub rendering system.

Nov yog qhov tshwm sim tom qab siv ECS.

Resources -> qhov no yog qhov twg tag nrho cov cuab tam yog (duab)
Src
- cov khoom xyaw
- position.rs
- neeg.rs
— tennis_court.rs
— floor.rs
- wireframe.rs
— mouse_tracked.rs
- peev txheej
-mus.rs
- systems
— rendering.rs
— constants.rs
— utils.rs
- world_factory.rs -> ntiaj teb lub Hoobkas ua haujlwm
— main.rs —> lub ntsiab voj

Peb muab cov neeg mus rau lub tsev hais plaub

ECS tau ua kom lub neej yooj yim dua. Tam sim no kuv muaj txoj hauv kev los ntxiv cov ntaub ntawv rau cov chaw thiab ntxiv cov logic raws li cov ntaub ntawv. Thiab qhov no, nyob rau hauv lem, ua rau nws muaj peev xwm mus npaj kev faib cov neeg ntawm lub tsev hais plaub.

Kuv tau ua dab tsi:

  • ntxiv cov ntaub ntawv hais txog cov tsev hais plaub muab rau Tus Neeg;
  • ntxiv cov ntaub ntawv hais txog cov neeg faib rau TennisCourt;
  • ntxiv CourtChoosingSystem, uas tso cai rau koj los txheeb xyuas tib neeg thiab cov tsev hais plaub, tshawb xyuas cov tsev hais plaub thiab faib cov players rau lawv;
  • ntxiv PersonMovementSystem, uas saib rau cov neeg muab rau hauv tsev hais plaub, thiab yog tias lawv tsis nyob ntawd, ces xa cov neeg mus rau qhov chaw lawv xav tau.

Ua si Rust hauv 24 teev: kev txhim kho tus kheej

Summing txog

Kuv yeej nyiam ua haujlwm ntawm qhov kev ua si yooj yim no. Ntxiv mus, kuv zoo siab tias kuv siv Rust los sau nws, vim tias:

  • Rust muab qhov koj xav tau;
  • nws muaj cov ntaub ntawv zoo heev, Rust yog elegant heev;
  • sib xws yog txias;
  • koj tsis tas yuav mus rau cloning, luam lossis lwm yam zoo sib xws, uas kuv tau ua hauv C ++;
  • Cov kev xaiv tau yooj yim heev rau kev siv thiab daws qhov yuam kev zoo heev;
  • yog tias qhov project tuaj yeem muab tso ua ke, ces 99% ntawm lub sijhawm nws ua haujlwm, thiab raws nraim li nws yuav tsum tau ua. Kuv xav tias cov lus yuam kev compiler yog qhov zoo tshaj plaws uas kuv tau pom.

Kev txhim kho kev ua si hauv Rust tsuas yog pib. Tab sis twb muaj ib lub zej zog ruaj khov thiab loj loj ua haujlwm qhib Rust rau txhua tus. Yog li ntawd, kuv saib yav tom ntej ntawm cov lus nrog kev cia siab, tos ntsoov rau cov txiaj ntsig ntawm peb txoj haujlwm.

Skillbox pom zoo:

Tau qhov twg los: www.hab.com

Ntxiv ib saib