Bermain Rust dalam 24 jam: pengalaman pembangunan peribadi

Bermain Rust dalam 24 jam: pengalaman pembangunan peribadi

Dalam artikel ini saya akan bercakap tentang pengalaman peribadi saya membangunkan permainan kecil di Rust. Ia mengambil masa kira-kira 24 jam untuk mencipta versi yang berfungsi (saya kebanyakannya bekerja pada waktu malam atau pada hujung minggu). Permainan masih jauh dari selesai, tetapi saya fikir pengalaman itu akan memberi ganjaran. Saya akan berkongsi apa yang saya pelajari dan beberapa pemerhatian yang saya buat semasa membina permainan dari awal.

Skillbox mengesyorkan: Kursus praktikal dua tahun "Saya seorang pembangun web PRO".

Kami mengingatkan: untuk semua pembaca "Habr" - diskaun sebanyak 10 rubel apabila mendaftar dalam mana-mana kursus Skillbox menggunakan kod promosi "Habr".

Kenapa Karat?

Saya memilih bahasa ini kerana saya telah mendengar banyak perkara yang baik mengenainya dan saya melihatnya menjadi semakin popular dalam pembangunan permainan. Sebelum menulis permainan, saya mempunyai sedikit pengalaman membangunkan aplikasi mudah dalam Rust. Ini sudah cukup untuk memberi saya rasa kebebasan semasa menulis permainan.

Mengapa permainan dan jenis permainan?

Membuat permainan adalah menyeronokkan! Saya harap ada lebih banyak sebab, tetapi untuk projek "rumah" saya memilih topik yang tidak terlalu berkait rapat dengan kerja biasa saya. Permainan apakah ini? Saya ingin membuat sesuatu seperti simulator tenis yang menggabungkan Cities Skylines, Zoo Tycoon, Prison Architect dan tenis itu sendiri. Secara umum, ia ternyata adalah permainan tentang akademi tenis di mana orang ramai datang untuk bermain.

Latihan teknikal

Saya mahu menggunakan Rust, tetapi saya tidak tahu berapa banyak kerja asas yang diperlukan untuk bermula. Saya tidak mahu menulis shader piksel dan menggunakan drag-n-drop, jadi saya sedang mencari penyelesaian yang paling fleksibel.

Saya menemui sumber berguna yang saya kongsi dengan anda:

Saya meneroka beberapa enjin permainan Rust, akhirnya memilih Piston dan ggez. Saya terserempak dengan mereka semasa membuat projek sebelum ini. Akhirnya, saya memilih ggez kerana ia kelihatan lebih sesuai untuk melaksanakan permainan 2D yang kecil. Struktur modular omboh terlalu kompleks untuk pembangun pemula (atau seseorang yang bekerja dengan Rust buat kali pertama).

Struktur permainan

Saya meluangkan sedikit masa memikirkan tentang seni bina projek itu. Langkah pertama ialah membuat "tanah", orang dan gelanggang tenis. Orang ramai perlu bergerak di sekitar mahkamah dan menunggu. Pemain mesti mempunyai kemahiran yang meningkat dari semasa ke semasa. Selain itu, mesti ada editor yang membenarkan anda menambah orang dan mahkamah baharu, tetapi ini tidak lagi percuma.

Setelah memikirkan segala-galanya, saya mula bekerja.

Penciptaan permainan

Permulaan: Bulatan dan Abstraksi

Saya mengambil contoh daripada ggez dan mendapat bulatan pada skrin. Hebat! Sekarang beberapa abstraksi. Saya fikir ia adalah baik untuk mengasingkan diri daripada idea objek permainan. Setiap objek mesti diberikan dan dikemas kini seperti yang dinyatakan di sini:

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

Sekeping kod ini memberi saya senarai objek yang bagus yang boleh saya kemas kini dan berikan dalam gelung yang sama bagus.

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 adalah perlu kerana ia mengandungi semua baris kod. Saya meluangkan sedikit masa untuk memisahkan fail dan mengoptimumkan struktur direktori. Inilah rupanya selepas itu:
sumber -> di sinilah semua aset berada (imej)
src
- entiti
β€” game_object.rs
- bulatan.rs
β€” main.rs -> gelung utama

Orang, lantai dan imej

Langkah seterusnya ialah mencipta objek permainan Orang dan memuatkan imej. Semuanya harus dibina berdasarkan jubin 32*32.

Bermain Rust dalam 24 jam: pengalaman pembangunan peribadi

Gelanggang tenis

Selepas mengkaji rupa gelanggang tenis, saya memutuskan untuk membuatnya daripada jubin 4*2. Pada mulanya, adalah mungkin untuk membuat imej sebesar ini, atau untuk menyusun 8 jubin berasingan. Tetapi kemudian saya menyedari bahawa hanya dua jubin unik diperlukan, dan inilah sebabnya.

Secara keseluruhan kami mempunyai dua jubin sedemikian: 1 dan 2.

Setiap bahagian gelanggang terdiri daripada jubin 1 atau jubin 2. Mereka boleh dibentangkan seperti biasa atau dibalikkan 180 darjah.

Bermain Rust dalam 24 jam: pengalaman pembangunan peribadi

Mod pembinaan asas (pemasangan).

Selepas saya berjaya mencapai pemaparan tapak, orang dan peta, saya menyedari bahawa mod pemasangan asas juga diperlukan. Saya melaksanakannya seperti ini: apabila butang ditekan, objek dipilih, dan klik meletakkannya di tempat yang dikehendaki. Jadi, butang 1 membolehkan anda memilih gelanggang, dan butang 2 membolehkan anda memilih pemain.

Tetapi kita masih perlu mengingati maksud 1 dan 2, jadi saya menambah wireframe untuk menjelaskan objek yang dipilih. Beginilah rupanya.

Bermain Rust dalam 24 jam: pengalaman pembangunan peribadi

Soalan seni bina dan pemfaktoran semula

Sekarang saya mempunyai beberapa objek permainan: orang, gelanggang dan lantai. Tetapi untuk membolehkan rangka wayar berfungsi, setiap entiti objek perlu diberitahu sama ada objek itu sendiri berada dalam mod tunjuk cara atau sama ada bingkai dilukis semata-mata. Ini tidak begitu mudah.

Nampaknya kepada saya seni bina itu perlu difikirkan semula dengan cara yang mendedahkan beberapa batasan:

  • Mempunyai entiti yang membuat dan mengemas kini sendiri adalah masalah kerana entiti itu tidak akan dapat "mengetahui" perkara yang sepatutnya diberikan - imej dan rangka wayar;
  • kekurangan alat untuk menukar sifat dan tingkah laku antara entiti individu (contohnya, sifat is_build_mode atau pemaparan tingkah laku). Ia mungkin untuk menggunakan warisan, walaupun tidak ada cara yang betul untuk melaksanakannya dalam Rust. Apa yang saya perlukan adalah susun atur;
  • alat untuk interaksi antara entiti diperlukan untuk menugaskan orang ke mahkamah;
  • entiti itu sendiri adalah gabungan data dan logik yang cepat hilang kawalan.

Saya melakukan beberapa kajian lagi dan menemui seni bina ECS - Sistem Komponen Entiti, yang biasa digunakan dalam permainan. Berikut adalah kelebihan ECS:

  • data dipisahkan daripada logik;
  • komposisi dan bukannya warisan;
  • seni bina berpusatkan data.

ECS dicirikan oleh tiga konsep asas:

  • entiti - jenis objek yang dirujuk oleh pengecam (ia boleh menjadi pemain, bola, atau sesuatu yang lain);
  • komponen - entiti terdiri daripada mereka. Contoh - komponen rendering, lokasi dan lain-lain. Ini adalah gudang data;
  • sistem - mereka menggunakan kedua-dua objek dan komponen, serta mengandungi tingkah laku dan logik yang berdasarkan data ini. Contohnya ialah sistem rendering yang berulang melalui semua entiti dengan komponen rendering dan melakukan rendering.

Selepas mengkajinya, menjadi jelas bahawa ECS menyelesaikan masalah berikut:

  • menggunakan reka letak dan bukannya warisan untuk menyusun entiti secara sistematik;
  • menyingkirkan campur tangan kod melalui sistem kawalan;
  • menggunakan kaedah seperti is_build_mode untuk mengekalkan logik rangka wayar di tempat yang sama - dalam sistem pemaparan.

Inilah yang berlaku selepas melaksanakan ECS.

sumber -> di sinilah semua aset berada (imej)
src
- komponen
β€”kedudukan.rs
β€” orang.rs
β€” gelanggang_tenis.rs
- lantai.rs
- rangka wayar.rs
β€” mouse_tracked.rs
- sumber
β€”mouse.rs
- sistem
β€” rendering.rs
- pemalar.rs
β€” utils.rs
β€” world_factory.rs -> fungsi kilang dunia
β€” main.rs -> gelung utama

Kami menugaskan orang ke mahkamah

ECS telah menjadikan hidup lebih mudah. Sekarang saya mempunyai cara yang sistematik untuk menambah data kepada entiti dan menambah logik berdasarkan data itu. Dan ini, seterusnya, memungkinkan untuk mengatur pengagihan orang di kalangan mahkamah.

Apa yang telah saya lakukan:

  • menambah data tentang mahkamah yang diberikan kepada Orang;
  • menambah data tentang orang yang diedarkan ke Gelanggang Tenis;
  • tambah CourtChoosingSystem, yang membolehkan anda menganalisis orang dan gelanggang, mengesan gelanggang yang tersedia dan mengedarkan pemain kepada mereka;
  • menambah PersonMovementSystem, yang mencari orang yang ditugaskan ke mahkamah, dan jika mereka tidak berada di sana, kemudian menghantar orang ke tempat yang mereka perlukan.

Bermain Rust dalam 24 jam: pengalaman pembangunan peribadi

Merumuskan

Saya sangat seronok mengerjakan permainan mudah ini. Selain itu, saya gembira kerana saya menggunakan Rust untuk menulisnya, kerana:

  • Karat memberi anda apa yang anda perlukan;
  • ia mempunyai dokumentasi yang sangat baik, Rust agak elegan;
  • konsistensi adalah sejuk;
  • anda tidak perlu menggunakan pengklonan, penyalinan atau tindakan lain yang serupa, yang sering saya lakukan dalam C++;
  • Pilihan sangat mudah digunakan dan mengendalikan ralat dengan baik;
  • jika projek itu dapat disusun, maka 99% masa ia berfungsi, dan tepat seperti yang sepatutnya. Saya rasa mesej ralat pengkompil adalah yang terbaik yang pernah saya lihat.

Pembangunan permainan di Rust baru bermula. Tetapi sudah ada komuniti yang stabil dan agak besar yang berusaha untuk membuka Rust kepada semua orang. Oleh itu, saya melihat masa depan bahasa itu dengan optimis, menantikan hasil kerja bersama kami.

Skillbox mengesyorkan:

Sumber: www.habr.com

Tambah komen