Muter Rust sajrone 24 jam: pengalaman pangembangan pribadi

Muter Rust sajrone 24 jam: pengalaman pangembangan pribadi

Ing artikel iki aku bakal pirembagan bab pengalaman pribadi ngembangaken game cilik ing Rust. Butuh udakara 24 jam kanggo nggawe versi sing bisa digunakake (aku biasane kerja ing wayah sore utawa akhir minggu). Game iki adoh saka rampung, nanging aku pengalaman bakal maringi hadiah. Aku bakal nuduhake apa aku sinau lan sawetara pengamatan aku digawe nalika mbangun game saka ngeruk.

Skillbox nyaranake: Kursus praktis rong taun "Aku pengembang web PRO".

Kita ngelingake: kanggo kabeh sing maca "Habr" - diskon 10 rubel nalika ndhaptar kursus Skillbox nggunakake kode promosi "Habr".

Kenapa Rust?

Aku milih basa iki amarga aku wis krungu akèh iku apik bab iku lan aku weruh iku dadi liyane lan liyane populer ing pembangunan game. Sadurunge nulis game, aku wis sethitik pengalaman ngembangaken aplikasi prasaja ing Rust. Iki mung cukup kanggo menehi kula rasa bebas nalika nulis game.

Apa game lan apa jenis game?

Nggawe game iku nyenengake! Muga-muga ana alesan liyane, nanging kanggo proyek "omah" aku milih topik sing ora raket banget karo karya biasa. Game apa iki? Aku pengin nggawe kaya simulator tenis sing nggabungake Cities Skylines, Zoo Tycoon, Prison Architect lan tenis dhewe. Umumé, dadi game babagan akademi tenis ing ngendi wong main.

Latihan teknis

Aku wanted kanggo nggunakake Rust, nanging aku ora ngerti persis carane akeh dhasar bakal njupuk kanggo miwiti. Aku ora pengin nulis shaders piksel lan nggunakake drag-n-drop, mula aku nggoleki solusi sing paling fleksibel.

Aku nemokake sumber daya migunani sing aku bareng karo sampeyan:

Aku njelajah sawetara mesin game Rust, wekasanipun milih Piston lan ggez. Aku ketemu wong-wong mau nalika nggarap proyek sadurunge. Ing pungkasan, aku milih ggez amarga katon luwih cocok kanggo ngleksanakake game 2D cilik. Struktur modular piston rumit banget kanggo pangembang pemula (utawa wong sing sepisanan nggarap Rust).

Struktur game

Aku ngenteni sawetara wektu mikir babagan arsitektur proyek kasebut. Langkah pisanan yaiku nggawe "tanah", wong lan lapangan tenis. Wong kudu ngubengi pengadilan lan ngenteni. Pemain kudu duwe katrampilan sing saya tambah suwe. Kajaba iku, kudu ana editor sing ngidini sampeyan nambah wong anyar lan pengadilan, nanging iki ora gratis.

Sawise mikir kabeh, aku kudu kerja.

Nggawe game

Wiwitan: Lingkaran lan Abstraksi

Aku njupuk conto saka ggez lan entuk bunder ing layar. Apik banget! Saiki sawetara abstraksi. Aku panginten iku bakal becik kanggo abstrak adoh saka idea saka obyek game. Saben obyek kudu diwenehi lan dianyari kaya sing kasebut ing kene:

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

Piece saka kode iki menehi kula dhaftar becik obyek sing aku bisa nganyari lan nerjemahake ing daur ulang padha becik.

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 amarga ngemot kabeh baris kode. Aku ngenteni sawetara wektu kanggo misahake file lan ngoptimalake struktur direktori. Iki sing katon sawise iku:
sumber daya -> iki ngendi kabeh aset (gambar)
src
- entitas
— game_object.rs
- bunder.rs
— main.rs -> loop utama

Wong, jubin lan gambar

Langkah sabanjure yaiku nggawe obyek game Person lan mbukak gambar. Kabeh kudu dibangun ing basis saka 32 * 32 kothak.

Muter Rust sajrone 24 jam: pengalaman pangembangan pribadi

Pengadilan tenis

Sawise sinau kaya apa lapangan tenis, aku mutusake nggawe ubin 4 * 2. Kaping pisanan, bisa nggawe gambar kanthi ukuran iki, utawa nggabungake 8 kothak sing kapisah. Nanging banjur aku nyadari yen mung rong kothak unik sing dibutuhake, lan iki sebabe.

Secara total, kita duwe rong kothak kasebut: 1 lan 2.

Saben bagean saka pengadilan kasusun saka kothak 1 utawa kothak 2. Padha bisa glethakaken metu minangka normal utawa flipped 180 derajat.

Muter Rust sajrone 24 jam: pengalaman pangembangan pribadi

Konstruksi dhasar (assembly) mode

Sawise aku bisa entuk rendering situs, wong lan peta, aku ngerti yen mode perakitan dhasar uga dibutuhake. Aku dileksanakake kaya iki: nalika tombol dipencet, obyek dipilih, lan klik ing panggonan sing dikarepake. Dadi, tombol 1 ngidini sampeyan milih pengadilan, lan tombol 2 ngidini sampeyan milih pemain.

Nanging kita isih kudu ngelingi apa tegese 1 lan 2, mula aku nambahake wireframe supaya jelas obyek sing dipilih. Iki kaya apa.

Muter Rust sajrone 24 jam: pengalaman pangembangan pribadi

Pitakonan arsitektur lan refactoring

Saiki aku duwe sawetara obyek game: wong, pengadilan lan jubin. Nanging supaya wireframes bisa, saben entitas obyek kudu diwenehi apa obyek piyambak ing mode demo, utawa pigura mung digambar. Iki ora trep banget.

Kayane aku arsitektur kudu dipikir maneh kanthi cara sing nuduhake sawetara watesan:

  • Duwe entitas sing nerjemahake lan nganyari dhewe dadi masalah amarga entitas kasebut ora bakal bisa "ngerti" apa sing kudu ditindakake - gambar lan wireframe;
  • lack saka alat kanggo ijol-ijolan sifat lan prilaku antarane entitas individu (contone, property is_build_mode utawa prilaku Rendering). Sampeyan bisa nggunakake warisan, sanajan ora ana cara sing tepat kanggo ngetrapake ing Rust. Apa aku pancene needed tata letak;
  • alat kanggo interaksi antarane entitas dibutuhake kanggo nemtokake wong menyang pengadilan;
  • entitas dhewe padha campuran data lan logika sing cepet metu saka kontrol.

Aku nindakake riset liyane lan nemokake arsitektur ECS - Sistem Komponen Entitas, sing umum digunakake ing game. Mangkene keuntungan saka ECS:

  • data dipisahake saka logika;
  • komposisi tinimbang warisan;
  • arsitektur data-centric.

ECS ditondoi dening telung konsep dhasar:

  • entitas - jinis obyek sing diarani pengenal (bisa dadi pemain, bal, utawa liya-liyane);
  • komponen - entitas digawe saka wong-wong mau. Conto - komponen rendering, lokasi lan liya-liyane. Iki minangka gudang data;
  • sistem - padha nggunakake loro obyek lan komponen, plus ngemot prilaku lan logika sing adhedhasar data iki. Conto yaiku sistem rendering sing ngulang kabeh entitas kanthi komponen rendering lan nindakake rendering.

Sawise sinau, dadi jelas yen ECS ngrampungake masalah ing ngisor iki:

  • nggunakake tata letak tinimbang warisan kanggo ngatur entitas kanthi sistematis;
  • nyingkirake jumble kode liwat sistem kontrol;
  • nggunakake cara kaya is_build_mode kanggo njaga logika wireframe ing panggonan sing padha - ing sistem rendering.

Iki kedadeyan sawise ngetrapake ECS.

sumber daya -> iki ngendi kabeh aset (gambar)
src
- komponen
-posisi.rs
- wong.rs
- lapangan tenis.rs
- lantai.rs
- wireframe.rs
— mouse_tracked.rs
- sumber daya
—mouse.rs
- sistem
- rendering.rs
- konstanta.rs
- utils.rs
— world_factory.rs -> fungsi pabrik donya
— main.rs -> loop utama

We nemtokake wong menyang pengadilan

ECS wis nggawe urip luwih gampang. Saiki aku duwe cara sistematis kanggo nambah data menyang entitas lan nambah logika adhedhasar data kasebut. Lan iki, kanthi mangkono, bisa ngatur distribusi wong ing antarane pengadilan.

Apa sing wis daklakoni:

  • data ditambahaké bab pengadilan diutus kanggo Person;
  • ditambahake data babagan wong sing disebarake menyang TennisCourt;
  • ditambahaké CourtChoosingSystem, sing ngijini sampeyan kanggo njelasno wong lan pengadilan, ndeteksi pengadilan kasedhiya lan disebaraké pemain kanggo wong-wong mau;
  • ditambahaké PersonMovementSystem, kang katon kanggo wong diutus ing pengadilan, lan yen padha ora ana, banjur ngirim wong ngendi padha kudu.

Muter Rust sajrone 24 jam: pengalaman pangembangan pribadi

Nyimpul

Aku seneng banget nggarap game sing prasaja iki. Kajaba iku, aku bungah yen aku nggunakake Rust kanggo nulis, amarga:

  • Rust menehi apa sing perlu;
  • wis dokumentasi banget, Rust cukup elegan;
  • konsistensi punika kelangan;
  • sampeyan ora kudu Resor kanggo kloning, Nyalin utawa tumindak liyane padha, kang asring aku ing C ++;
  • Pilihan gampang banget kanggo nggunakake lan nangani kesalahan banget;
  • yen proyek bisa dikompilasi, banjur 99% wektu kerjane, lan persis kaya sing dikarepake. Aku pesen kesalahan compiler sing paling apik aku wis katon.

Pangembangan game ing Rust mung diwiwiti. Nanging wis ana komunitas sing stabil lan cukup gedhe sing digunakake kanggo mbukak Rust kanggo kabeh wong. Pramila, kula ningali masa depan basa kanthi optimis, ngajeng-ajeng asil kerja sama kita.

Skillbox nyaranake:

Source: www.habr.com

Add a comment