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.
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:
Għadna nilagħbu — lista ta' elementi Rust meħtieġa għall-iżvilupp tal-logħob;
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.
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.
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.
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.
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.