Ịkpọ nchara n'ime awa 24: ahụmịhe mmepe onwe onye

Ịkpọ nchara n'ime awa 24: ahụmịhe mmepe onwe onye

N'isiokwu a, m ga-ekwu banyere ahụmahụ nke onwe m nke ịmepụta obere egwuregwu na Rust. Ọ were ihe dị ka awa 24 iji mepụta ụdị ọrụ (M na-arụkarị ọrụ na mgbede ma ọ bụ na ngwụsị izu). Egwuregwu ahụ adịchaghị agwụ agwụ, mana echere m na ahụmịhe ahụ ga-akwụghachi ụgwọ. Aga m ekekọrịta ihe m mụtara na ụfọdụ ihe m mere mgbe m na-ewu egwuregwu ahụ site na ọkọ.

Skillbox na-atụ aro: Ihe ọmụmụ bara uru nke afọ abụọ "Abụ m onye nrụpụta webụ PRO".

Anyị na -echetara: maka ndị na-agụ Habr niile - ego 10 ruble mgbe ị na-edebanye aha na nkuzi Skillbox ọ bụla site na iji koodu mgbasa ozi Habr.

Gịnị mere ajari?

Ahọọrọ m asụsụ a n'ihi na anụla m ọtụtụ ihe ọma gbasara ya, a na m ahụkwa ka ọ na-ewu ewu na mmepe egwuregwu. Tupu m ede egwuregwu ahụ, enwere m obere ahụmahụ na-emepụta ngwa dị mfe na Rust. Nke a bụ naanị iji nye m echiche nke nnwere onwe mgbe m na-ede egwuregwu ahụ.

Gịnị kpatara egwuregwu ahụ na ụdị egwuregwu?

Ime egwuregwu na-atọ ụtọ! Ọ dị m ka ya bụrụ na enwere ọtụtụ ihe kpatara ya, mana maka ọrụ "ụlọ" m na-ahọrọ isiokwu ndị na-enweghị njikọ chiri anya na ọrụ m mgbe niile. Kedu egwuregwu nke a? Achọrọ m ime ihe dị ka simulator tennis na-ejikọta Cities Skylines, Zoo Tycoon, Prison Architect na tennis n'onwe ya. N'ozuzu, ọ tụgharịrị bụrụ egwuregwu gbasara ụlọ akwụkwọ tenis ebe ndị mmadụ na-abịa igwu egwu.

Ọzụzụ nka

Achọrọ m iji Rust mee ihe, ma amaghị m kpọmkwem ihe mgbakwasị ụkwụ ọ ga-ewe iji malite. Achọghị m ide pikselụ shaders na iji drag-n-dopu, yabụ m na-achọ ihe ngwọta kacha agbanwe agbanwe.

Achọtara m akụrụngwa bara uru m na-ekerịta gị:

Achọpụtara m ọtụtụ igwe egwuregwu Rust, n'ikpeazụ họrọ Piston na ggez. Ahụrụ m ha mgbe m na-arụ ọrụ mbụ. Na njedebe, m họọrọ ggez n'ihi na ọ dị ka ọ dabara adaba maka mmejuputa obere egwuregwu 2D. Nhazi modular nke Piston dị mgbagwoju anya maka onye nrụpụta novice (ma ọ bụ onye na-arụ ọrụ na Rust na nke mbụ).

Egwuregwu egwuregwu

Eji m oge na-eche echiche banyere ihe owuwu nke ọrụ ahụ. Nzọụkwụ mbụ bụ ime "ala", ndị mmadụ na ụlọ tenis. Ndị mmadụ ga-agagharị n'ụlọ ikpe chere. Ndị na-egwu egwuregwu ga-enwerịrị nkà na-akawanye mma ka oge na-aga. Na mgbakwunye, ekwesịrị inwe onye nchịkọta akụkọ na-enye gị ohere ịgbakwunye ndị ọhụrụ na ụlọikpe, mana nke a abụghịzi free.

Ebe m chebachara ihe niile, agara m ọrụ.

Ekere egwuregwu

Mmalite: okirikiri na abstractions

M were ihe atụ si ggez wee nweta okirikiri na ihuenyo. Ijuanya! Ugbu a ụfọdụ abstractions. Echere m na ọ ga-adị mma ịhapụ echiche nke ihe egwuregwu. A ghaghị imegharị ma melite ihe ọ bụla dịka ekwuru ebe a:

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

Mpempe koodu a nyere m ezigbo ndepụta ihe m nwere ike imelite ma nye ya n'otu aka mara mma.

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 dị mkpa n'ihi na ọ nwere ahịrị koodu niile. Eji m obere oge na-ekewa faịlụ ndị ahụ na ịkwalite nhazi ndekọ aha. Nke a bụ ihe ọ dị ka nke a:
akụrụngwa -> ebe a bụ ebe akụ niile dị (onyinyo)
src
- ụlọ ọrụ
- game_object.rs
- okirikiri.rs
- main.rs -> isi loop

Ndị mmadụ, ala na onyonyo

Nzọụkwụ na-esote bụ imepụta ihe egwuregwu mmadụ na ibu ihe onyonyo. Ekwesịrị iwulite ihe niile dabere na taịlị 32 * 32.

Ịkpọ nchara n'ime awa 24: ahụmịhe mmepe onwe onye

Ogige Tenis

Mgbe m mụchara otú ụlọ ịgba tennis dị ka, ekpebiri m ime ha site na taịlị 4 * 2. Na mbụ, ọ ga-ekwe omume ịme ihe oyiyi nke nha a, ma ọ bụ ijikọta taịlị 8 dị iche iche. Ma mgbe ahụ, achọpụtara m na ọ bụ naanị taịlị abụọ pụrụ iche ka achọrọ, nke a bụ ihe kpatara ya.

Na mkpokọta, anyị nwere taịlị abụọ: 1 na 2.

Akụkụ nke ọ bụla nke ụlọ ikpe nwere tile 1 ma ọ bụ tile 2. Enwere ike ịtọ ha ka ọ bụrụ ihe nkịtị ma ọ bụ tụgharịa 180 degrees.

Ịkpọ nchara n'ime awa 24: ahụmịhe mmepe onwe onye

Basic ewu (mgbakọ) mode

Mgbe m jisiri ike nweta nsụgharị nke saịtị, ndị mmadụ na maapụ, achọpụtara m na a chọkwara usoro mgbakọ bụ isi. Ejiri m ya dị ka nke a: mgbe a na-agbanye bọtịnụ ahụ, a na-ahọrọ ihe ahụ, na ịpị na-etinye ya n'ebe achọrọ. Ya mere, bọtịnụ 1 na-enye gị ohere ịhọrọ ụlọ ikpe, na bọtịnụ 2 na-enye gị ohere ịhọrọ onye ọkpụkpọ.

Mana anyị ka kwesịrị icheta ihe 1 na 2 pụtara, yabụ etinyere m eriri waya iji mee ka o doo anya ihe ahọpụtara. Nke a bụ otú ọ dị.

Ịkpọ nchara n'ime awa 24: ahụmịhe mmepe onwe onye

Ajuju nhazi na imeghari

Ugbu a enwere m ọtụtụ ihe egwuregwu: ndị mmadụ, ụlọikpe na ala. Mana ka wireframes wee na-arụ ọrụ, ihe ọ bụla chọrọ ka a gwa ya ma ihe ndị ahụ n'onwe ha nọ na ọnọdụ ngosi, ma ọ bụ na a na-esetịpụ etiti. Nke a adịghị mma nke ukwuu.

Ọ dị m ka ọ dị mkpa ka e chegharịa ihe owuwu ụlọ ahụ n'ụzọ nke na-ekpughe adịghị ike ụfọdụ:

  • Inwe ụlọ ọrụ na-enye ma na-emelite onwe ya bụ nsogbu n'ihi na ụlọ ọrụ ahụ agaghị enwe ike "ịmara" ihe ọ kwesịrị inye - ihe oyiyi na waya;
  • enweghị ngwá ọrụ maka ịgbanwe ihe onwunwe na omume n'etiti ụlọ ọrụ dị iche iche (dịka ọmụmaatụ, ihe onwunwe is_build_mode ma ọ bụ nsụgharị omume). Ọ ga-ekwe omume iji ihe nketa mee ihe, n'agbanyeghị na ọ nweghị ụzọ kwesịrị ekwesị isi mejuputa ya na nchara. Ihe m chọrọ n'ezie bụ nhazi;
  • ihe eji emekọrịta ihe n'etiti ụlọ ọrụ dị mkpa iji kenye ndị mmadụ n'ụlọ ikpe;
  • ụlọ ọrụ ndị ahụ n'onwe ha bụ ngwakọta nke data na mgbagha nke na-esi na njikwa ngwa ngwa pụta.

Emere m nyocha ọzọ wee chọpụta ụkpụrụ ụlọ ECS - Sistemụ akụrụngwa akụrụngwa, nke a na-ejikarị eme egwuregwu. Nke a bụ uru ECS:

  • data na-ekewapụ na mgbagha;
  • mejupụtara kama ihe nketa;
  • data-centric architecture.

ECS ji echiche atọ bụ isi mara:

  • ụlọ ọrụ - ụdị ihe nke njirimara na-ezo aka (ọ nwere ike ịbụ ihe ọkpụkpọ, bọl, ma ọ bụ ihe ọzọ);
  • components - ihe mejupụtara ya bụ ihe mejupụtara ya. Ọmụmaatụ - akụrụngwa na-egosi, ọnọdụ na ndị ọzọ. Ndị a bụ ụlọ nkwakọba ihe data;
  • Sistemu - ha na-eji ma ihe na akụrụngwa, gbakwunyere nwere omume na mgbagha dabere na data a. Otu ihe atụ bụ sistemụ nrụgharị nke na-emegharị ụlọ ọrụ niile nwere ihe nrụpụta ma na-eme ntụgharị.

Mgbe ọ mụchara ya, ọ bịara doo anya na ECS na-edozi nsogbu ndị a:

  • iji okirikiri nhọrọ ukwuu kama ihe nketa iji hazie ụlọ ọrụ n'usoro;
  • iwepụ koodu jumble site na usoro nchịkwa;
  • na-eji usoro dị ka is_build_mode iji dobe mgbagha wayaframe n'otu ebe - na sistemụ nsụgharị.

Nke a bụ ihe mere mgbe emejuputa ECS.

akụrụngwa -> ebe a bụ ebe akụ niile dị (onyinyo)
src
- components
- ọnọdụ.rs
- onye.rs
- tennis_court.rs
- ala.rs
- wayaframe.rs
- mouse_tracked.rs
- akụrụngwa
- òké.rs
- usoro
- nsụgharị.rs
- na-agbanwe agbanwe.rs
- utils.rs
- world_factory.rs -> ọrụ ụlọ ọrụ ụwa
- main.rs -> isi loop

Anyị na-ekenye ndị mmadụ n'ụlọ ikpe

ECS emewo ka ndụ dịkwuo mfe. Ugbu a enwere m ụzọ a haziri ahazi iji tinye data na ụlọ ọrụ wee tinye mgbagha dabere na data ahụ. Na nke a, n'aka nke ya, mere ka o kwe omume ịhazi nkesa nke ndị mmadụ n'etiti ụlọikpe.

Kedu ihe m mere:

  • agbakwunyere data gbasara ụlọikpe ekenyere onye;
  • agbakwunyere data gbasara ndị ekesara na TennisCourt;
  • agbakwunyere CourtChoosingSystem, nke na-enye gị ohere inyocha ndị mmadụ na ụlọikpe, chọpụta ụlọikpe dịnụ ma kesaa ndị egwuregwu;
  • gbakwunyere PersonMovementSystem, nke na-achọ ndị e kenyere n'ụlọ ikpe, ma ọ bụrụ na ha anọghị ebe ahụ, na-eziga ndị mmadụ ebe ha kwesịrị ịnọ.

Ịkpọ nchara n'ime awa 24: ahụmịhe mmepe onwe onye

Na-agbakọta elu

Ịrụ egwuregwu a dị mfe na-atọ m ụtọ. Ọzọkwa, enwere m obi ụtọ na m ji nchara dee ya, n'ihi na:

  • Nchara na-enye gị ihe ị chọrọ;
  • ọ nwere akwụkwọ mara mma, ajari mara mma;
  • agbanwe agbanwe dị jụụ;
  • ịkwesighi ịmalite cloning, iṅomi ma ọ bụ omume ndị ọzọ yiri ya, nke m na-emekarị na C ++;
  • Nhọrọ dị nnọọ mfe iji na ijikwa njehie nke ọma;
  • Ọ bụrụ na enwere ike ịchịkọta ọrụ ahụ, mgbe ahụ 99% nke oge ọ na-arụ ọrụ, yana kpọmkwem dị ka o kwesịrị. Echere m na ozi njehie ndị nchịkọta ihe kacha mma m hụworo.

Mmepe egwuregwu na Rust ka na-amalite. Mana enweelarị obodo kwụsiri ike na nnukwu obodo na-arụ ọrụ imeghe onye ọ bụla nchara. Ya mere, m na-ele anya n'ọdịnihu nke asụsụ na nchekwube, na-atụ anya nsonaazụ nke ọrụ anyị.

Skillbox na-atụ aro:

isi: www.habr.com

Tinye a comment