Maén Rust dina 24 jam: pangalaman ngembangkeun pribadi

Maén Rust dina 24 jam: pangalaman ngembangkeun pribadi

Dina artikel ieu kuring bakal ngobrol ngeunaan pangalaman pribadi kuring ngeunaan ngembangkeun kaulinan leutik di Rust. Butuh waktu kira-kira 24 jam pikeun nyieun vérsi anu tiasa dianggo (kalobaannana damel di soré atanapi dina sabtu minggu). Kaulinan tebih ti rengse, tapi kuring pikir pangalaman bakal rewarding. Kuring bakal ngabagikeun naon anu kuring pelajari sareng sababaraha observasi anu kuring lakukeun nalika ngawangun kaulinan ti mimiti.

Skillbox nyarankeun: Kursus praktis dua taun "Kuring pamekar wéb PRO".

Kami ngingetan: pikeun sakabéh pamiarsa "Habr" - diskon 10 rubles nalika enrolling dina sagala Tangtu Skillbox ngagunakeun "Habr" kode promosi.

Naha Rust?

Kuring milih basa ieu kusabab kuring nguping seueur hal anu saé ngeunaan éta sareng kuring ningali éta janten langkung populer dina pamekaran kaulinan. Saméméh nulis kaulinan, kuring kungsi saeutik pangalaman ngamekarkeun aplikasi basajan dina Rust. Ieu ngan cukup pikeun masihan kuring rasa kabebasan bari nulis kaulinan.

Naha kaulinan sarta jenis kaulinan?

Nyieun kaulinan téh senang! Abdi ngarepkeun aya deui alesan, tapi pikeun proyék "imah" kuring milih topik anu henteu raket pisan sareng padamelan biasa kuring. Kaulinan naon ieu? Abdi hoyong ngadamel sapertos simulator ténis anu ngagabungkeun Cities Skylines, Zoo Tycoon, Arsitek Penjara sareng ténis sorangan. Sacara umum, tétéla éta kaulinan ngeunaan akademi ténis dimana jalma datangna maén.

palatihan teknis

Abdi hoyong nganggo Rust, tapi kuring henteu terang persis sabaraha dasar anu diperyogikeun pikeun ngamimitian. Abdi henteu hoyong nyerat shaders piksel sareng nganggo drag-n-drop, janten kuring milarian solusi anu paling fleksibel.

Kuring mendakan sumber anu mangpaat anu kuring bagikeun sareng anjeun:

Kuring ngajajah sababaraha mesin kaulinan Rust, pamustunganana milih Piston na ggez. Kuring datang di sakuliah aranjeunna bari digawé dina proyék saméméhna. Tungtungna, kuring milih ggez sabab sigana langkung cocog pikeun ngalaksanakeun kaulinan 2D leutik. Struktur modular piston rumit teuing pikeun pamekar novice (atanapi jalma anu damel sareng Rust pikeun kahiji kalina).

Struktur kaulinan

Kuring spent sababaraha waktos pamikiran ngeunaan arsitéktur proyék. Léngkah munggaran nyaéta ngadamel "tanah", jalma sareng lapangan ténis. Jalma kudu mindahkeun sabudeureun pangadilan jeung antosan. Pamaén kudu boga kaahlian nu ngaronjatkeun kana waktu. Tambih Deui, kudu aya redaktur nu ngidinan Anjeun pikeun nambahkeun jalma anyar jeung pangadilan, tapi ieu geus euweuh bébas.

Saatos mikir sadayana, kuring kedah damel.

Nyiptakeun kaulinan

Mimiti: Bunderan sareng Abstraksi

Kuring nyandak conto ti ggez sareng ngagaduhan bunderan dina layar. Hebat! Ayeuna sababaraha abstraksi. Kuring panginten bakal langkung saé pikeun ngasingkeun ideu tina objék kaulinan. Unggal obyék kudu rendered tur diropéa sakumaha nyatakeun di dieu:

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

sapotong kode ieu masihan kuring daptar nice objék nu kuring bisa ngamutahirkeun tur ngajadikeun dina loop sarua nice.

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 perlu sabab ngandung sakabéh garis kode. Kuring nyéépkeun waktos sakedik misahkeun file sareng ngaoptimalkeun struktur diréktori. Ieu anu katingali saatos éta:
sumberdaya -> ieu dimana sadaya aset aya (gambar)
src
- éntitas
- game_object.rs
- bunderan.rs
- main.rs -> loop utama

Jalma, floors jeung gambar

Lengkah saterusna nyaéta nyieun objék kaulinan Jalma jeung gambar beban. Sagalana kudu diwangun dina dasar 32 * 32 Kotak.

Maén Rust dina 24 jam: pangalaman ngembangkeun pribadi

Gelar ténis

Saatos diajar kumaha rupa lapangan ténis, kuring mutuskeun pikeun ngadamelna tina ubin 4 * 2. Mimitina, éta tiasa ngadamel gambar ukuran ieu, atanapi ngahijikeun 8 ubin anu misah. Tapi teras kuring sadar yén ngan ukur dua ubin unik anu diperyogikeun, sareng ieu sababna.

Dina total urang gaduh dua ubin sapertos: 1 sareng 2.

Unggal bagian tina pangadilan diwangun ku ubin 1 atawa kotak 2. Éta bisa diteundeun kaluar salaku normal atawa dibalikkeun 180 derajat.

Maén Rust dina 24 jam: pangalaman ngembangkeun pribadi

Konstruksi dasar (assembly) mode

Sanggeus kuring junun ngahontal Rendering loka, jalma jeung peta, Kuring sadar yén mode assembly dasar ogé diperlukeun. Kuring dilaksanakeun saperti kieu: nalika tombol dipencet, obyék dipilih, sarta klik nempatkeun eta di tempat nu dipikahoyong. Ku kituna, tombol 1 ngidinan Anjeun pikeun milih pangadilan, sarta tombol 2 ngidinan Anjeun pikeun milih pamaén.

Tapi urang masih kudu apal naon 1 jeung 2 hartina, jadi kuring ditambahkeun wireframe a sangkan jelas nu obyek dipilih. Ieu naon eta Sigana mah.

Maén Rust dina 24 jam: pangalaman ngembangkeun pribadi

Arsitéktur sarta refactoring patarosan

Ayeuna kuring boga sababaraha objék kaulinan: jalma, pangadilan tur floors. Tapi supados wireframes tiasa dianggo, unggal éntitas obyék kedah diwartosan naha objékna sorangan dina modeu démo, atanapi naha pigura ngan saukur digambar. Ieu teu pisan merenah.

Éta sigana kuring yén arsitéktur kedah dipikirkeun deui ku cara anu ngungkabkeun sababaraha watesan:

  • Ngabogaan éntitas anu ngajadikeun sareng ngamutahirkeun sorangan mangrupikeun masalah sabab éntitas éta moal tiasa "nyaho" naon anu sakuduna didamel - gambar sareng wireframe;
  • kurangna alat pikeun tukeur sipat jeung kabiasaan antara éntitas individu (Contona, sipat is_build_mode atawa kabiasaan rendering). Ieu bakal mungkin migunakeun warisan, sanajan euweuh cara ditangtoskeun pikeun nerapkeun eta dina Rust. Naon Nyaan diperlukeun éta perenah nu;
  • alat pikeun interaksi antara éntitas diperlukeun pikeun napelkeun jalma ka pangadilan;
  • éntitas sorangan éta campuran data jeung logika anu gancang kaluar kontrol.

Kuring ngalakukeun sababaraha panalungtikan deui sareng mendakan arsitéktur ECS - Sistim komponén éntitas, nu ilahar dipaké dina kaulinan. Ieu mangrupikeun kauntungan tina ECS:

  • data dipisahkeun tina logika;
  • komposisi tinimbang warisan;
  • arsitéktur data-centric.

ECS dicirikeun ku tilu konsép dasar:

  • éntitas - jinis obyék anu dirujuk ku identifier (bisa waé pamaén, bal, atanapi anu sanés);
  • komponén - entitas diwangun ku aranjeunna. Conto - komponén rendering, lokasi jeung sajabana. Ieu gudang data;
  • sistem - aranjeunna ngagunakeun duanana objék sareng komponenana, tambah ngandung kabiasaan jeung logika anu dumasar kana data ieu. Hiji conto nyaéta sistem rendering nu iterates ngaliwatan sakabéh éntitas kalawan komponén Rendering sarta ngalakukeun Rendering.

Saatos diajar éta, janten écés yén ECS ngarengsekeun masalah-masalah ieu:

  • ngagunakeun perenah tinimbang warisan pikeun ngatur éntitas sacara sistematis;
  • nyingkirkeun jumble kode ngaliwatan sistem kontrol;
  • ngagunakeun métode kawas is_build_mode pikeun ngajaga logika wireframe di tempat anu sarua - dina sistem Rendering.

Ieu naon anu lumangsung sanggeus ngalaksanakeun ECS.

sumberdaya -> ieu dimana sadaya aset aya (gambar)
src
- komponén
-posisi.rs
- jalma.rs
- tennis_court.rs
- lanté.rs
- wireframe.rs
- mouse_tracked.rs
- sumberdaya
— mouse.rs
- sistem
- rendering.rs
- konstanta.rs
- utils.rs
— world_factory.rs -> fungsi pabrik dunya
- main.rs -> loop utama

Urang napelkeun jalma ka pangadilan

ECS geus nyieun hirup leuwih gampang. Ayeuna kuring ngagaduhan cara sistematis pikeun nambihan data kana éntitas sareng nambihan logika dumasar kana data éta. Sareng ieu, kahareupna ngamungkinkeun pikeun ngatur sebaran jalma diantara pangadilan.

Naon anu kuring lakukeun:

  • data ditambahkeun ngeunaan pangadilan ditugaskeun ka Jalma;
  • data ditambahkeun ngeunaan jalma disebarkeun ka TennisCourt;
  • ditambahkeun CourtChoosingSystem, nu ngidinan Anjeun pikeun nganalisis jalma jeung pangadilan, ngadeteksi pangadilan sadia tur ngadistribusikaeun pamaén ka aranjeunna;
  • ditambahkeun a PersonMovementSystem, nu néangan jalma ditugaskeun ka pangadilan, sarta lamun maranéhna teu aya, lajeng ngirimkeun jalma dimana maranéhna kudu.

Maén Rust dina 24 jam: pangalaman ngembangkeun pribadi

summing up

Nyaan ngarasakeun gawé dina kaulinan basajan ieu. Sumawona, kuring bungah yén kuring nganggo Rust pikeun nyeratna, sabab:

  • Karat masihan anjeun naon anu anjeun peryogikeun;
  • eta boga dokuméntasi unggulan, Karat cukup elegan;
  • konsistensi téh tiis;
  • anjeun teu kudu Resort ka kloning, nyalin atawa lampah sarupa séjénna, nu kuring mindeng dipigawé dina C ++;
  • Pilihan pisan gampang ngagunakeun jeung nanganan kasalahan kacida alusna;
  • Upami proyék éta tiasa disusun, teras 99% waktos éta tiasa dianggo, sareng leres-leres kedahna. Jigana seratan kasalahan compiler anu pangalusna Kuring geus katempo.

Ngembangkeun kaulinan di Rust ngan dimimitian. Tapi parantos aya komunitas anu stabil sareng lumayan ageung damel pikeun muka Rust ka sadayana. Ku kituna, kuring ningali kahareup basa kalawan optimisme, ngarepkeun hasil gawé babarengan urang.

Skillbox nyarankeun:

sumber: www.habr.com

Tambahkeun komentar