Nilgħab Rust f'24 siegħa: esperjenza ta 'żvilupp personali

Nilgħab Rust f'24 siegħa: esperjenza ta 'żvilupp personali

F'dan l-artikolu ser nitkellem dwar l-esperjenza personali tiegħi ta 'żvilupp ta' logħba żgħira f'Rut. Ħad madwar 24 siegħa biex tinħoloq verżjoni tax-xogħol (l-aktar ħdimt filgħaxija jew fi tmiem il-ġimgħa). Il-logħba għadha 'l bogħod milli titlesta, iżda naħseb li l-esperjenza se tkun ta' sodisfazzjon. Naqsam dak li tgħallimt u xi osservazzjonijiet li għamilt waqt li nibni l-logħba mill-bidu.

Skillbox jirrakkomanda: Kors prattiku ta' sentejn "Jien żviluppatur tal-web PRO".

Infakkrukom: għall-qarrejja kollha ta '"Habr" - skont ta' 10 rublu meta tirreġistra fi kwalunkwe kors ta 'Skillbox billi tuża l-kodiċi promozzjonali "Habr".

Għaliex Rust?

Għażilt din il-lingwa għax smajt ħafna affarijiet tajbin dwarha u naraha ssir dejjem aktar popolari fl-iżvilupp tal-logħob. Qabel ma nikteb il-logħba, kelli ftit esperjenza fl-iżvilupp ta' applikazzjonijiet sempliċi f'Rut. Dan kien biżżejjed biex jagħtini sens ta’ libertà waqt li nikteb il-logħba.

Għaliex il-logħba u x'tip ta 'logħba?

Li tagħmel il-logħob huwa pjaċevoli! Nixtieq li jkun hemm aktar raġunijiet, iżda għal proġetti "dar" nagħżel suġġetti li mhumiex relatati wisq mill-qrib max-xogħol regolari tiegħi. X'logħba hija din? Ridt nagħmel xi ħaġa bħal simulatur tat-tennis li jgħaqqad Cities Skylines, Zoo Tycoon, Prison Architect u t-tennis innifsu. B’mod ġenerali, irriżulta li kienet logħba dwar akkademja tat-tennis fejn in-nies jiġu jilagħbu.

Taħriġ tekniku

Xtaqt nuża Rust, imma ma kontx naf eżatt kemm kien se jieħu l-bażi biex tibda. Ma ridtx nikteb pixel shaders u nuża drag-n-drop, għalhekk kont qed infittex l-aktar soluzzjonijiet flessibbli.

Sibt riżorsi utli li naqsam miegħek:

Esplorajt diversi magni tal-logħob Rust, fl-aħħar għażilt Piston u ggez. Iltqajt magħhom waqt li kont qed naħdem fuq proġett preċedenti. Fl-aħħar, għażilt ggez għax deher aktar adattat għall-implimentazzjoni ta 'logħba żgħira 2D. L-istruttura modulari tal-pistun hija kumplessa wisq għal żviluppatur novizzi (jew xi ħadd li qed jaħdem ma' Rust għall-ewwel darba).

Struttura tal-logħob

Għamilt ftit ħin naħseb dwar l-arkitettura tal-proġett. L-ewwel pass huwa li tagħmel l-"art", in-nies u l-qrati tat-tennis. In-nies iridu jiċċaqilqu madwar il-qrati u jistennew. Il-plejers irid ikollhom ħiliet li jitjiebu maż-żmien. Barra minn hekk, għandu jkun hemm editur li jippermettilek li żżid nies u qrati ġodda, iżda dan m'għadux b'xejn.

Wara li ħsibt kollox, sirt naħdem.

Ħolqien tal-logħob

Bidu: Ċrieki u Astrazzjonijiet

Ħad eżempju minn ggez u sibt ċirku fuq l-iskrin. Marvelous! Issa xi astrazzjonijiet. Ħsibt li jkun sabiħ li jastratt bogħod mill-idea ta 'oġġett tal-logħba. Kull oġġett għandu jkun ipprovdut u aġġornat kif iddikjarat hawn:

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

Din il-biċċa ta 'kodiċi tatni lista sabiħa ta' oġġetti li stajt naġġorna u nirrendi f'linja daqstant sabiħa.

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 huwa meħtieġ minħabba li fih il-linji kollha tal-kodiċi. Għamilt ftit ħin nissepara l-fajls u nottimizza l-istruttura tad-direttorju. Dan huwa kif deher wara dan:
riżorsi -> dan huwa fejn l-assi kollha (immaġini)
src
- entitajiet
— game_object.rs
— ċirku.rs
— main.rs -> main loop

Nies, artijiet u stampi

Il-pass li jmiss huwa li toħloq oġġett tal-logħba Persuna u tgħabbi immaġini. Kollox għandu jinbena fuq il-bażi ta '32 * 32 madum.

Nilgħab Rust f'24 siegħa: esperjenza ta 'żvilupp personali

Courts tat-tennis

Wara li studja kif jidhru l-courts tat-tennis, iddeċidejt li nagħmilhom minn madum 4 * 2. Inizjalment, kien possibbli li ssir immaġni ta 'dan id-daqs, jew li tgħaqqad flimkien 8 madum separati. Imma mbagħad indunajt li kien hemm bżonn biss żewġ madum uniku, u hawn għaliex.

B'kollox għandna żewġ madum bħal dawn: 1 u 2.

Kull sezzjoni tal-qorti tikkonsisti minn maduma 1 jew maduma 2. Jistgħu jitqiegħdu bħala normali jew jinqalbu 180 grad.

Nilgħab Rust f'24 siegħa: esperjenza ta 'żvilupp personali

Modalità bażika tal-kostruzzjoni (assemblaġġ).

Wara li rnexxieli nikseb rendering ta 'siti, nies u mapep, indunajt li mod bażiku ta' assemblaġġ kien meħtieġ ukoll. I implimentajtha hekk: meta l-buttuna tiġi ppressata, l-oġġett jintgħażel, u l-ikklikkja tpoġġiha fil-post mixtieq. Għalhekk, il-buttuna 1 tippermettilek tagħżel qorti, u l-buttuna 2 tippermettilek tagħżel plejer.

Imma għad irridu niftakru xi jfissru 1 u 2, għalhekk żidt wireframe biex tagħmilha ċara liema oġġett intgħażel. Dan huwa kif jidher.

Nilgħab Rust f'24 siegħa: esperjenza ta 'żvilupp personali

Mistoqsijiet ta' arkitettura u refactoring

Issa għandi diversi oġġetti tal-logħob: nies, qrati u pavimenti. Iżda sabiex il-wireframes jaħdmu, kull entità oġġett jeħtieġ li tiġi mgħarrfa jekk l-oġġetti nfushom humiex fil-mod ta 'dimostrazzjoni, jew jekk qafas huwiex sempliċement imfassal. Dan mhux konvenjenti ħafna.

Deherli li l-arkitettura kellha bżonn tiġi maħsuna mill-ġdid b’mod li żvela xi limitazzjonijiet:

  • Li jkollok entità li tirrendi u taġġorna lilha nnifisha hija problema għaliex dik l-entità mhux se tkun kapaċi "taf" dak li suppost tirrendi - immaġini u wireframe;
  • nuqqas ta' għodda għall-iskambju ta' proprjetajiet u mġiba bejn entitajiet individwali (pereżempju, il-proprjetà is_build_mode jew ir-rendiment tal-imġieba). Ikun possibbli li tuża l-wirt, għalkemm m'hemm l-ebda mod xieraq biex tiġi implimentata f'Rut. Dak li verament kelli bżonn kien it-tqassim;
  • kienet meħtieġa għodda għall-interazzjoni bejn l-entitajiet biex jiġu assenjati nies lill-qrati;
  • l-entitajiet nfushom kienu taħlita ta’ data u loġika li malajr ħarġu mill-kontroll.

Għamilt aktar riċerka u skoprejt l-arkitettura ECS - Sistema tal-Komponent tal-Entità, li huwa komunement użat fil-logħob. Hawn huma l-benefiċċji tal-ECS:

  • id-data hija separata mill-loġika;
  • kompożizzjoni minflok wirt;
  • arkitettura ċċentrata fuq id-data.

L-ECS hija kkaratterizzata minn tliet kunċetti bażiċi:

  • entitajiet - it-tip ta' oġġett li jirreferi għalih l-identifikatur (jista' jkun plejer, ballun, jew xi ħaġa oħra);
  • komponenti - l-entitajiet huma magħmula minnhom. Eżempju - komponent tar-rendi, postijiet u oħrajn. Dawn huma mħażen tad-dejta;
  • sistemi - huma jużaw kemm oġġetti u komponenti, flimkien ma fihom imġieba u loġika li huma bbażati fuq din id-data. Eżempju huwa sistema ta' rendering li tgħaddi mill-entitajiet kollha b'komponenti ta' rendering u tagħmel ir-rendering.

Wara li studjaha, deher ċar li l-ECS issolvi l-problemi li ġejjin:

  • l-użu tat-tqassim minflok il-wirt biex torganizza l-entitajiet b'mod sistematiku;
  • teħles mill-kowd ta' kodiċi permezz ta' sistemi ta' kontroll;
  • bl-użu ta' metodi bħal is_build_mode biex iżżomm il-loġika tal-wireframe fl-istess post - fis-sistema tar-rendi.

Dan huwa dak li ġara wara l-implimentazzjoni tal-ECS.

riżorsi -> dan huwa fejn l-assi kollha (immaġini)
src
- komponenti
—pożizzjoni.rs
— persuna.rs
— tennis_court.rs
— art.rs
- wireframe.rs
— mouse_tracked.rs
- riżorsi
—ġurdien.rs
- sistemi
— tirrendi.rs
— kostanti.rs
— utils.rs
— world_factory.rs -> funzjonijiet tal-fabbrika dinjija
— main.rs -> main loop

Aħna jassenjaw nies fil-qrati

L-ECS għamlet il-ħajja aktar faċli. Issa kelli mod sistematiku biex inżid dejta ma 'entitajiet u nżid loġika bbażata fuq dik id-dejta. U dan, imbagħad, għamilha possibbli li tiġi organizzata d-distribuzzjoni tan-nies fost il-qrati.

X'għamilt:

  • dejta miżjuda dwar qrati assenjati lil Persuna;
  • żiedet dejta dwar in-nies imqassma lil TennisCourt;
  • miżjud CourtChoosingSystem, li jippermettilek tanalizza nies u qrati, tiskopri qrati disponibbli u tqassam players lilhom;
  • żied PersonMovementSystem, li jfittex nies assenjati fil-qrati, u jekk ma jkunux hemm, imbagħad jibgħat lin-nies fejn iridu jkunu.

Nilgħab Rust f'24 siegħa: esperjenza ta 'żvilupp personali

Bħala sinteżi

Ħadt gost naħdem fuq din il-logħba sempliċi. Barra minn hekk, ninsab kuntent li użajt Rust biex nikteb, għax:

  • Is-sadid jagħtik dak li għandek bżonn;
  • għandu dokumentazzjoni eċċellenti, Rust huwa pjuttost eleganti;
  • il-konsistenza hija friska;
  • m'għandekx għalfejn tirrikorri għal klonazzjoni, ikkupjar jew azzjonijiet oħra simili, li ħafna drabi għamilt f'C++;
  • L-għażliet huma faċli ħafna biex jintużaw u jimmaniġġjaw l-iżbalji tajjeb ħafna;
  • jekk il-proġett seta 'jiġi kkompilat, allura 99% tal-ħin jaħdem, u eżattament kif suppost. Naħseb li l-messaġġi ta 'żball tal-kompilatur huma l-aħjar li rajt.

L-iżvilupp tal-logħob f'Rut għadu qed jibda. Iżda diġà hemm komunità stabbli u pjuttost kbira li taħdem biex tiftaħ Rust għal kulħadd. Għalhekk, inħares lejn il-futur tal-lingwa b'ottimiżmu, inħares 'il quddiem lejn ir-riżultati tal-ħidma komuni tagħna.

Skillbox jirrakkomanda:

Sors: www.habr.com

Żid kumment