Di 24 demjimêran de Rust lîstin: ezmûna pêşkeftina kesane

Di 24 demjimêran de Rust lîstin: ezmûna pêşkeftina kesane

Di vê gotarê de ez ê li ser ezmûna xweya kesane ya pêşxistina lîstikek piçûk li Rust biaxivim. Nêzîkî 24 demjimêran kişandin ku guhertoyek xebatê biafirînim (ez bi piranî êvaran an dawiya hefteyê dixebitim). Lîstik ji qedandinê dûr e, lê ez difikirim ku ezmûn dê xelatdar be. Ez ê tiştên ku ez fêr bûm û hin çavdêriyên ku min di dema çêkirina lîstikê de ji nû ve çêkirine parve bikim.

Skillbox pêşniyar dike: Kursa pratîkî ya du-salî "Ez pêşdebirek malperê PRO me".

Em bînin bîra xwe: ji bo hemî xwendevanên "Habr" - dema ku hûn beşdarî qursek Skillbox-ê bi karanîna koda danasînê ya "Habr" têne qeyd kirin 10 rubleyan dakêşin.

Çima Rust?

Min ev ziman hilbijart ji ber ku min li ser wî gelek tiştên baş bihîstine û ez dibînim ku ew di pêşkeftina lîstikê de her ku diçe populertir dibe. Berî nivîsandina lîstikê, min hindik ezmûna pêşkeftina serîlêdanên hêsan ên li Rust hebû. Ev tenê bes bû ku di dema nivîsandina lîstikê de hestek azadiyê bide min.

Çima lîstik û lîstikek çawa ye?

Çêkirina lîstikan kêfxweş e! Xwezî zêdetir sedem hebin, lê ji bo projeyên "malê" ez mijarên ku ji nêz ve bi xebata min a birêkûpêk re ne girêdayî ne hildibijêrim. Ev çi lîstik e? Min dixwest tiştek mîna simulatorek tenîsê çêbikim ku Cities Skylines, Zoo Tycoon, Prison Architect û tenîsê bixwe. Bi gelemperî, derket holê ku lîstikek li ser akademiya tenîsê ye ku mirov tê de bilîzin.

Perwerdehiya teknîkî

Min dixwest Rust bikar bînim, lê min bi rastî nizanibû ku ew ê çiqas zemîn bigire da ku dest pê bike. Min nexwest ku şaderên pixel binivîsim û drag-n-drop bikar bînim, ji ber vê yekê ez li çareseriyên herî maqûl digeriyam.

Min çavkaniyên kêrhatî dît ku ez bi we re parve dikim:

Min gelek motorên lîstika Rust keşif kir, di dawiyê de Piston û ggez hilbijart. Dema ku ez li ser projeyek berê dixebitim rastî wan hatim. Di dawiyê de, min ggez hilbijart ji ber ku ew ji bo pêkanîna lîstikek piçûk 2D maqûltir xuya bû. Struktura modular a Piston ji bo pêşdebirek nûjen (an kesê ku yekem car bi Rust re dixebite) pir tevlihev e.

Struktura lîstikê

Min demekê li ser mîmariya projeyê fikirîm. Pêngava yekem çêkirina "erd", mirov û kortên tenîsê ye. Divê mirov li dora dadgehan bigerin û li bendê bin. Divê lîstikvan xwedî jêhatîbûnên ku bi demê re çêtir dibin. Zêdeyî, pêdivî ye ku edîtorek hebe ku destûrê dide we ku hûn kes û dadgehên nû lê zêde bikin, lê ev êdî ne belaş e.

Li ser her tiştî fikirîm, ez ketim xebatê.

Afirandina lîstikê

Destpêk: Çêrok û Abstractions

Min mînakek ji ggez girt û li ser ekranê çemberek derket. Pirxweş! Niha hinek abstractions. Min fikirîn ku ew ê xweş be ku meriv ji ramana tiştek lîstikê dûr bixe. Pêdivî ye ku her tişt wekî ku li vir hatî destnîşan kirin were pêşkêş kirin û nûve kirin:

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

Vê perçeya kodê navnîşek xweş a tiştên ku ez dikarim nûve bikim û bi rengek wekhev xweş bidim min.

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 pêwîst e ji ber ku ew hemî rêzikên kodê dihewîne. Min demek piçûk ji veqetandina pelan û xweşbînkirina avahiya pelrêça derbas kir. Ya ku piştî wê xuya bû ev e:
çavkanî -> ev e ku hemî hebûn (wêne)
src
- sazî
- game_object.rs
- çember.rs
— main.rs -> çerxa sereke

Mirov, qat û wêne

Pêngava paşîn ev e ku meriv tiştek lîstikek Kesek biafirîne û wêneyan bar bike. Divê her tişt li ser bingeha 32 * 32 tilên ava kirin.

Di 24 demjimêran de Rust lîstin: ezmûna pêşkeftina kesane

Dadgehên tenîsê

Piştî lêkolîna kortên tenîsê çawa xuya dikin, min biryar da ku ez wan ji 4*2 pîlan çêkim. Di destpêkê de, gengaz bû ku wêneyek bi vê mezinahiyê were çêkirin, an jî 8 tixûbên cuda li hev werin danîn. Lê dûv re min fêm kir ku tenê du tilên bêhempa hewce ne, û li vir çima ye.

Bi tevayî du pelikên me hene: 1 û 2.

Her beşê dîwanê ji pêlika 1 an pîvaza 2 pêk tê. Ew dikarin wekî normal werin danîn an jî 180 dereceyan werin rijandin.

Di 24 demjimêran de Rust lîstin: ezmûna pêşkeftina kesane

Moda avakirina bingehîn (civîn).

Piştî ku min karî xwe bigihînim pêşkêşkirina malper, mirov û nexşeyan, min fêm kir ku moda kombûna bingehîn jî hewce ye. Min ew bi vî rengî pêk anî: gava ku bişkojk tê pêl kirin, tişt tê hilbijartin, û klîk wê li cîhê xwestinê bi cih dike. Ji ber vê yekê, bişkojka 1 dihêle hûn dadgehek hilbijêrin, û bişkojka 2 dihêle hûn lîstikvanek hilbijêrin.

Lê dîsa jî pêdivî ye ku em bînin bîra xwe ka 1 û 2 tê çi wateyê, ji ber vê yekê min çarçoveyek têl lê zêde kir da ku zelal bikim ka kîjan tişt hatî hilbijartin. Ev e ku ew xuya dike.

Di 24 demjimêran de Rust lîstin: ezmûna pêşkeftina kesane

Pirsên mîmarî û refactoring

Naha gelek tiştên min ên lîstikê hene: mirov, dadgeh û qat. Lê ji bo ku têlframes bixebite, pêdivî ye ku ji her sazûmanek objektê re were gotin ka ew bi xwe di moda xwenîşandanê de ne, an jî çarçoveyek bi hêsanî hatî kişandin. Ev ne pir rehet e.

Ji min re xuya bû ku pêdivî ye ku mîmarî bi rengek ku hin sînoran eşkere bike ji nû ve were fikirîn:

  • Hebûna sazûmanek ku xwe pêşkêş dike û nûve dike pirsgirêkek e ji ber ku ew sazî dê nikaribe "bizane" ku tê xwestin çi pêşkêş bike - wêneyek û çarçoveyek têl;
  • nebûna amûrek ji bo danûstendina taybetmendî û tevgerê di navbera pêkhateyên takekesî de (mînak, taybetmendiya is_build_mode an renderkirina tevgerê). Dê gengaz be ku mîras bikar bînin, her çend rêyek rast tune ku wê di Rust de bicîh bike. Ya ku ez bi rastî hewce bûm sêwirana bû;
  • Amûrek ji bo danûstendina di navbera saziyan de hewce bû ku mirov li dadgehan bidin;
  • sazûman bi xwe tevliheviyek dane û mantiqê bûn ku zû ji kontrolê derketin.

Min lêkolînek din kir û mîmarî keşif kir ECS - Pergala Pêkhatina Entity, ku bi gelemperî di lîstikan de tê bikaranîn. Li vir feydeyên ECS hene:

  • dane ji mantiqê tê veqetandin;
  • pêkhatî li şûna mîrasê;
  • mîmariya data-navendî.

ECS ji hêla sê têgehên bingehîn ve tête diyar kirin:

  • entities - celebê tiştê ku nasnav jê re vedibêje (dibe ku lîstikvanek, topek an tiştek din be);
  • pêkhate - pêkhate ji wan pêk tên. Mînak - ravekirina pêkhate, cih û yên din. Ev embarên daneyan in;
  • pergal - ew hem tişt û hem hêmanan bikar tînin, hem jî behre û mentiqê ku li ser bingeha vê daneyê têne çêkirin hene. Nimûne pergalek renderkirinê ye ku di nav hemî pêkhateyên bi pêkhateyên renderkirinê de dubare dike û renderkirinê dike.

Piştî xwendina wê, diyar bû ku ECS pirsgirêkên jêrîn çareser dike:

  • bikaranîna layout li şûna mîrasê ji bo birêxistinkirina saziyan bi pergalî;
  • bi pergalên kontrolê ve ji tevliheviya kodê xilas bibin;
  • rêbazên mîna is_build_mode bikar tîne da ku mantiqa wireframe li heman cîhî bimîne - di pergala renderkirinê de.

Tiştê ku piştî bicihanîna ECS qewimî ev e.

çavkanî -> ev e ku hemî hebûn (wêne)
src
- pêkhateyên
- helwest.rs
- kes.rs
- tennis_court.rs
- qat.rs
- wireframe.rs
- mouse_tracked.rs
- çavkaniyên
- mişk.rs
- sîstemên
- rendering.rs
- berdewam.rs
- utils.rs
— world_factory.rs -> fonksiyonên kargeha cîhanê
— main.rs -> çerxa sereke

Em mirovan tayînî dadgehan dikin

ECS jiyan hêsantir kiriye. Naha min rêyek sîstematîk hebû ku ez daneyan li saziyan zêde bikim û li ser bingeha wê daneyê mentiqê lê zêde bikim. Û vê yekê jî, îmkana organîzekirina belavkirina mirovan di nav dadgehan de kir.

Min çi kiriye:

  • Daneyên der barê dadgehên tayînkirî de ji Kesê re zêde kirin;
  • Daneyên li ser mirovên belavbûyî li TennisCourt zêde kirin;
  • CourtChoosingSystem zêde kir, ku dihêle hûn mirov û dadgehan analîz bikin, dadgehên berdest kifş bikin û lîstikvanan li wan belav bikin;
  • PersonMovementSystemek zêde kir, ku li kesên ku li dadgehan hatine peywirdarkirin digere, û heke ew ne li wir bin, wê hingê mirovan dişîne cihê ku hewce dike.

Di 24 demjimêran de Rust lîstin: ezmûna pêşkeftina kesane

Hilberîn

Ez bi rastî ji xebata li ser vê lîstika hêsan kêfxweş bûm. Wekî din, ez kêfxweş im ku min Rust ji bo nivîsandina wê bikar anî, ji ber ku:

  • Rust tiştê ku hûn hewce ne dide we;
  • belgeyên wê yên hêja hene, Rust pir xweşik e;
  • domdarî xweş e;
  • hûn ne hewce ne ku hûn serî li klonkirin, kopîkirin an kiryarên din ên mîna wan bidin, yên ku min pir caran di C ++ de kir;
  • Vebijêrk pir hêsan têne bikar anîn û xeletiyan pir baş digirin;
  • heke proje karibe were berhev kirin, wê hingê 99% ji dema ku ew dixebite, û tam wekî ku divê. Ez difikirim ku peyamên xeletiya berhevkar çêtirîn in ku min dîtiye.

Pêşveçûna lîstikê li Rust tenê dest pê dike. Lê jixwe civakek bi îstîqrar û pir mezin heye ku dixebitin ku Rust ji her kesî re vekin. Ji ber vê yekê ez bi geşbînî li paşeroja ziman dinêrim, li hêviya encamên xebata me ya hevpar im.

Skillbox pêşniyar dike:

Source: www.habr.com

Add a comment