Ti ndun Rust ni awọn wakati 24: iriri idagbasoke ti ara ẹni

Ti ndun Rust ni awọn wakati 24: iriri idagbasoke ti ara ẹni

Ninu nkan yii Emi yoo sọrọ nipa iriri ti ara ẹni ti idagbasoke ere kekere kan ni Rust. O gba to wakati 24 lati ṣẹda ẹya iṣẹ kan (Mo ṣiṣẹ pupọ julọ ni awọn irọlẹ tabi ni awọn ipari ose). Awọn ere jẹ jina lati pari, sugbon mo ro pe iriri yoo jẹ funlebun. Emi yoo pin ohun ti Mo kọ ati diẹ ninu awọn akiyesi ti Mo ṣe lakoko ṣiṣe ere lati ibere.

Skillbox ṣe iṣeduro: Ọdun meji iṣẹ ikẹkọ "Mo jẹ oludasile wẹẹbu PRO".

A leti: fun gbogbo awọn oluka ti "Habr" - ẹdinwo ti 10 rubles nigbati o forukọsilẹ ni eyikeyi iṣẹ-ẹkọ Skillbox nipa lilo koodu ipolowo “Habr”.

Kí nìdí Ipata?

Mo yan ede yii nitori pe Mo ti gbọ ọpọlọpọ awọn ohun ti o dara nipa rẹ ati pe Mo rii pe o di olokiki siwaju ati siwaju sii ni idagbasoke ere. Ṣaaju ki o to kọ ere naa, Mo ni iriri diẹ ti o dagbasoke awọn ohun elo ti o rọrun ni Rust. Eyi jẹ to lati fun mi ni oye ti ominira lakoko kikọ ere naa.

Kini idi ti ere naa ati iru ere wo?

Ṣiṣe awọn ere jẹ igbadun! Mo fẹ pe awọn idi diẹ sii wa, ṣugbọn fun awọn iṣẹ akanṣe “ile” Mo yan awọn akọle ti ko ni ibatan si iṣẹ deede mi. Ere wo ni eyi? Mo fẹ lati ṣe ohun kan bi apere tẹnisi ti o daapọ Cities Skylines, Zoo Tycoon, Sẹwọn ayaworan ati tẹnisi ara. Ni gbogbogbo, o yipada lati jẹ ere kan nipa ile-ẹkọ tẹnisi kan nibiti awọn eniyan wa lati ṣere.

Ikẹkọ imọ-ẹrọ

Mo fẹ lati lo Rust, ṣugbọn Emi ko mọ ni pato iye ipilẹ ti yoo gba lati bẹrẹ. Emi ko fẹ lati kọ awọn shaders pixel ati lo drag-n-drop, nitorinaa Mo n wa awọn ojutu to rọ julọ.

Mo ri awọn orisun to wulo ti Mo pin pẹlu rẹ:

Mo ti ṣawari ọpọlọpọ awọn ẹrọ ere ipata, nikẹhin yan Pisitini ati ggez. Mo ti pade wọn nigba ti ṣiṣẹ lori kan ti tẹlẹ ise agbese. Ni ipari, Mo yan ggez nitori pe o dara julọ fun imuse ere 2D kekere kan. Eto apọjuwọn Piston jẹ eka pupọ fun olupilẹṣẹ alakobere (tabi ẹnikan ti o n ṣiṣẹ pẹlu Rust fun igba akọkọ).

Ere be

Mo ti lo diẹ ninu awọn akoko lerongba nipa awọn faaji ti ise agbese. Igbesẹ akọkọ ni lati ṣe "ilẹ", eniyan ati awọn agbala tẹnisi. Awọn eniyan ni lati gbe ni ayika awọn kootu ati duro. Awọn oṣere gbọdọ ni awọn ọgbọn ti o ni ilọsiwaju lori akoko. Pẹlupẹlu, o yẹ ki o jẹ olootu ti o fun ọ laaye lati ṣafikun eniyan tuntun ati awọn kootu, ṣugbọn eyi kii ṣe ọfẹ mọ.

Lehin ro ohun gbogbo nipasẹ, Mo ni lati sise.

Ere ẹda

Ibẹrẹ: Awọn iyika ati Awọn Abstractions

Mo si mu ohun apẹẹrẹ lati ggez ati ki o ni kan Circle loju iboju. Iyanu! Bayi diẹ ninu awọn abstractions. Mo ro pe yoo jẹ ohun ti o dara lati ṣe aibikita kuro ninu imọran ohun ere kan. Ohun kọọkan gbọdọ ṣe ati imudojuiwọn bi a ti sọ nibi:

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

Nkan koodu yii fun mi ni atokọ ti o wuyi ti awọn nkan ti MO le ṣe imudojuiwọn ati ṣe ni lupu ti o wuyi deede.

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 jẹ dandan nitori pe o ni gbogbo awọn ila ti koodu ninu. Mo lo akoko diẹ ni yiya sọtọ awọn faili ati iṣapeye ilana ilana. Eyi ni ohun ti o dabi lẹhin iyẹn:
awọn orisun -> eyi ni ibiti gbogbo awọn ohun-ini wa (awọn aworan)
src
- awọn nkan
- game_object.rs
- Circle.rs
- main.rs -> akọkọ lupu

Eniyan, ipakà ati awọn aworan

Igbesẹ ti o tẹle ni lati ṣẹda ohun ere Eniyan ati awọn aworan fifuye. Ohun gbogbo yẹ ki o kọ lori ipilẹ ti awọn alẹmọ 32 * 32.

Ti ndun Rust ni awọn wakati 24: iriri idagbasoke ti ara ẹni

Tẹnisi ile ejo

Lẹhin kikọ ẹkọ kini awọn ile tẹnisi dabi, Mo pinnu lati ṣe wọn lati awọn alẹmọ 4 * 2. Ni ibẹrẹ, o ṣee ṣe lati ṣe aworan ti iwọn yii, tabi lati fi awọn alẹmọ lọtọ 8 papọ. Ṣugbọn lẹhinna Mo rii pe awọn alẹmọ alailẹgbẹ meji nikan ni a nilo, ati pe idi niyi.

Lapapọ a ni iru awọn alẹmọ meji: 1 ati 2.

Kọọkan apakan ti awọn ejo oriširiši tile 1 tabi tile 2. Wọn le wa ni gbe jade bi deede tabi flipped 180 iwọn.

Ti ndun Rust ni awọn wakati 24: iriri idagbasoke ti ara ẹni

Ipilẹ ikole (apejọ) mode

Lẹhin ti Mo ti ṣakoso lati ṣaṣeyọri ṣiṣe awọn aaye, eniyan ati awọn maapu, Mo rii pe ipo apejọ ipilẹ tun nilo. Mo ṣe imuse rẹ bii eyi: nigbati o ba tẹ bọtini naa, a yan ohun naa, ati tẹ tẹ si ibi ti o fẹ. Nitorina, bọtini 1 gba ọ laaye lati yan ẹjọ kan, ati bọtini 2 gba ọ laaye lati yan ẹrọ orin kan.

Ṣugbọn a tun nilo lati ranti kini 1 ati 2 tumọ si, nitorinaa Mo ṣafikun okun waya kan lati jẹ ki o ye ohun ti o yan. Eyi ni ohun ti o dabi.

Ti ndun Rust ni awọn wakati 24: iriri idagbasoke ti ara ẹni

Architecture ati refactoring ibeere

Bayi Mo ni ọpọlọpọ awọn nkan ere: eniyan, awọn kootu ati awọn ilẹ ipakà. Ṣugbọn ni ibere fun awọn fireemu waya lati ṣiṣẹ, nkan kọọkan nilo lati sọ boya awọn ohun elo funrararẹ wa ni ipo ifihan, tabi boya firẹemu kan ya ni irọrun. Eyi ko rọrun pupọ.

O dabi fun mi pe faaji nilo lati tunro ni ọna ti o ṣafihan diẹ ninu awọn idiwọn:

  • Nini nkan ti o ṣe atunṣe ati imudojuiwọn funrararẹ jẹ iṣoro nitori pe nkan yẹn kii yoo ni anfani lati “mọ” ohun ti o yẹ ki o ṣe - aworan ati fireemu waya kan;
  • aini ohun elo fun paarọ awọn ohun-ini ati ihuwasi laarin awọn nkan kọọkan (fun apẹẹrẹ, ohun-ini is_build_mode tabi ṣiṣe ihuwasi). Yoo ṣee ṣe lati lo ogún, botilẹjẹpe ko si ọna to dara lati ṣe imuse rẹ ni Rust. Ohun ti mo ti gan nilo wà ni akọkọ;
  • irinṣẹ kan fun ibaraenisepo laarin awọn ile-iṣẹ ni a nilo lati fi awọn eniyan ranṣẹ si awọn kootu;
  • awọn nkan ara wọn jẹ adalu data ati ọgbọn ti o yara kuro ni iṣakoso.

Mo ti ṣe diẹ ninu awọn iwadi ati awari awọn faaji ECS - Nkankan paati System, eyi ti o ti wa ni commonly lo ninu awọn ere. Eyi ni awọn anfani ti ECS:

  • data ti wa ni niya lati kannaa;
  • tiwqn dipo ogún;
  • data-centric faaji.

ECS jẹ afihan nipasẹ awọn imọran ipilẹ mẹta:

  • awọn nkan - iru ohun ti idanimọ n tọka si (o le jẹ ẹrọ orin, bọọlu, tabi nkan miiran);
  • irinše - oro ibi ti wa ni ṣe soke ti wọn. Apeere - paati Rendering, awọn ipo ati awọn miiran. Awọn wọnyi ni data warehouses;
  • awọn ọna ṣiṣe - wọn lo awọn nkan mejeeji ati awọn paati, pẹlu ihuwasi ati ọgbọn ti o da lori data yii. Ohun apẹẹrẹ ni a Rendering eto ti o iterates nipasẹ gbogbo awọn nkan elo pẹlu Rendering irinše ati ki o ṣe awọn Rendering.

Lẹhin ikẹkọ rẹ, o han gbangba pe ECS yanju awọn iṣoro wọnyi:

  • lilo ipalẹmọ dipo ogún lati ṣeto awọn nkan ni ọna ṣiṣe;
  • yiyọ koodu jumble nipasẹ awọn eto iṣakoso;
  • lilo awọn ọna bii is_build_mode lati tọju ọgbọn waya fireemu ni aaye kanna - ni eto ṣiṣe.

Eyi ni ohun ti o ṣẹlẹ lẹhin imuse ECS.

awọn orisun -> eyi ni ibiti gbogbo awọn ohun-ini wa (awọn aworan)
src
- irinše
-ipo.rs
- eniyan.rs
- tẹnisi_court.rs
- pakà.rs
- wireframe.rs
- mouse_tracked.rs
- oro
— eku.rs
- awọn ọna šiše
- Rendering.rs
- awọn iduro.rs
- utils.rs
- world_factory.rs -> aye factory awọn iṣẹ
- main.rs -> akọkọ lupu

A yan eniyan si awọn kootu

ECS ti ṣe igbesi aye rọrun. Bayi Mo ni ọna eto lati ṣafikun data si awọn nkan ati ṣafikun ọgbọn ti o da lori data yẹn. Ati pe eyi, ni ọna, jẹ ki o ṣee ṣe lati ṣeto pinpin awọn eniyan laarin awọn ile-ẹjọ.

Kini mo ti ṣe:

  • data ti a ṣafikun nipa awọn ile-ẹjọ ti a sọtọ si Eniyan;
  • data ti a ṣafikun nipa awọn eniyan ti a pin si TennisCourt;
  • ti ṣafikun CourtChoosingSystem, eyiti o fun ọ laaye lati ṣe itupalẹ awọn eniyan ati awọn kootu, ṣawari awọn kootu ti o wa ati pinpin awọn oṣere si wọn;
  • ṣafikun PersonMovementSystem, eyiti o wa awọn eniyan ti a yàn si awọn kootu, ati pe ti wọn ko ba wa nibẹ, lẹhinna firanṣẹ eniyan si ibiti wọn nilo lati wa.

Ti ndun Rust ni awọn wakati 24: iriri idagbasoke ti ara ẹni

Summing soke

Mo gbadun pupọ lati ṣiṣẹ lori ere ti o rọrun yii. Pẹlupẹlu, inu mi dun pe Mo lo Rust lati kọ, nitori:

  • Ipata fun ọ ni ohun ti o nilo;
  • o ni o ni o tayọ iwe, Ipata jẹ ohun yangan;
  • aitasera jẹ itura;
  • o ko ni lati lo si cloning, didaakọ tabi awọn iṣe miiran ti o jọra, eyiti Mo nigbagbogbo ṣe ni C ++;
  • Awọn aṣayan jẹ rọrun pupọ lati lo ati mu awọn aṣiṣe dara julọ;
  • ti iṣẹ akanṣe naa ba ni anfani lati ṣajọ, lẹhinna 99% ti akoko ti o ṣiṣẹ, ati ni deede bi o ti yẹ. Mo ro pe awọn ifiranṣẹ aṣiṣe alakojo ni o dara ju Mo ti sọ ri.

Idagbasoke ere ni ipata ti n bẹrẹ. Ṣugbọn iduroṣinṣin tẹlẹ wa ati agbegbe iṣẹtọ ti o tobi ti n ṣiṣẹ lati ṣii Rust si gbogbo eniyan. Nitorina, Mo wo ojo iwaju ti ede pẹlu ireti, n reti awọn esi ti iṣẹ-ṣiṣe ti o wọpọ wa.

Skillbox ṣe iṣeduro:

orisun: www.habr.com

Fi ọrọìwòye kun